求两条直线的交点
本文关键字:两条 | 更新日期: 2023-09-27 18:06:05
所以我一直在研究这个相对简单的算法。我不确定我的代码出了什么问题,但我没有得到它们实际上相交的交叉点。
我正在使用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.forward
和threateningCar.forward
通常是[0,0,1], [0,0,-1]
或[1,0,0], [-1,0,0]
找到了!!
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
;
虚度光阴:/.
无论如何,这将帮助任何人寻找做线相交。
你可以将一个空的GameObject添加到汽车上,并将其放置在汽车前面(无论是在IDE中还是在启动时)。这样你就可以安全地得到画一条线所需的两个点。
如果你知道这辆车需要行驶的距离t
和另一辆车需要行驶的距离u
,那么交点是微不足道的。
Vector3 intersection = thisCar.position + (t * thisCar.forward);
Vector3 intersection = threateningCar.position + (u * threateningCar.forward);
但是你可以用一些代数来解出t
和u
,以及二维向量外积,[x_1,z_1] × [x_2,z_1] = (x_2 z_1 - z_2 x_1)
即y
是三维外积的标量值。
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;