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)
的线的坡度。然后你就知道垂直线的斜率是负的
要查找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.
从后面的几行中计算答案(太长了……我饿了)。这种计算几何中的一个有用的经验法则是,你应该尽可能长时间地使用向量,切换到笛卡尔坐标系只是作为最后的手段。让我们用向量代数来解决这个问题。假设你的直线从p到p+r,另一点是q 现在,直线上的任何点,包括您试图找到的点(称之为s),都可以表示为标量参数λ的s=p+λr 现在从q到s的向量必须垂直于r。所以 (q− (p+λr)·r=0 火车在哪里。扩展产品: (q− p)·r=λ(r·r) 并划分: λ=(q− p)·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。谢谢你在将来为我保存了这些错误,因为我不太可能再忘记它。谢谢你在向量方面的启发性思考。谢谢你。给你一个被接受的答案,就像你的答案一样,是唯一一个接受我所知道的(笛卡尔坐标)并给我一个实际公式来插入它们的答案。(我喜欢向量的想法,但考虑到我的几何记忆,这会引发更多的问题。)