如何只从该路径中的两个点计算路径法线上的两个点?

时间:2017-10-02 21:42:45

标签: java math coordinates

对标题感到抱歉,这真的不是一个好主意。

所以我为我的游戏创造了一条积分路径。这条路径是"随机"生成所以我永远不知道它看起来像我所知道的是它永远不会跨越自己。

我要做的是沿着该路径采取任何一点,并在两侧法线向量的方向上计算距离线正好10个单位的2个点。一个例子是我在双车道道路的中心有车道标记的点。我想计算车道标记上任何给定点的两个路缘的位置。

我试图计算正常坡度,我认为我得到了正确的结果,但我不知道怎么说" 10点单位离开这条线"。

如果您需要一些额外信息,我很乐意提供。

有人要求代码:

//These are set elsewhere
float x1;
float y1;
float x2;
float y2;
float Distance = 10;

基本上,这就是我想要做的,但在代码中:

((x1+x2)/2, (y1+y2)/2) +- Distance * (-(y2-y1), (x2-x1)) / sqrt((x2-x1)^2+(y2-y1)^2)

1 个答案:

答案 0 :(得分:0)

我不能因为我在其他地方找到它而受到赞扬,但这是我试图解决的等式的实现。我将发帖,以防其他人在将来偶然发现这件事。

请注意:这是非常优化的,变量名称有点不准确(特别是左/右),但这是一个概念证明,我将在一个更大的项目中实现。

            //Calculate left
            float left_x1 = current.x;
            float left_y1 = current.y;
            float left_x2 = previous.x;
            float left_y2 = previous.y;
            float D = 30;

            float left_dx = left_x1-left_x2;
            float left_dy = left_y1-left_y2;
            float left_dist = (float) Math.sqrt(left_dx*left_dx + left_dy*left_dy);
            left_dx /= left_dist;
            left_dy /= left_dist;
            float left_x3 = left_x1 + D * left_dy;
            float left_y3 = left_y1 - D * left_dx;
            float left_x4 = left_x1 - D * left_dy;
            float left_y4 = left_y1 + D * left_dx;

            //Calculate right
            float right_x1 = previous.x;
            float right_y1 = previous.y;
            float right_x2 = old.x;
            float right_y2 = old.y;

            float right_dx = right_x1-right_x2;
            float right_dy = right_y1-right_y2;
            float dist = (float) Math.sqrt(right_dx*right_dx + right_dy*right_dy);
            right_dx /= dist;
            right_dy /= dist;
            float right_x3 = right_x1 + D * right_dy;
            float right_y3 = right_y1 - D * right_dx;
            float right_x4 = right_x1 - D * right_dy;
            float right_y4 = right_y1 + D * right_dx;

            //Draw bounds
            shapeRenderer.line(right_x3, right_y3, left_x3, left_y3);
            shapeRenderer.line(right_x4, right_y4, left_x4, left_y4);