如何在给定点的线段上绘制垂线?我的线段定义为(x1,y1),(x2,y2),如果我从点(x3,y3)绘制一个垂直线并且它在点(x4,y4)上遇到线。我想找出这个(x4,y4)。
答案 0 :(得分:62)
我为你解决了方程:
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表示平方
答案 1 :(得分:17)
来自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)
答案 2 :(得分:9)
我同意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;
答案 3 :(得分:8)
您经常会发现使用矢量可以使解决方案更清晰......
以下是我自己图书馆的例程:
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);
}
答案 4 :(得分:7)
你知道点和斜率,所以新线的等式是:
y-y3=m*(x-x3)
由于线是垂直的,因此斜率是负的倒数。你现在有两个方程式,可以求解它们的交集。
y-y3=-(1/m)*(x-x3)
y-y1=m*(x-x1)
答案 5 :(得分:3)
计算连接点(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)
我希望这会有所帮助。
欢呼声
答案 6 :(得分:2)
找出两者的斜率 线,比如说斜率是m1和m2 m1 * m2 = -1 是条件 垂直度。
答案 7 :(得分:2)
以下问题的Matlab函数代码
<img src="./img/femaleavatar.png" alt="Female Avatar" class="img-circle">
答案 8 :(得分:1)
Mathematica在2014年第10版中引入了函数RegionNearest[]
。此函数可用于返回此问题的答案:
{x4,y4} = RegionNearest[Line[{{x1,y1},{x2,y2}}],{x3,y3}]
答案 9 :(得分:1)
这大部分都与Arnkrishn的答案重复。我只想用完整的Mathematica代码片段完成他的部分:
m = (y2 - y1)/(x2 - x1)
eqn1 = y - y3 == -(1/m)*(x - x3)
eqn2 = y - y1 == m*(x - x1)
Solve[eqn1 && eqn2, {x, y}]
答案 10 :(得分:0)
这是已接受答案的C#实现。它还使用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);
}
答案 11 :(得分:0)
这是矢量Matlab函数,用于查找m
点到n
线段上的成对投影。这里的xp
和yp
是m by 1
个向量,分别包含m
个不同点以及x1
,y1
,x2
和{ {1}}是y2
个向量,其中包含n by 1
个不同线段的起点和终点的坐标。
它返回n
矩阵m by n
和x
,其中y
和x(i, j)
是第y(i, j)
点到{{1 }}行。
实际工作在前几行中完成,该函数的其余部分运行一个自测演示,以防万一没有参数的情况下调用它。速度相对较快,我设法在不到0.05s的时间内找到2k点到2k线段上的投影。
i
答案 12 :(得分:0)
仅出于完整性考虑,以下是使用齐次坐标的解决方案。
齐次点是:
p1 =(x1,y1,1),p2 =(x2,y2,1),p3 =(x3,y3,1)
通过两点的线是它们的叉积
l_12:= p1 x p2 =(y1-y2,x2-x1,x1 * y2-x2 * y1)
点到直线的(有符号)距离是它们的点积。
d:= l_12 * p3 = x3 *(y1-y2)+ y3 *(x2-x1)+ x1 * y2-x2 * y1
从p4到p3的向量是l_12的法向向量的d乘以法向向量的平方长度。
n2:=(y1-y2)^ 2 +(x2-x1)^ 2
p4:= p3 + d / n2 *(y1-y2,x2-x1,0)
注意:如果将l_12除以法线向量的长度
l_12:= l_12 / sqrt((y1-y2)^ 2 +(x2-x1)^ 2)
距离d是欧氏距离。
答案 13 :(得分:0)
首先,计算由点确定的线性函数
(x1,y2),(x2,y2)
。
我们得到:
y1 = mx+b1 where m and b1 are constants.
通过两点之间的线性函数公式可以轻松地计算此步骤。
然后,计算通过(x3,y3)的线性函数y。
函数斜率是-m,其中m是y1的斜率。
然后通过点(x3,y3)的坐标计算const b2。
我们得到y2 = -mx + b2,其中m和b2是常数。
最后要做的是找到y1,y2的交点。
您可以通过求解方程-mx+b2 = mx+b1
来找到x,然后将x放在一个方程中以找到y。