Geometry 两条平行线段相交

Geometry 两条平行线段相交,geometry,Geometry,我知道有很多算法可以验证两条线段是否相交 我所说的线段是由两个端点构成的长度线 但一旦遇到并行条件,它们只会告诉用户一个大的“否”和 假装没有重叠、共享端点或端点共谋 我知道我可以计算两条线段之间的距离。 如果距离为0,则检查是否位于其他线段中的端点。 这意味着我必须使用很多if-else和&&| |条件 这并不难,但我的问题是 “是否有一种技巧(或数学)方法来计算这种特殊的平行情况?” 我希望这张图片能澄清我的问题 是的,给定两条线的公式,测试它们的斜率是否相等。如果是,则直线平行且从不相交

我知道有很多算法可以验证两条线段是否相交

我所说的线段是由两个端点构成的长度线

但一旦遇到并行条件,它们只会告诉用户一个大的“否”和
假装没有重叠、共享端点或端点共谋

我知道我可以计算两条线段之间的距离。
如果距离为0,则检查是否位于其他线段中的端点。
这意味着我必须使用很多if-else和&&| |条件

这并不难,但我的问题是

“是否有一种技巧(或数学)方法来计算这种特殊的平行情况?”

我希望这张图片能澄清我的问题

是的,给定两条线的公式,测试它们的斜率是否相等。如果是,则直线平行且从不相交

如果每条线上都有点,则可以使用

如果两者都垂直于x轴,则它们都将具有无限的坡度,但它们将是平行的。每条线上的所有点的x坐标相等


要处理线段,请计算交点,然后确定两条线段是否都存在交点。

我假设您感兴趣的情况是两条线段平行(如Whirlwind所说,通过检查坡度确定),你要确定这两段是否重叠

与其担心直线之间的距离,我认为最简单的方法是,如果一段的任一端点位于另一段内:

if (segment_contains_point(segment_A, segment_B.start) || 
    segment_contains_point(segment_A, segment_B.end)) {
        // lines overlap
}

让我们假设您有两行,由公式
a.x+b.y+c=0
d.x+e.y+f=0
描述。当
a=0和d=0
b/a=e/d
时,这两条线是平行的。也许不做除法,只需确保
b.d=a.e

我发现了这个(我做了一些修改以适应) 它将返回interceion x,y,否则如果没有找到interceion,它将返回-1,-1

    Public Function intercetion(ByVal ax As Integer, ByVal ay As Integer, ByVal bx As Integer, ByVal by As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal dx As Integer, ByVal dy As Integer) As Point
    '//  Determines the intersection point of the line segment defined by points A and B
    '//  with the line segment defined by points C and D.
    '//
    '//  Returns YES if the intersection point was found, and stores that point in X,Y.
    '//  Returns NO if there is no determinable intersection point, in which case X,Y will
    '//  be unmodified.

    Dim distAB, theCos, theSin, newX, ABpos As Double

    '//  Fail if either line segment is zero-length.
    If ax = bx And ay = by Or cx = dx And cy = dy Then Return New Point(-1, -1)

    '//  Fail if the segments share an end-point.
    If ax = cx And ay = cy Or bx = cx And by = cy Or ax = dx And ay = dy Or bx = dx And by = dy Then Return New Point(-1, -1)

    '//  (1) Translate the system so that point A is on the origin.
    bx -= ax
    by -= ay
    cx -= ax
    cy -= ay
    dx -= ax
    dy -= ay

    '//  Discover the length of segment A-B.
    distAB = Math.Sqrt(bx * bx + by * by)

    '//  (2) Rotate the system so that point B is on the positive X axis.
    theCos = bx / distAB
    theSin = by / distAB
    newX = cx * theCos + cy * theSin
    cy = cy * theCos - cx * theSin
    cx = newX
    newX = dx * theCos + dy * theSin
    dy = dy * theCos - dx * theSin
    dx = newX

    '//  Fail if segment C-D doesn't cross line A-B.
    If cy < 0 And dy < 0 Or cy >= 0 And dy >= 0 Then Return New Point(-1, -1)

    '//  (3) Discover the position of the intersection point along line A-B.
    ABpos = dx + (cx - dx) * dy / (dy - cy)

    '//  Fail if segment C-D crosses line A-B outside of segment A-B.
    If ABpos < 0 Or ABpos > distAB Then Return New Point(-1, -1)

    '//  (4) Apply the discovered position to line A-B in the original coordinate system.
    '*X=Ax+ABpos*theCos
    '*Y=Ay+ABpos*theSin

    '//  Success.
    Return New Point(ax + ABpos * theCos, ay + ABpos * theSin)
