Language agnostic 二维空间中的重叠线段
我需要找出两条线是否重叠。我有一个交集代码,它返回0,如果两条线是平行的。但我需要知道这两条平行线是否重叠 编辑:Language agnostic 二维空间中的重叠线段,language-agnostic,geometry,line,Language Agnostic,Geometry,Line,我需要找出两条线是否重叠。我有一个交集代码,它返回0,如果两条线是平行的。但我需要知道这两条平行线是否重叠 编辑: A C B D ----------------------------------------------- 第1行:A-B 第2行:C-D 我需要确定线1是否与线2重叠,但两条线的斜率都可以大于0。因为您知道它们都是平行的,那么只需检查线段CD是否包含第一条线(点a和点B)的任一端点。对于不一定轴
A C B D
-----------------------------------------------
第1行:A-B
第2行:C-D
我需要确定线1是否与线2重叠,但两条线的斜率都可以大于0。因为您知道它们都是平行的,那么只需检查线段CD是否包含第一条线(点a和点B)的任一端点。对于不一定轴对齐的两条共线线段:
我们有两条线段 AB=从(Ax,Ay)到(Bx,By)的线段
CD=从(Cx,Cy)到(Dx,Dy)的线段 坡度相同
- 对端点E1
- 如果E1和E2来自不同的段,则重叠为E2到E3的段
- A
- A
- A
- A=B=C=D
- A
这些结果是一个单一的交点。我不确定在你的系统中是否会出现这种情况,但如果是这样,你必须决定是否考虑“重叠”并添加特殊的情况检查。通过这种方式,您将进行较少的比较,因此非常有效。做以下比较 D B
您将进行最少数量的比较,以确定它们是否重叠。否则会有更多的比较。在同一直线上的两个线段的特性称为共线,可以通过计算由一个线段端点和另一个线段端点形成的两个三角形的面积来测试。如果面积在阈值以下为零或接近零,则线段将共线
public static bool是段共线(a段、b段、双ε)
{
返回ispointcollinline(a,b.左,ε)和&ispointcollinline(a,b.右,ε);
}
公共静态布尔值为点共线(a段,向量2D p,双ε)
{
返回Math.Abs(getSignedTriangelArea2(a,p))计算三角形ACB和CBD的面积就足够了。如果面积为0,则点共线,如果两个面积都为零,则线重叠
可以通过以下公式计算三角形ABC的面积:
2*面积(ABC)=(bx–ax)(cy–ay)–(cx–ax)(by–ay);直线方程是无限直线的方向,通过寻找斜率或截距,你将无法对它们做任何事情(即使水平线没有斜率),我建议使用直线上的点。
所以AB是你的直线[(x,y),(x,y)],C是点(x,y)的一部分,然后你需要检查点是否在直线上。
为了清楚起见,由于答案中似乎存在一些混淆,因此提出的问题如下。给定两条二维线段A和B,如何确定以下两条是否正确:
A和B是共线的
A和B相交
请注意,这两个问题都涉及公差,即A和B需要多接近平行线以及彼此之间有多近才能被视为共线?它们需要重叠多少才能被视为重叠
我认为,要稳健地处理此类公差,最好的算法是将线段视为薄矩形,其中矩形的厚度是公差参数t1
。让t2
成为斜坡上被认为是平行的另一个公差参数。然后,算法变为
如果A的斜率和B的斜率不在彼此的t2
范围内,则返回false。为了干净地处理垂直线,斜率可以表示为单位向量,测试可以基于两个单位向量之间的欧氏距离是否小于t2
将A和B表示为(非轴对齐)矩形R1和R2。其中R1以明显的方式包围A,即它是长度(A)+t1
单位长,是t1
单位宽,其中A居中,R2类似地包围B
确定R1和R2是否相互相交。这可以通过将每个矩形视为两个三角形的并集并测试所有A三角形和B三角形组合的三角形交点来相对有效地完成。如果存在交点,则返回true;否则返回false
对于以下形式给出的线l1
和l2
,[x1,y1,x2,y2]
以下python代码将给出具有任何坡度的共线线段的交点
intersection=直线相交(l1,l2)
def行_相交(l1、l2):
“”“查找两条线段的交点”“”
x1,y1,x2,y2=l1
x3,y3,x4,y4=l2
x_inter=分量_相交(x1,x2,x3,x4)
y_inter=分量_相交(y1,y2,y3,y4)
返回math.sqrt(x\u inter**2+y\u inter**2)
def部件_相交(c1、c2、c3、c4):
“”“计算一维/组件中的交点”“”
#查找左端点
cl1=最小值(c1,c2)
cl2=最小值(c3,c4)
#找到正确的端点
cr1=最大值(c1,c2)
cr2=最大值(c3、c4)
#求交点的端点
c_inter_l=最大值(cl1,cl2)
c_inter_r=min(cr1,cr2)
#计算交点
c_inter=c_inter_r-c_inter_l
c_inter=最大值(c_inter,0)
返回c_int