C# 基于与直线相切的第三点查找直线上的点

C# 基于与直线相切的第三点查找直线上的点,c#,geometry,euclidean-distance,C#,Geometry,Euclidean Distance,从两点定义的直线上找出到一点的距离是很好的答案。在该答案中,线P1、P2与点P3相切,显示了如何确定到该点的距离。这是一个GPS应用程序,因此线路的方向已经确定,我不想使用点坡度公式或截距,因为它有局限性 我想确定直线上的点,切线与P1 P2定义的P3的直线相交。先谢谢你 编辑: 我有一个解决方案,但它有点麻烦,但也许不是,它确实有效: 1) Calculate distance to point by 2 point line to P3 but don't take abs value 2

从两点定义的直线上找出到一点的距离是很好的答案。在该答案中,线P1、P2与点P3相切,显示了如何确定到该点的距离。这是一个GPS应用程序,因此线路的方向已经确定,我不想使用点坡度公式或截距,因为它有局限性

我想确定直线上的点,切线与P1 P2定义的P3的直线相交。先谢谢你

编辑:

我有一个解决方案,但它有点麻烦,但也许不是,它确实有效:

1) Calculate distance to point by 2 point line to P3 but don't take abs value 
2) If distance < 0 then side = 1 else side = -1 
3) dist = abs(distance) 
4) rad2 = heading + PI/2 * side //tangent is always 90 degrees to line
5) sin rad2*dist + P3.x = point Q.x 
6) cos rad2*dist + P3.y = point Q.y
1)计算点到点的距离,以2点线到P3,但不取abs值
2) 如果距离小于0,则边=1,否则边=-1
3) 距离=绝对值(距离)
4) rad2=航向+PI/2*侧//切线始终与直线成90度角
5) sin rad2*dist+P3.x=点Q.x
6) cos rad2*距离+P3.y=点Q.y
不管这一点在哪一方似乎都有效


如果一条直线由方程a*x+B*y+C=0已知,且点p位于坐标
(p_x,p_y)
的直线外,则直线上最靠近p的点

此外,点p到直线的最小距离为

d = ABS(A*P_x+B*P_y+C)/SQRT(A^2+B^2)
编辑1

无限长直线通过两点
(x_1,y_1)
(x_2,y_2)
的方程为

A*x+B*x+C=0
(y_1-y_2)*x + (x_2-x_1)*y + (x_1*y_2-x_2*y_1) = 0
编辑2

如果直线从点
(Q_x,Q_y)
和方向
(e_x,e_y)
给出,则方程系数为

A = -e_y
B =  e_x
C = Q_x*e_y - Q_y*e_x

你能加一张草图吗。我在可视化请求时遇到问题。图像显示一行。点P也是已知的,如上所述为P3。我想确定Q[1]:我理解对了吗?在你的例子中,P1,P2和P3是已知的,你也知道切线向量?是的,切线与线P1,P2成90度。但是,该点可以位于直线的任意一侧。同样通过计算一个点到一条由2个点定义的直线的距离(Paul Bourke link),我也知道从直线到点P3的切线长度。保罗的文章给出了一个计算交点(x,y)坐标的公式。这对你来说还不够好吗?但这条线是不知道的。谢谢你的回答,知道这个等式是非常好的。我只想用P1和P2定义一条无限长的线,其中P3可以位于这条线的任何地方。那么这条线是如何定义的呢?1) 两点,2)点和方向,3)方程,4)其他构造。从一个点和一个方向导出的两个点。我有一个解决方案,但它有点麻烦:1)计算距离点由2点线P3。2) 如果距离<0,则边=1,否则边=-1 3)距离=abs(距离)4)rad2=航向+PI/2*边5)sinrad2*距离+P3.x=点x 6)cosrad2*距离+P3.y=点ySo编辑答案以找到直线方程系数
A
B
C
从一个点和一个方向。e_x和e_y是标准化向量吗?
A = -e_y
B =  e_x
C = Q_x*e_y - Q_y*e_x