Graphics 找到一条与已知直线垂直相交的直线,给定一点

Graphics 找到一条与已知直线垂直相交的直线,给定一点,graphics,geometry,Graphics,Geometry,这是基本的图形几何和/或三角,问这个问题我觉得很傻,但我记不起是怎么回事了。因此: 我有一条由两点(x1,y1)和(x2,y2)定义的线 我有第三点(xp,yp),它位于其他地方 我想计算位于#1中直线某处的点(x',y'),这样,当与#2中的点连接时,将创建一条与第一条直线垂直的新直线。 谢谢。您可以求解连接(x1,y1)和(x2,y2)的线的坡度。然后你就知道垂直线的斜率是负的 要查找y截距,请使用斜率查看直线在y中从x=0到x1的移动距离 b + (x1 - x0) * m = y1 b

这是基本的图形几何和/或三角,问这个问题我觉得很傻,但我记不起是怎么回事了。因此:

  • 我有一条由两点(x1,y1)和(x2,y2)定义的线
  • 我有第三点(xp,yp),它位于其他地方
  • 我想计算位于#1中直线某处的点(x',y'),这样,当与#2中的点连接时,将创建一条与第一条直线垂直的新直线。


    谢谢。

    您可以求解连接
    (x1,y1)
    (x2,y2)
    的线的坡度。然后你就知道垂直线的斜率是负的

    要查找y截距,请使用斜率查看直线在
    y
    中从
    x=0
    x1
    的移动距离

    b + (x1 - x0) * m = y1
    b + (x1 -  0) * m = y1
    b + (x1 * m)      = y1
    b = y1 - x1 * m
    
    然后,您可以使用上述斜率从
    (xp,yp)
    获得两点之间的直线和直线的公式。对于给定的x,它们有相等的y,所以你可以求解
    x
    ,然后将其插入到
    y
    的公式中

    m = slope_from_1_to_2  = (y2 - y1) / (x2 - x1)
    n = slopePerpendicular = (-1) / m
    
    b = intercept_for_1_to_2 = y1 - x1 * m
    c = intercept_for_p      = yp - xp * n
    
    因此,直线方程的形式如下
    y=mx+b

    第1点和第2点:

    y(x)=mx+b

    p点:

    y(x)=nx+c

    将它们的
    y
    设置为等于查找x'

    mx' + b = nx' + c
    (m-n)x' = c - b
         x' = (c - b) / (m - n)
    
    因此,使用任一公式计算y'

    答案是:

    y=ax+b
    where a=(x1-x2)/(y2-y1)
          b=yp-(x1-x2)*xp/(y2-y1)
    
    如何获得结果:

    1) slope for the original line:   (y2-y1)/(x2-x1)
    
    2) slope for the answer: -1/((y2-y1)/(x2-x1)) = (x1-x2)/(y2-y1)
    
    3) Plug this into (xp,yp) we can have the result line.
    

    从后面的几行中计算答案(太长了……我饿了)。

    这种计算几何中的一个有用的经验法则是,你应该尽可能长时间地使用向量,切换到笛卡尔坐标系只是作为最后的手段。让我们用向量代数来解决这个问题。假设你的直线从pp+r,另一点是q

    现在,直线上的任何点,包括您试图找到的点(称之为s),都可以表示为标量参数λ的s=pr

    现在从qs的向量必须垂直于r。所以

    q− (pr)·r=0

    火车在哪里。扩展产品:

    qp)·r=λ(r·r

    并划分:

    λ=(qp)·r/r·r


    当您开始实施它时,您需要检查r·r=0,以避免被零除。

    您可以首先考虑一个通用点
    (x,y)
    ,沿着
    (x1,y1)
    (x2,y2)
    的直线找到该点:

    (xp,yp)

    x
    y
    的定义替换为

    E = (x1 + t*(x2 - x1) - xp)**2 +
        (y1 + t*(y2 - y1) - yp)**2
    
    然后,为了找到该距离变化的最小值
    t
    ,我们推导出
    E
    关于
    t

    dE/dt = 2*(x1 + t*(x2 - x1) - xp)*(x2 - x1) +
            2*(y1 + t*(y2 - y1) - yp)*(y2 - y1)
    
    t = ((xp - x1)*(x2 - x1) + (yp - y1)*(y2 - y1)) /
        ((x2 - x1)**2 + (y2 - y1)**2)
    
    经过计算得出

    dE/dt = 2*((x1 - xp)*(x2 - x1) + (y1 - yp)*(y2 - y1) +
               t*((x2 - x1)**2 + (y1 - y2)**2))
    
    当这个导数为零时,我们得到了
    t

    dE/dt = 2*(x1 + t*(x2 - x1) - xp)*(x2 - x1) +
            2*(y1 + t*(y2 - y1) - yp)*(y2 - y1)
    
    t = ((xp - x1)*(x2 - x1) + (yp - y1)*(y2 - y1)) /
        ((x2 - x1)**2 + (y2 - y1)**2)
    
    因此,可以使用
    (x,y)
    定义中
    t
    的值来计算最终点

    使用向量表示法,这与Gareth建议的公式完全相同

    t = <p - p1, p2 - p1> / <p2 - p1, p2 - p1>
    
    t=/
    
    其中符号
    表示点积运算
    ax*bx+ay*by


    还要注意,同样的公式也适用于n维空间。

    对于那些用向量寻找具体例子的可怜的灵魂。。。在这里,我以加雷斯的回答为基础

    有一个从p到r的向量(从0,0到50,-50)和另一个点q,它在(50,0)处。q和从p到r的向量的直角交点是{x:25.y:-25},由下面的代码导出

    const p=[0,0];
    常数r=[50,-50];
    常数q=[50,0];
    常数l=数学加法(p,r);
    常数m=math.dot(math.subtract(q,p,r)/math.dot(r,r);
    console.log('intersection point',math.multiply(l,m))
    
    基于

    设x1,x2,y1,y2,斜率,xp,yp,m,x,y
    x1=0
    y1=0
    x2=50
    y2=-50
    xp=50
    yp=0
    斜率=(y1-y2)/(x1-x2)
    m=-1/坡度
    x=(m*xp-yp-斜率*x1+y1)/(m-斜率)
    y=m*x-m*xp+yp
    
    log('x:',x',y:',y)
    谢谢。在方程中,
    y(x)=mx+y2
    ——为什么要用
    y2
    来代替
    b
    ?好的一点是,
    b
    应该是y轴截距,直线在y轴上
    y2
    不一定是这样,让我看看我的数学。使用公式
    y=m*x+q
    来解决真正的二维问题意味着寻找麻烦。你不能用这种方法处理垂直线;最好使用参数方程
    x=x(t),y=y(t)
    。这不适用于
    y1=y2
    (除以零)。实际上,在处理真正的二维问题时,不应该使用基于“斜率”的公式。公式
    y=mx+q
    只在你处理1.5维问题(即图形
    y=y(x)
    )时有效。@6502 Hmm。谢谢你在将来为我保存了这些错误,因为我不太可能再忘记它。谢谢你在向量方面的启发性思考。谢谢你。给你一个被接受的答案,就像你的答案一样,是唯一一个接受我所知道的(笛卡尔坐标)并给我一个实际公式来插入它们的答案。(我喜欢向量的想法,但考虑到我的几何记忆,这会引发更多的问题。)