Я потратил 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
Надеюсь, это кому-нибудь поможет.