代码之家  ›  专栏  ›  技术社区  ›  Zinx

从给定点垂直于直线

  •  34
  • Zinx  · 技术社区  · 15 年前

    如何在给定点的直线段上画一条垂线?如果我从一个点(x3,y3)画一条垂线,它与点(x4,y4)上的线相交,那么我的线段定义为(x1,y1),(x2,y2)。我想知道这个(x4,y4)。

    10 回复  |  直到 8 年前
        1
  •  61
  •   Ray Hidayat    15 年前

    我帮你解了方程:

    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
  •  17
  •   Mitch Wheat    15 年前

    wiki :

    在代数中,对于任何线性方程 y=mx+b,垂线 坡度为(-1/m),与之相反 原始坡度的倒数。它 有助于记忆标语“to 求垂线的斜率 行,翻转分数并更改 “记住任何整数a” 在一个之上,并且可以被写 AS(A/1)

    求给定物体的垂线 也通过 特殊点(x,y),求解 方程y=(-1/m)x+b,代入 以m、x和y的已知值 B解决。

    线路的坡度m,通过(x1,y1)和(x2,y2)为m=(y1-y2)/(x1-x2)

        3
  •  9
  •   Abraxas    11 年前

    我同意Peter.Murray.Rust,Vectors使解决方案更清晰:

    // 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
  •  8
  •   peter.murray.rust    15 年前

    你经常会发现使用向量可以使解决方案更清晰…

    以下是我自己图书馆的例行程序:

    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(a point)和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
  •  7
  •   Dan Lorenc    15 年前

    你知道点和坡度,所以新线的方程是:

    y-y3=m*(x-x3)
    

    因为直线是垂直的,所以斜率是负的倒数。现在有两个方程,可以解出它们的交点。

    y-y3=-(1/m)*(x-x3)
    y-y1=m*(x-x1)
    
        6
  •  3
  •   Arnkrishn    15 年前

    计算直线连接点(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
  •  2
  •   Prasoon Saurav    15 年前

    找出两者的坡度 线,比如说坡度是m1和m2,那么 M1*M2=- 1 是的条件 垂直性。

        8
  •  2
  •   Rajnikant Sharma    9 年前

    以下问题的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
  •  1
  •   Floern themue    8 年前

    Mathematica介绍了函数 RegionNearest[] 2014年第10版。此函数可用于返回此问题的答案:

    {x4,y4} = RegionNearest[Line[{{x1,y1},{x2,y2}}],{x3,y3}]
    
        10
  •  1
  •   BeanSith    8 年前

    这主要是阿恩克里希恩回答的一个副本。我只是想用一个完整的Mathematica代码片段来完成他的部分:

    m = (y2 - y1)/(x2 - x1)
    eqn1 = y - y3 == -(1/m)*(x - x3)
    eqn2 = y - y1 == m*(x - x1)
    Solve[eqn1 && eqn2, {x, y}]