找到一条线的交点

时间:2013-03-26 22:28:06

标签: c# math geometry unity3d

所以我一直在试着这个相对简单的算法。我不确定我的代码中有什么问题但是我没有得到它们实际交叉的交叉点。

我正在使用Unity3D,我试图找到两条线相交的点,在x,z平面上,但不在x,y平面上。我假设适用于x,y的算法适用于x,z;

我的代码:

Vector3 thisPoint1 = thisCar.position + (2 * thisCar.forward);
Vector3 thisPoint2 = thisCar.position + (20 * thisCar.forward);

Debug.DrawLine(thisPoint1, thisPoint2, Color.white, 2);

Vector3 otherPoint1 = threateningCar.position + (2 * threateningCar.forward);
Vector3 otherPoint2 = threateningCar.position + (20 * threateningCar.forward);

Debug.DrawLine(otherPoint1, otherPoint2, Color.white, 2);

float A1 = thisPoint2.z - thisPoint1.z;
float B1 = thisPoint1.x - thisPoint2.x;
float C1 = A1 * thisPoint1.x + B1 * thisPoint1.z;

float A2 = otherPoint2.z - otherPoint1.z;
float B2 = otherPoint1.x - otherPoint2.x;
float C2 = A2 * otherPoint1.z + B2 * otherPoint1.z;

float det = A1 * B2 - A2 * B1;

float x = (B2 * C1 - B1 * C2) / det;
float z = (A1 * C2 - A2 * C1) / det;

return new Vector3(x, this.transform.position.y, z);

任何人都可以帮忙指出我做错了什么吗?

thisCar.forwardthreateningCar.forward通常是[0,0,1], [0,0,-1][1,0,0], [-1,0,0]

3 个答案:

答案 0 :(得分:2)

找到它!!!

float A2 = otherPoint2.z - otherPoint1.z;
float B2 = otherPoint1.x - otherPoint2.x;
float C2 = A2 * otherPoint1.z + B2 * otherPoint1.z;

应该是:

float A2 = otherPoint2.z - otherPoint1.z;
float B2 = otherPoint1.x - otherPoint2.x; 

float C2 = A2 * otherPoint1 .x + B2 * otherPoint1.z;

很多浪费时间:/。

无论如何,这将有助于任何想要进行直线交叉的人。

答案 1 :(得分:0)

你可以将一个空的GameObject放到汽车上并将它稍微放在它前面(在IDE中或在启动时)。这样你就可以安全地获得绘制线所需的两个点。

答案 2 :(得分:0)

如果您知道这辆车需要行驶的距离t和另一辆车u的行驶距离,那么交叉点就不重要了。

Vector3 intersection = thisCar.position + (t * thisCar.forward);
Vector3 intersection = threateningCar.position + (u * threateningCar.forward);

但是您可以使用一些代数来求解tu,并使用2D矢量叉积[x_1,z_1] × [x_2,z_1] = (x_2 z_1 - z_2 x_1),即y是3D叉的标量值产品。

t = Vector3.Cross(threateningCar.forward, thisCar.position - threateningCar.position).y 
    / Vector3.Cross(thisCar.forward, threateningCar.forward).y;

u = Vector3.Cross(thisCar.forward, thisCar.position - threateningCar.position).y 
    / Vector3.Cross(thisCar.forward, threateningCar.forward).y;