コード
XZ平面
//
// 直線の交点を求める関数(直線はp0-p1、p2-p3のペア)
//
vector CrossPointXZ(vector p0; vector p1; vector p2; vector p3)
{
// 線分が交差していた場合、直線の交点座標を計算する
float a1 = p0.z - p1.z;
float b1 = p1.x - p0.x;
float c1 = (p1.x - p0.x) * p0.z - (p1.z - p0.z) * p0.x;
float a2 = p2.z - p3.z;
float b2 = p3.x - p2.x;
float c2 = (p3.x - p2.x) * p2.z - (p3.z - p2.z) * p2.x;
float x = (c1 * b2 - c2 * b1) / (a1 * b2 - a2 * b1);
float z = (a1 * c2 - a2 * c1) / (a1 * b2 - a2 * b1);
return set(x, 0, z);
}
XY平面
//
// 直線の交点を求める関数
//
vector CrossPointXY(vector p0; vector p1; vector p2; vector p3)
{
// 線分が交差していた場合、直線の交点座標を計算する
float a1 = p0.y - p1.y;
float b1 = p1.x - p0.x;
float c1 = (p1.x - p0.x) * p0.y - (p1.y - p0.y) * p0.x;
float a2 = p2.y - p3.y;
float b2 = p3.x - p2.x;
float c2 = (p3.x - p2.x) * p2.y - (p3.y - p2.y) * p2.x;
float x = (c1 * b2 - c2 * b1) / (a1 * b2 - a2 * b1);
float y = (a1 * c2 - a2 * c1) / (a1 * b2 - a2 * b1);
return set(x, y, 0);
}
解説
連立一次方程式なのでクラメールの公式を使う
a1 * x + b1 * y = c1
a2 * x + b2 * y = c2
のとき
x = (c1 * b2 – c2 * b1) / (a1 * b2 – a2 * b1)
y = (a1 * c2 – a2 * c1) / (a1 * b2 – a2 * b1)
となる
点A(x1、y1)、点B(x2、y2)の方程式
(y2 – y1) / (x2 – x1) * (x – x1) = (y – y1)
式を変形すると
(y1 – y2) * x + (x2 – x1) * y = (x2 – x1) * y1 – (y2 – y1) * x1
a1 = (y1 – y2)
b1 = (x2 – x1)
c1= (x2 – x1) * y1 – (y2 – y1) * x1
同じように点Cと点Dの式からa2、b2、c2を求める。