如何求解平行于已知直线的直线上Q1、Q2两点的坐标
求解点Q1、Q2坐标
参考内容见所附示意图:
求解目标为点Q1和Q2的位置坐标值,原有实现代码无法正确输出对应点坐标,代码如下:
dim u as vertex u = CVertex(P3.x - P4.x , P3.y - P4.y , 0.0) dim v as vertex v = CVertex( -u.y , u.x , v.z) dim t1 as vertex t1 = CVertex( (P1.x - P2.x) * v.x , (P1.y - P2.y) * v.y , 0.0) dim t2 as vertex t2 = CVertex( (P1.x - P3.x) * v.x , (P1.y - P3.y) * v.y , 0.0) dim t as vertex t = CVertex( t1.x / t2.x , t1.y / t2.y , 0.0) dim Q1 as vertex Q1.x = P1.x + t.x * (P3.x - P1.x) Q1.y = P1.y + t.y * (P3.y - P1.y)
原代码问题
- 初始化向量
v时直接调用未赋值的v.z,引入脏值 - 核心逻辑错误:二维直线的位置参数是全局标量,不需要拆分x、y分量单独计算参数值,原代码将两个分量独立做除法,完全不符合直线相交的计算逻辑
- 向量运算使用错误:计算投影、相交关系时,应该用向量整体的叉积/点积得到标量结果,而非分量分别相乘计算。
正确计算方法
从示意图判断,Q1是直线P1P2与直线P3P4的交点,使用二维直线参数相交法即可求解,步骤如下:
- 分别计算两条直线的方向向量,以及两直线上定点的连接向量
- 用二维叉积计算参数分母,判断直线是否平行
- 计算直线参数,代入参数方程得到交点坐标
实现代码
' 二维向量叉积计算,返回标量结果 Function Cross(a As vertex, b As vertex) As Double Cross = a.x * b.y - a.y * b.x End Function ' 求解直线P1P2和直线P3P4的交点Q1 Dim dirL1 As vertex, dirL2 As vertex, conn As vertex Dim denom As Double, param As Double Dim Q1 As vertex ' 计算基础向量 dirL1 = CVertex(P2.x - P1.x, P2.y - P1.y, 0.0) ' P1-P2直线方向向量 dirL2 = CVertex(P4.x - P3.x, P4.y - P3.y, 0.0) ' P3-P4直线方向向量 conn = CVertex(P3.x - P1.x, P3.y - P1.y, 0.0) ' 从P1指向P3的连接向量 denom = Cross(dirL1, dirL2) If Abs(denom) < 1e-6 Then ' 两直线平行/重合,无唯一交点,可按需添加异常处理逻辑 Exit Sub End If ' 计算P1-P2直线上的交点参数 param = Cross(dirL2, conn) / denom ' 输出Q1坐标 Q1.x = P1.x + param * dirL1.x Q1.y = P1.y + param * dirL1.y Q1.z = 0.0
如果需要求解Q2,只需要明确Q2对应的几何关系(比如点到直线的垂足、另一段直线的交点),代入相同的参数法逻辑即可:所有二维直线上的点都满足统一的参数方程,不需要拆分x、y分量单独计算参数。
内容的提问来源于stack exchange,提问作者Summit
相关产品推荐
相关产品推荐

