首页 > 解决方案 > 如何让程序知道一个点是在一条线的右边还是左边?

问题描述

我想让我的程序知道点 X 是在穿过 A 和 B 的线的右侧还是左侧这真的很有帮助,但是一旦我改变了线条的角度,它就会停止工作并开始给我一条以 0° 为标题的线条的结果

我使用很少有 0° 的线条

我还尝试使用方程式旋转我所拥有的点,但仍然给我相同的结果,我试图在 Unity Engine 中实现我想要的结果,这样我就可以在实际跳转到原始程序之前可视化我在做什么

    float Ax = Stop.transform.position.x;
    float Ay = Stop.transform.position.y;

    float Bx = Ref.transform.position.x;
    float By = Ref.transform.position.y;

    float X = Wheel.transform.position.x;
    float Y = Wheel.transform.position.y;

    float x = X * Cos(Gate.transform.rotation.eulerAngles.y) - Y * Sin(Gate.transform.rotation.eulerAngles.y);
    float y = Y * Cos(Gate.transform.rotation.eulerAngles.y) + X * Sin(Gate.transform.rotation.eulerAngles.y);

    float position = System.Math.Sign((Bx - Ax) * (Y - Ay) - (By - Ay) * (X - Ax));

    if (position > 0)
    {
        lg.Log("Left");
    }
    else
    {
        lg.Log("Right");
    }

我希望程序无论线的标题是什么以及 A 和 B 和 X 之间的距离是多少,程序都会向右或向左返回,但它只会给我直线 0° 标题线的结果,这很奇怪,因为 B 点未对齐Y轴:|

标签: c#math2d

解决方案


您可以首先找出直线的方程:

float m = (By - Ay) / (Bx - Ax);
float n = (Ay * Bx + By * Ax) / (Bx - Ax);

直线方程为:

y = mx + n

这只是实现了维基百科的直线方程。

现在你可以很容易地找出一个点是在这条线的上方还是下方。只需将您的 x 坐标插入该线,然后您就可以在该点获得该线的 y 坐标。现在将该 y 值与您的 y 坐标进行比较,您就知道它是高于还是低于。根据您定义的线条方向,您现在还可以判断它是线条的左侧还是右侧。

但是,一条精确的垂直线将不起作用,因为它的斜率将接近无穷大。


推荐阅读