Пересечение прямых



Даны две прямые
Найти точку их пересечения (или убедиться, что её нет)

Представим обе прямые в параметрическом виде:

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