Взаимное расположение прямых и точек (проекция, расстояния)



Здесь мы рассмотрим сразу четыре задачи.

1) Расстояние от точки до прямой

Дана точка и прямая
Необходимо найти длину перпендикуляра, опущенного из точки к прямой

d = |a * x1 + b * y1 + c| / sqrt(a2 + b2)

2) Проекция точки на прямую

Дана точка и прямая
Необходимо найти точку на этой прямой, расстояние до которой от данной минимально

Найдём расстояние от точки до прямой, разделим его на длину вектора нормали. И прибавим соответственное количество раз вектор нормали к точке.

3) Расстояние между двумя параллельными прямыми

Даны две параллельные прямые
Необходимо найти расстояние между ними
d = |c1 - c2| / sqrt (a12 + b12)

4) Прямая, параллельная данной и лежащая на расстоянии d от неё

Дана прямая и число
Необходимо найти прямую, параллельную данной и лежащую на расстоянии равном данному числу

Так как координаты вектора нормали у этих прямых равны, то разным будет только свободный член уравнения. Вычисляем его из предыдущей формулы.

Листинг C++

// расстояние от точки до прямой
double dist_point_to_line (point p, line l)
{
    return abs((l.a * p.x + l.b * p.y + l.c) / sqrt(l.a * l.a + l.b * l.b));
}
// проекция точки на прямую
point closest_point (line l, point p)
{
    double k = (l.a * p.x + l.b * p.y + l.c) / (l.a * l.a + l.b * l.b);
    return point (p.x - l.a * k, p.y - l.b * k);
}
// расстояние между параллельными прямыми
double dist_between_line (line l1, line l2)
{
    return abs (l1.c - l2.c) / sqrt (l1.a * l1.a + l2.b * l2.b);
}
// прямая параллельная данной и лежащая на расстоянии d от неё
line parallel_line_of_dist (line l, double d)
{
    return line (l.a, l.b, l.c - d * sqrt (l.a * l.a + l.b * l.b));
}

12.06.2007, 16:34


По всем вопросам обращаться: rumterg@gmail.com