Как я могу нарисовать перпендикуляр на отрезке линии из данной точки? Мой сегмент линии определяется как (x1, y1), (x2, y2), если я рисую перпендикуляр из точки (x3, y3) и встречается с линией на точке (x4, y4). Я хочу узнать это (x4, y4).
Перпендикулярно на линии от заданной точки
Ответ 1
Я решил для вас уравнения:
k = ((y2-y1) * (x3-x1) - (x2-x1) * (y3-y1)) / ((y2-y1)^2 + (x2-x1)^2)
x4 = x3 - k * (y2-y1)
y4 = y3 + k * (x2-x1)
Где ^ 2 означает квадрат
Ответ 2
От wiki:
В алгебре для любого линейного уравнения y = mx + b, все перпендикуляры имеют наклон (-1/м), противоположный взаимно от первоначального склона. Это полезно запомнить лозунг "на найти наклон перпендикуляра линии, перевернуть фракцию и изменить знак". Напомним, что любое целое число a само по себе выше и может быть записано как (a/1)
Найти перпендикуляр заданного линия, которая также проходит через (x, y), решить уравнение y = (-1/m) x + b, подставляя в известных значениях m, x и y до решить для b.
Наклон линии, m, через (x1, y1) и (x2, y2) равен m = (y1 - y2)/(x1 - x2)
Ответ 3
Я согласен с peter.murray.rust, векторы делают решение более ясным:
// first convert line to normalized unit vector
double dx = x2 - x1;
double dy = y2 - y1;
double mag = sqrt(dx*dx + dy*dy);
dx /= mag;
dy /= mag;
// translate the point and get the dot product
double lambda = (dx * (x3 - x1)) + (dy * (y3 - y1));
x4 = (dx * lambda) + x1;
y4 = (dy * lambda) + y1;
Ответ 4
Вы часто обнаружите, что использование векторов делает решение более ясным...
Вот рутина из моей собственной библиотеки:
public class Line2 {
Real2 from;
Real2 to;
Vector2 vector;
Vector2 unitVector = null;
public Real2 getNearestPointOnLine(Real2 point) {
unitVector = to.subtract(from).getUnitVector();
Vector2 lp = new Vector2(point.subtract(this.from));
double lambda = unitVector.dotProduct(lp);
Real2 vv = unitVector.multiplyBy(lambda);
return from.plus(vv);
}
}
Вам нужно будет реализовать Real2 (точка) и Vector2 и dotProduct(), но они должны быть простыми:
Затем код выглядит примерно так:
Point2 p1 = new Point2(x1, y1);
Point2 p2 = new Point2(x2, y2);
Point2 p3 = new Point2(x3, y3);
Line2 line = new Line2(p1, p2);
Point2 p4 = getNearestPointOnLine(p3);
Библиотека (org.xmlcml.euclid) находится по адресу: http://sourceforge.net/projects/cml/
и есть единичные тесты, которые будут использовать этот метод и показать вам, как его использовать.
@Test
public final void testGetNearestPointOnLine() {
Real2 p = l1112.getNearestPointOnLine(new Real2(0., 0.));
Real2Test.assertEquals("point", new Real2(0.4, -0.2), p, 0.0000001);
}
Ответ 5
Вы знаете как точку, так и наклон, поэтому уравнение для новой строки:
y-y3=m*(x-x3)
Поскольку линия перпендикулярна, наклон является отрицательным обратным. Теперь у вас есть два уравнения и они могут решить их пересечение.
y-y3=-(1/m)*(x-x3)
y-y1=m*(x-x1)
Ответ 6
Вычислить наклон линий, соединяющих точки (x1, y1) и (x2, y2) как m=(y2-y1)/(x2-x1)
Уравнение линии, соединяющей (x1, y1) и (x2, y2) с использованием точечного склона формы линейного уравнения, будет y-y2 = m(x-x2)
Наклон линии, соединяющей (x3, y3) и (x4, y4), будет -(1/m)
Опять же, уравнение линии, соединяющей (x3, y3) и (x4, y4) с использованием точечного склона линейного уравнения, будет y-y3 = -(1/m)(x-x3)
Решите эти два линейных уравнения, когда вы решаете линейное уравнение в двух переменных, а значения x и y, которые вы получите, будут вашими (x4, y4)
Надеюсь, это поможет.
веселит
Ответ 7
Узнайте склоны как для линии, скажем, наклоны m1 и m2, тогда m1 * m2 = -1 - условие для перпендикулярность.
Ответ 8
Код функции Matlab для следующей задачи
function Pr=getSpPoint(Line,Point)
% getSpPoint(): find Perpendicular on a line segment from a given point
x1=Line(1,1);
y1=Line(1,2);
x2=Line(2,1);
y2=Line(2,1);
x3=Point(1,1);
y3=Point(1,2);
px = x2-x1;
py = y2-y1;
dAB = px*px + py*py;
u = ((x3 - x1) * px + (y3 - y1) * py) / dAB;
x = x1 + u * px;
y = y1 + u * py;
Pr=[x,y];
end
Ответ 9
Mathematica представила функцию RegionNearest[]
в версии 10, 2014. Эта функция может быть использована для возврата ответа на этот вопрос:
{x4,y4} = RegionNearest[Line[{{x1,y1},{x2,y2}}],{x3,y3}]
Ответ 10
Это в основном дубликат ответа Арнкришна. Я просто хотел закончить его раздел с полным фрагментом кода Mathematica:
m = (y2 - y1)/(x2 - x1)
eqn1 = y - y3 == -(1/m)*(x - x3)
eqn2 = y - y1 == m*(x - x1)
Solve[eqn1 && eqn2, {x, y}]
Ответ 11
Это реализация принятого ответа на С#. Он также использует ArcGis для возврата MapPoint как того, что мы используем для этого проекта.
private MapPoint GenerateLinePoint(double startPointX, double startPointY, double endPointX, double endPointY, double pointX, double pointY)
{
double k = ((endPointY - startPointY) * (pointX - startPointX) - (endPointX - startPointX) * (pointY - startPointY)) / (Math.Pow(endPointY - startPointY, 2)
+ Math.Pow(endPointX - startPointX, 2));
double resultX = pointX - k * (endPointY - startPointY);
double resultY = pointY + k * (endPointX - startPointX);
return new MapPoint(resultX, resultY, 0, SpatialReferences.Wgs84);
}
Спасибо Рэю, потому что это отлично сработало для меня. c# arcgis