计算给定起始点、角度和长度时的目标点,朝相反方向前进。

3
我有一个角度、线段长度和起点,想要计算目标点以将我的对象移动到这里。我正在遵循这篇文章和其他一些文章: cocos2d calculate destination point given start point, angle and distance 问题:对于第一象限和第四象限,它给出了正确的角度。但是对于第二象限和第三象限,它朝着完全相反的方向前进。我无法找出问题所在。这张图片可能会让它更清晰:

enter image description here

绿色箭头显示我的意图方向,红色箭头显示实际移动方向。

到目前为止,我的代码如下:

    float m = (targetPosition.y - initialPosition.y) / (targetPosition.x - initialPosition.x);
    angle = atan (m) * 180 / PI;
    int lineLength = 200;
    float radiansAngle = CC_DEGREES_TO_RADIANS(angle);

    Vec2 endPoint;
    endPoint.y = sinf(radiansAngle) * lineLength + initialPosition.y;
    endPoint.x = cosf(radiansAngle) * lineLength + initialPosition.x;
2个回答

2
请注意,在每种失败情况下,红色和绿色向量具有相同的m,因此代码无法猜测您想要哪一个
您可以编写一些代码来检测象限,并相应地添加或减去π。或者只需使用atan2

ata2也不起作用。我是这样做的:float xDiff = targetPosition.x - initialPosition.x; float yDiff = targetPosition.y - targetPosition.y; return atan2(yDiff, xDiff) * 180 / PI; - Nargis
@Nargis atan2 是有效的。请检查您自己的错误,并考虑在您的语言中 atan2 返回的范围是 0..2Pi 还是 -Pi..Pi。 - MBo

1
我认为您的问题与正切函数的周期性有关。您需要计算您所在的象限。
我之前制作了一个类似的东西,但是针对openscad有一点不同。您可能可以根据自己的需要进行调整。我突出显示了相关的行。我使用asin,但是类似的原则也适用。
module ql (x1,y1,x2,y2,w,thickness=2){
  length=sqrt(pow((x1-x2),2)+pow((y1-y2),2));
  //Next line corrects the angle for quadrant
  ang=((x2-x1)<0)?180-asin((y2-y1)/length):asin((y2-y1)/length);
  translate([x1,y1,0]){
    rotate([0,0,ang]){
      translate([0,-w/2,0]){
        scale([length,w,thickness]){
          cube(1);
        }
      }
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接