C#中如何判断垂线是否与线段相交及垂线是否存在?
判断过T₃的垂线与线段T₁T₂是否存在有效交点
其实你提到的“垂线是否存在”,本质是要判断过T₃作的垂线和线段T₁T₂有没有实际交点(也就是垂足Tₚ是否落在线段T₁T₂的范围内)——毕竟直线T₁T₂的垂线肯定存在,但线段是有长度限制的,如果垂足跑到线段的延长线上,那这条垂线和线段就没有有效交点,这时候就该抛出错误了。
下面给你两种靠谱的判断方法,结合你已经算出的垂足Tₚ(x₄,y₄)就能直接用:
一、先处理特殊场景
首先得排除线段退化成点的情况:
- 如果T₁和T₂完全重合(
x₁ == x₂且y₁ == y₂):- 只有当T₃和这个点坐标也完全相同时,才算“垂线存在”(其实就是点本身)
- 其他情况直接抛出错误,因为一个点没法作垂线
二、通用判断方法(针对正常线段T₁≠T₂)
方法1:坐标范围判断(简单直观)
因为你已经算出Tₚ在直线T₁T₂上,所以只要Tₚ的坐标落在线段T₁T₂的坐标范围内,就说明它在线段上:
- 先确定线段的x范围:
min(x₁, x₂) ≤ x₄ ≤ max(x₁, x₂) - 再确定线段的y范围:
min(y₁, y₂) ≤ y₄ ≤ max(y₁, y₂) - 两个条件同时满足,说明垂足在线段上,垂线存在;否则抛出错误
举个例子:T₁(0,0)、T₂(2,2),Tₚ(1.5,1.5),x在0-2之间,y在0-2之间,符合条件;如果Tₚ是(3,3),超出了线段的坐标范围,就不符合。
方法2:向量点积判断(更严谨,适合所有场景)
用向量点积可以更精准地判断Tₚ是否在线段的两个端点之间(包括端点):
- 计算向量:
向量T₁Tₚ = (x₄ - x₁, y₄ - y₁)向量T₁T₂ = (x₂ - x₁, y₂ - y₁)向量T₂Tₚ = (x₄ - x₂, y₄ - y₂)向量T₂T₁ = (x₁ - x₂, y₁ - y₂)
- 计算两个点积:
dot1 = (x₄ - x₁)*(x₂ - x₁) + (y₄ - y₁)*(y₂ - y₁)dot2 = (x₄ - x₂)*(x₁ - x₂) + (y₄ - y₂)*(y₁ - y₂)
- 判断条件:
- 如果
dot1 ≥ 0且dot2 ≥ 0,说明Tₚ在线段T₁T₂上,垂线存在;否则抛出错误
- 如果
解释下逻辑:dot1 ≥ 0 表示Tₚ在T₁朝向T₂的一侧(或和T₁重合),dot2 ≥ 0 表示Tₚ在T₂朝向T₁的一侧(或和T₂重合),两者同时满足就说明Tₚ在两个端点之间。
你可以根据自己的代码场景选其中一种方法,推荐用点积法,它能避免一些极端情况(比如线段完全垂直或水平时的边界判断)。
内容的提问来源于stack exchange,提问作者FatTommy
相关产品推荐
相关产品推荐