End Function
公共函数交互(ByVal ax为整数,ByVal ay为整数,ByVal bx为整数,ByVal by为整数,ByVal cx为整数,ByVal cy为整数,ByVal dx为整数,ByVal dy为整数)为点
“//确定由点A和点B定义的线段的交点
“//具有由点C和D定义的线段。
'//
“//如果找到交点,则返回YES,并将该点存储在X,Y中。
“//如果没有可确定的交点,则返回NO,在这种情况下,X,Y将
“//不能修改。
Dim distAB、theCos、theSin、newX、ABpos为双精度
“//如果任一线段长度为零,则失败。
如果ax=bx和ay=by或cx=dx和cy=dy,则返回新点(-1,-1)
“//如果段共享端点,则失败。
如果ax=cx且ay=cy或bx=cx且by=cy或ax=dx且ay=dy或bx=dx且by=dy,则返回新点(-1,-1)
“//(1)平移系统,使点A位于原点上。
bx-=ax
by-=ay
cx-=ax
cy-=ay
dx-=ax
dy-=ay
“//查找段A-B的长度。
distAB=Math.Sqrt(bx*bx+by*by)
'//(2)旋转系统,使点B位于正X轴上。
theCos=bx/distAB
theSin=by/distAB
newX=cx*theCos+cy*theSin
cy=cy*theCos-cx*theSin
cx=newX
newX=dx*theCos+dy*theSin
dy=dy*theCos-dx*theSin
dx=newX
“//如果段C-D未穿过线A-B,则失败。
如果cy<0且dy<0或cy>=0且dy>=0,则返回新点(-1,-1)
'//(3)沿A-B线找出交点的位置。
ABpos=dx+(cx-dx)*dy/(dy-cy)
“//如果段C-D在段A-B之外穿过线A-B,则失败。
如果ABpos<0或ABpos>distAB,则返回新点(-1,-1)
'//(4)将发现的位置应用于原始坐标系中的线A-B。
'*X=Ax+ABpos*theCos
'*Y=Ay+ABpos*theSin
“//成功。
返回新点(ax+ABpos*theCos,ay+ABpos*theSin)
端函数

我遇到了同样的问题:我想出的最简单的方法就是检查线条是否重叠: 假设线段共线(平行且与x轴具有相同的交点)。 从较长的段(A,B)中取一个点A作为起点。现在在其他三个点中找到一个点,该点与点A之间的距离最小(平方距离更好,甚至曼哈顿长度也可以),测量B方向的距离。如果距离A最近的点是B,则直线不相交。如果它属于另一个部分,他们会这样做。
也许您必须检查特殊情况,如零长度线或相同的线,但这应该很容易。

哦,天哪。我想我最好满足性格要求。我错了=P@Tyler:但我想补充一下我原来的回答:我认为判断一个给定点是否在两条直线上,应该比求两条直线之间的距离更容易区分这两种情况。简单点说,我的线段是长直线,而不是无限长的直线。除了交叉点或没有,我有所有其他信息,如坡度,距离,矢量。这是其他的计算:)那么你的问题真的很令人困惑。如果两条线段平行,则它们不相交。这不是你问的吗?这就是我的想法,因为你写道:“有没有一个技巧(或数学)方法来计算这个特殊的平行情况?”@whirlwind他说的是线段,而不是直线。问题是,对于2条(共线)平行线段,如何确定是否存在重叠?您到底想找到什么?根据定义,平行线从不相交。平行线不相交