交点-hard

在这里插入图片描述
#### 斜截式:y=kx+b【适用于不垂直于x轴的直线】
#### 参数方程式,它可以表示任意的直线,并且它非常适合用于表示线段。假设我们给定两个点 (x_1, y_1)(x1,y1) 以及 (x_2, y_2)(x2,y2),我们只需要令:
# x = x_1 + t(x_2 - x_1) and y = y_1 + t(y_2 - y_1)
#### 所以这道题的点就在于要用参数方程来求解。必须可以表示任意的直线~~
#### 当然我还是用斜截式,比较熟悉。所以要分是否与x轴垂直。 k = (y2 - y1) / (x2 - x1); 其实 一条与x垂直的话,那么其实就可以确定一个横坐标,那么可能的交点的纵坐标就可以求。然后再比较位置~不难

class Solution:
    def intersection(self, start1: List[int], end1: List[int], start2: List[int], end2: List[int]) -> List[float]:
        start1, end1 = sorted([start1, end1], key=lambda x:(x[0], x[1]))
        start2, end2 = sorted([start2, end2], key=lambda x:(x[0], x[1]))

        if start1 == start2:
            return start1

        if start1[0] - end1[0] == 0:
            x = start1[0]
            y = start1[1]
        else:
            k1 = (start1[1] - end1[1]) / (start1[0] - end1[0])
            b1 = start1[1] - k1 * start1[0]

        if start2[0] - end2[0] == 0:
            k2 = 0
        else:
            k2 = (start2[1] - end2[1]) / (start2[0] - end2[0])
            b2 = start2[1] - k2 * start2[0]

        if start1[0] == end1[0] and start2[0] == end2[0]:
            ## 都平行于x轴
            if start1[0] != start2[0]:
                return []
            else:
                if end2[1] >= start1[1] >= start2[1]:
                    return start1
                if end2[1] >= end1[1] >= start2[1]:
                    return start2
                return []

        elif start1[0] == end1[0]:
            ### 一条平行于x轴
            y2 = k2 * start1[0] + b2
            if start1[1] <= y2 <= end1[1]:
                return [start1[0], y2]
            else:
                return []
        
        elif start2[0] == end2[0]:
            ### 一条平行于x轴
            y1 = k1 * start2[0] + b1
            if start2[1] <= y1 <= end2[1]:
                return [start2[0], y1]
            else:
                return []

        if k1 == k2 and b1 == b2:
            if end1 < start2 or start1 > end2:
                return []
            else:
                return max(start1, start2)

        if k1 == k2:
            return []

        x = (b2-b1) / (k1-k2)
        y = k1*x + b1

        ### 坑在这里,排序之后,X大的不一定y也是比较大。
        # if end1[0] >= x >= start1[0] and end2[0] >= x >= start2[0] and (end1[1] >= y >= start1[1] or start1[1] >= y >= end1[1]) and (end2[1] >= y >= \
        #         start2[1] or start2[1] >= y >= end2[1]):
        ### 当然也可以不用这么麻烦,直接:
        if (start2[1]-y)*(end2[1]-y)<=0 and (start1[1]-y)*(end1[1]-y)<=0:
            return [x, y]
        else:
            return []
       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Delphi交点算法是一种用于计算线段或射线间交点的算法。它基于点的位置关系和几何运算,可以准确地确定交点的坐标。 算法的基本思路是通过比较线段或射线的方向和相交条件,来确定它们是否相交以及交点位置。下面是Delphi交点算法的步骤: 1. 首先,我们需要确定两条线段或射线的起始点和终点坐标。这些坐标可以表示为(x1, y1)、(x2, y2)、(x3, y3)和(x4, y4)。 2. 接下来,我们可以计算线段或射线的方向向量。方向向量可以通过终点坐标减去起始点坐标得到,即: - 向量AB: (x2-x1, y2-y1) - 向量CD: (x4-x3, y4-y3) 3. 然后,我们可以进行几何判断,以确定这两个向量是否相交。判断方法有多种,一种常用的方法是通过向量叉积的正负来判断: - 如果 (x4-x1)*(y2-y1) - (x2-x1)*(y4-y1) 和 (x3-x1)*(y2-y1) - (x2-x1)*(y3-y1) 异号,表示线段或射线相交。 - 同样地,如果 (x2-x3)*(y4-y3) - (x4-x3)*(y2-y3) 和 (x1-x3)*(y4-y3) - (x4-x3)*(y1-y3) 异号,也表示线段或射线相交。 4. 如果线段或射线相交,我们可以通过交点算式来计算交点的坐标: - 交点的x坐标:( (x3*y4 - x4*y3)*(x2-x1) - (x1*y2 - x2*y1)*(x4-x3) ) / ( (x2-x1)*(y4-y3) - (x4-x3)*(y2-y1) ) - 交点的y坐标: ( (x1*y2 - x2*y1)*(y4-y3) - (x3*y4 - x4*y3)*(y2-y1) ) / ( (x2-x1)*(y4-y3) - (x4-x3)*(y2-y1) ) 这样,我们就可以得到线段或射线的交点坐标。 Delphi交点算法通过几何计算和向量运算,能够确定线段或射线的交点位置。这种算法在计算几何、计算机图形学以及计算机辅助设计等领域中有广泛的应用。 ### 回答2: Delphi交点算法是一种用于计算线段交点的算法,它基于坐标几何学的原理。该算法主要包括以下几个步骤: 1. 导入数据:首先需要输入线段的起点和终点坐标,确定两条线段的坐标。 2. 计算斜率:通过计算两条线段的斜率,判断线段是否平行。如果两条直线的斜率相等,则它们平行,无交点;如果斜率不等,则有可能存在交点。 3. 判断交点位置:利用线段的起点和终点坐标,以及斜率的关系,可以根据交点位置的不同进行判断。 - 如果两条线段共有一个顶点,则它们必然有交点; - 如果两条线段没有公共顶点,则通过计算线段的交点坐标,判断交点是否在两条线段的范围内。如果交点坐标同时满足两条线段的范围条件,则存在交点;否则不存在交点。 4. 输出结果:根据以上判断,输出算法计算得到的线段交点坐标。 Delphi交点算法是一种简单且有效的算法,可以帮助我们准确计算线段的交点。不过需要注意的是,在计算过程中需要考虑线段重合、共线、平行等特殊情况,以保证结果的准确性。同时,该算法还可用于计算其他几何形状的交点,如线段与直线的交点、直线与直线的交点等。通过使用Delphi交点算法,我们可以方便地进行几何分析和计算。 ### 回答3: Delphi 交点算法是一种用于计算几何图形中的交点的算法。它通常用于计算线段、直线或曲线之间的交点。 这个算法的思想基于平面几何中的相交条件。当两条直线相交时,它们的斜率和截距会互相满足一定的关系。因此,我们可以通过求解这个关系,找出两条直线的交点。 对于线段或曲线,我们可以通过分段求解的方法,将其划分为多个直线段或曲线段。然后,我们可以使用 Delphi 交点算法来计算每个线段或曲线段之间的交点,并得到最终的结果。 具体来说,Delphi 交点算法的步骤如下: 1. 将线段或曲线表示为直线方程或参数方程的形式。 2. 如果是直线,则判断两条直线是否有交点。若有,计算交点的坐标。 3. 如果是曲线,则将曲线分段,并将每个曲线段表示为参数方程的形式。 4. 对于每个曲线段,判断其与其他曲线段是否相交。若相交,计算相交点的坐标。 5. 将所有相交点的坐标收集起来,得到最终的交点结果。 Delphi 交点算法可以应用于许多几何图形计算问题,例如计算线段是否相交、计算多边形的交点等。它在计算机图形学和计算机辅助设计等领域有广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值