如何在给定点的线段上绘制垂线?我的线段定义为(x1,y1),(x2,y2),如果我从点(x3,y3)绘制一个垂直线并且它在点(x4,y4)上遇到线.我想找出这个(x4,y4).
我为你解决了方程式:
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表示平方
来自维基:
在代数中,对于任何线性方程y = mx + b,垂线都将具有(-1/m)的斜率,与原始斜率的倒数相反.记住"找到垂直线的斜率,翻转分数并改变符号"的口号是有帮助的.回想一下,任何整数a本身都超过一个,可以写成(a/1)
为了找到也通过特定点(x,y)的给定线的垂线,求解方程y =( - 1/m)x + b,用m,x和y的已知值代替求解对于b.
线的斜率m,通过(x1,y1)和(x2,y2)是m =(y1-y2)/(x1-x2)
我同意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;
您经常会发现使用矢量可以使解决方案更清晰......
这是我自己的库中的例程:
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); }
你知道点和斜率,所以新线的等式是:
y-y3=m*(x-x3)
由于线是垂直的,因此斜率是负倒数.你现在有两个方程,可以求解它们的交集.
y-y3=-(1/m)*(x-x3) y-y1=m*(x-x1)