【每日一题】面试题 16.03. 两线段求交点 (py3真香)

2020.04.12
在这里插入图片描述
一道面向数学的编程题目。对于一些数学问题的编程算法可以有进一步的理解。

本题主要是区分4种情况:

  • 两条斜率都不存在,即与y轴平行
  • 其中一条斜率不存在
    • 直线1是垂线,直线2不是
    • 直线2是垂线,直线1不是
  • 两条都不是垂线
    • 斜率相同,且截距相同并有交点
    • 斜率不同,先算出交点,再看交点是否均在两条线段之间

基本方法:

  1. 判断线段有无交点的经典写法。max(start1[1], end1[1])>=min(start2[1], end2[1]) and max(start2[1], end2[1])>=min(start1[1], end1[1])
  2. 判断点是否位于线段上的写法:(y-start2[1])*(y-end2[1])<=0

编码时的坑:

  1. python2的除法系统有问题,最好还是用py3,今后代码都会在py3完成。
  2. 如果取值可能为0,就不要用if k1:这种方式进行判断,因为k==0时候也无法进入循环。

代码如下:

class Solution:
    def intersection(self, start1: List[int], end1: List[int], start2: List[int], end2: List[int]) -> List[float]:
        if start1[0] == end1[0]:
            k1 = None
            b1 = None
        else:
            k1 = (start1[1]-end1[1])/(start1[0]-end1[0])
            b1 = start1[1]-k1*start1[0]
        if start2[0] == end2[0]:
            k2 = None
            b2 = None
        else:
            k2 = (end2[1]-start2[1])/(end2[0]-start2[0])
            b2 = start2[1]-k2*start2[0]
       

        if k1 is None and k2 is None:
            if start1[0] == start2[0] and max(start1[1], end1[1])>=min(start2[1], end2[1]) and max(start2[1], end2[1])>=min(start1[1], end1[1]):
                return [start1[0], max(min(start1[1], end1[1]), min(start2[1], end2[1]))]

        elif k1 is None:
            y = k2*start1[0]+b2
            if (y-start1[1])*(y-end1[1])<=0:
                return [start1[0], y]

        elif k2 is None:
            y = k1*start2[0]+b1
            if (y-start2[1])*(y-end2[1])<=0:
                return [start2[0], y]           
        
        elif k1 == k2:
            if b1 == b2 and max(start1[1], end1[1])>=min(start2[1], end2[1]) and max(start2[1], end2[1])>=min(start1[1], end1[1]):
                return [max(min(start1[0], end1[0]),min(start2[0], end2[0])), max(min(start1[1], end1[1]),min(start2[1], end2[1]))]
        
        elif k1!=k2:
            x = (b1-b2)/(k2-k1)
            y = k1*x+b1
            if (x-start1[0])*(x-end1[0])<=0 and (x-start2[0])*(x-end2[0])<=0:
                return [x,y]
        
        return []
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值