Подтвердить что ты не робот

Перпендикулярно на линии от заданной точки

Как я могу нарисовать перпендикуляр на отрезке линии из данной точки? Мой сегмент линии определяется как (x1, y1), (x2, y2), если я рисую перпендикуляр из точки (x3, y3) и встречается с линией на точке (x4, y4). Я хочу узнать это (x4, y4).

4b9b3361

Ответ 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);
        }

Спасибо Рэю, потому что это отлично сработало для меня.