【问题标题】:Calculating target point given start point, angle and length GOING TO OPPOSITE DIRECTION计算给定起点、角度和长度的目标点
【发布时间】:2016-06-25 23:34:27
【问题描述】:

我已经给出了角度、线长和起点,我想计算目标点以在此处移动我的对象。我正在关注这篇文章和其他一些帖子:

cocos2d calculate destination point given start point, angle and distance

问题:对于第一象限和第四象限,它给了我正确的角度。但是对于第二象限和第三象限,它的方向完全相反。我无法弄清楚问题。这张图片可能会很清楚:

绿色箭头表示我的预期方向,红色箭头表示实际去向。

到目前为止我的代码:

    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;

【问题讨论】:

    标签: c++ geometry cocos2d-x swipe angle


    【解决方案1】:

    请注意,在每个失败案例中,红色和绿色向量具有相同的m,因此代码无法猜测您指的是哪个

    您可以编写更多代码来检测象限,并相应地加减 π。或者直接使用atan2

    【讨论】:

    • ata2 也不起作用。我确实喜欢这个 float xDiff = targetPosition.x - initialPosition.x;浮动 yDiff = targetPosition.y - targetPosition.y;返回 atan2(yDiff, xDiff) * 180 / PI;
    • @Nargis atan2 确实有效。检查您自己的错误并考虑atan2 在您的语言中返回的范围(0..2Pi 或 -Pi..Pi)
    【解决方案2】:

    我认为您的问题在于 tan 函数的周期性。你需要计算你在哪个象限。

    我不久前制作了类似的东西,但对于 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);
            }
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-12-27
      • 2023-03-10
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      相关资源
      最近更新 更多