Точка на расстоянии отрезка линии от точки - PullRequest
3 голосов
/ 20 ноября 2010

Я ищу алгоритм (или название алгоритма), который найдет точку на отрезке, если такая точка существует, то есть на некотором заданном расстоянии от другой точки, которая не находится на отрезке.

т. Е. Существует три точки A , B , C ;и, возможно, четвертый D .Где AB образует отрезок, а точка C - это другая точка где-то за пределами отрезка AB .Найдите точку D , если такая точка существует, которая появляется на отрезке AB , который находится на заданном расстоянии distance от точки C .

Ответы [ 2 ]

5 голосов
/ 25 мая 2012

Я потратил WAY слишком долго, чтобы выяснить это, и, похоже, нигде не мог найти простой ответ, поэтому я решил опубликовать его здесь и сэкономить некоторым людям много времени. Несмотря на то, что оригинальная публикация старая, я бы очень хотел, чтобы кто-то давно опубликовал простой ответ. Это сэкономило бы мне пару дней экспериментов.

public static Point PointFromEndOfLine(Point start, Point end, double distance)
{
    double x = end.X-start.X;   
    double y = end.Y-start.Y;
    double z = Math.Sqrt(x * x + y * y);  //Pathagrean Theorum for Hypotenuse
    double ratio = distance / z;
    double deltaX = x * ratio;
    double deltaY = y * ratio;

    return new Point(end.X-deltaX, end.Y-deltaY);
}

Приведенная выше функция принимает начальную точку (x, y) и конечную точку (x, y) и расстояние (от конечной точки. Если ваше расстояние отрицательное, возвращаемая точка будет за конечной точкой вдоль той же линии. Ваше расстояние больше, чем расстояние между начальной и конечной точками, точка возврата будет перед вашей начальной точкой, но все еще на одной линии. Если ваше расстояние является положительным числом и меньше расстояния между начальной и конечной точкой, возвращаемая точка будет находиться на отрезке между начальной и конечной точками на расстоянии от конечной точки.

Причина, по которой это работает, - «Подобные треугольники». Представьте себе большой прямоугольный треугольник. Нарисуйте прямую линию через треугольник, параллельный оси X, и значения x, y, z вашего большого треугольника, а меньший, созданный нарисованной линией, будет пропорционален друг другу.

Другими словами: x / X == y / Y == z / Z

Надеюсь, это кому-нибудь поможет.

5 голосов
/ 20 ноября 2010

Смотрите здесь: Пересечение окружности

C - середина окружностей, а distance - радиус.

Обратите внимание, что может быть две результирующие точки, и вам нужно проверить, действительно ли точка находится на вашей линии (или на той линии, которую вы получили бы, расширяя ее).

...