Пересечение прямых
Даны две прямые
Найти точку их пересечения (или убедиться, что её нет)
Представим обе прямые в параметрическом виде:
x = x1 + n * ax
y = y1 + n * ay
z = z1 + n * az
Объединяя параметрические уравнения для обеих прямых, получим систему трёх уравнений с двумя неизвестными. Решаем три подсистемы и выбираем подходящее решение.
Листинг C++
// a1*x + b1*y = c1
// a2*x + b2*y = c2
bool system2 (double a1, double b1, double c1, double a2, double b2, double c2, gpoint &p)
{
double d = det (a1, b1, a2, b2);
if (eq (d, 0)) return 0;
double dx = det (c1, b1, c2, b2);
double dy = det (a1, c1, a2, c2);
p.x = dx / d;
p.y = dy / d;
return 1;
}
// пересечение прямых
bool cross_lines (gline l1, gline l2, gpoint & p)
{
gpoint nm[3];
bool flagnm[3];
flagnm[0] = system2 (l1.v.x, - l2.v.x, l2.p.x - l1.p.x, l1.v.y, - l2.v.y, l2.p.y - l1.p.y, nm[0]);
flagnm[1] = system2 (l1.v.z, - l2.v.z, l2.p.z - l1.p.z, l1.v.y, - l2.v.y, l2.p.y - l1.p.y, nm[1]);
flagnm[2] = system2 (l1.v.x, - l2.v.x, l2.p.x - l1.p.x, l1.v.z, - l2.v.z, l2.p.z - l1.p.z, nm[2]);
for (int i = 0; i < 3; ++ i)
if (flagnm[i])
{
gpoint t1 = add_vector (l1.p, l1.v, nm[i].x);
gpoint t2 = add_vector (l2.p, l2.v, nm[i].y);
if (eq (t1.x, t2.x) && eq (t1.y, t2.y) && eq (t1.z, t2.z))
{
p = t1;
return 1;
}
}
return 0;
}
20:19
23.12.2009
По всем вопросам обращаться: rumterg@gmail.com