Взаимное расположение прямых и точек (проекция, расстояния)
Здесь мы рассмотрим сразу четыре задачи.
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