计算线的终点不起作用
Calculating end point of line not working
我有两个矩形,一个角显示一条线,我希望第二个的位置是第一个的终点。
线的原点是起点,我可以通过函数获取角度(我正在使用 SFML 库 defining/displaying 矩形)。
代码的第一部分如下所示,我对其进行了测试,它可以正常工作:
// Make two lines(constructor arguments are width/height)
sf::RectangleShape line1 = sf::RectangleShape(1, 10);
sf::RectangleShape line2 = sf::RectangleShape(1, 10);
// Rotate lines(angle in DEG), and set origin to the middle point
line1.setRotation(30);
line2.setRotation(10);
line1.setOrigin(0.5, 0);
line2.setOrigin(0.5, 0);
下面是出现问题的部分。我尝试使用 cos() 和 sin() 函数来计算第二行的新位置,但是它们最终完全在其他地方。
// get angle and convert to RAD, get length (also tested, works as intended)
float angle = M_PI/180 * line1.getRotation;
float length = line1.getSize().y;
// set position of first line to end of second line
line2.setPosition(cos(angle) * length, sin(angle) * length);
我做错了什么?就我对三角函数的理解而言,一切都应该是正确的。角度正确,长度也正确。我真的不知道为什么这不起作用。
您正在创建角度为 0 的直线:
这是因为width
是1
,height
是10
,原点是(0.5, 0),注意这个例子显示的是y
向下增加,而不是向上增加。
但是您使用的数学方法是像这样以 0 角计算终点:
这是因为 x
等于 cos(0) * length
,等于 1 * length
,y 等于 sin(0) * length
,等于 0 * length
,等于 0
, 因此终点在 (length, 0) 向右。
解决方案是要么改变数学,要么改变线条,使它们在不同角度都相同。
这是一个使线条水平而不是垂直的解决方案:
// Make two lines(constructor arguments are width/height)
sf::RectangleShape line1 = sf::RectangleShape({ 10, 1 });
sf::RectangleShape line2 = sf::RectangleShape({ 10, 1 });
// Rotate lines(angle in DEG), and set origin to the middle point
line1.setRotation(90 + 30);
line2.setRotation(90 + 10);
line1.setOrigin(0, 0.5);
line2.setOrigin(0, 0.5);
// get angle and convert to RAD, get length (also tested, works as intended)
float angle = M_PI / 180 * line1.getRotation();
float length = line1.getSize().x;
// set position of first line to end of second line
line2.setPosition(cos(angle) * length, sin(angle) * length);
这里是一个改变数学的解决方案:
// set position of first line to end of second line
line2.setPosition(-sin(angle) * length, cos(angle) * length);
这会产生以下结果,原点标记为红色,y 轴向下:
我有两个矩形,一个角显示一条线,我希望第二个的位置是第一个的终点。
线的原点是起点,我可以通过函数获取角度(我正在使用 SFML 库 defining/displaying 矩形)。
代码的第一部分如下所示,我对其进行了测试,它可以正常工作:
// Make two lines(constructor arguments are width/height)
sf::RectangleShape line1 = sf::RectangleShape(1, 10);
sf::RectangleShape line2 = sf::RectangleShape(1, 10);
// Rotate lines(angle in DEG), and set origin to the middle point
line1.setRotation(30);
line2.setRotation(10);
line1.setOrigin(0.5, 0);
line2.setOrigin(0.5, 0);
下面是出现问题的部分。我尝试使用 cos() 和 sin() 函数来计算第二行的新位置,但是它们最终完全在其他地方。
// get angle and convert to RAD, get length (also tested, works as intended)
float angle = M_PI/180 * line1.getRotation;
float length = line1.getSize().y;
// set position of first line to end of second line
line2.setPosition(cos(angle) * length, sin(angle) * length);
我做错了什么?就我对三角函数的理解而言,一切都应该是正确的。角度正确,长度也正确。我真的不知道为什么这不起作用。
您正在创建角度为 0 的直线:
这是因为width
是1
,height
是10
,原点是(0.5, 0),注意这个例子显示的是y
向下增加,而不是向上增加。
但是您使用的数学方法是像这样以 0 角计算终点:
这是因为 x
等于 cos(0) * length
,等于 1 * length
,y 等于 sin(0) * length
,等于 0 * length
,等于 0
, 因此终点在 (length, 0) 向右。
解决方案是要么改变数学,要么改变线条,使它们在不同角度都相同。
这是一个使线条水平而不是垂直的解决方案:
// Make two lines(constructor arguments are width/height)
sf::RectangleShape line1 = sf::RectangleShape({ 10, 1 });
sf::RectangleShape line2 = sf::RectangleShape({ 10, 1 });
// Rotate lines(angle in DEG), and set origin to the middle point
line1.setRotation(90 + 30);
line2.setRotation(90 + 10);
line1.setOrigin(0, 0.5);
line2.setOrigin(0, 0.5);
// get angle and convert to RAD, get length (also tested, works as intended)
float angle = M_PI / 180 * line1.getRotation();
float length = line1.getSize().x;
// set position of first line to end of second line
line2.setPosition(cos(angle) * length, sin(angle) * length);
这里是一个改变数学的解决方案:
// set position of first line to end of second line
line2.setPosition(-sin(angle) * length, cos(angle) * length);
这会产生以下结果,原点标记为红色,y 轴向下: