> 文档中心 > Python每日一练-----三点共线问题

Python每日一练-----三点共线问题

拒绝平躺,每日一卷第11天)

目录

1.向量解法

2.斜率解法

3.面积解法


题目:

给定一个数组 points ,其中 points[i] = [x, y] 表示 X-Y 坐标平面上的一个点

如果这些点不共线 则返回 true ,共线则返回false。

🌠例1:

输入:points = [[1,1],[2,3],[3,2]]

输出:true

🌠例2:

输入:points = [[1,1],[2,2],[3,3]]

输出:false

题目分析:

运用中学的知识就可以由很多种解法

1.向量解法

假设有三点A(a,b),B(c,d),C(e,f)

向量AB = (c-a, d-b)       向量BC = (e-c, f-d)

1.若AB和BC不共线,则AB+BC不等于(C点和A点不重合时,重合时共线)

2.若AB和BC共线,则AB+BC=0向量(AB,BC反向),或AB-BC=0向量(AB,BC同向)2.

 可以抛开特殊情况不谈,直接从共线入手就好

 设A(x1,y1),B(x2,y2),C(x3,y3)

向量AB=(x2-x1,y2-y1),向量AC=(x3-x1,y3-y1)

A、B、C共线得:向量AB//向量AC

(x2-x1)(y3-y1)=(x3-x1)(y2-y1)

所以A、B、C共线:(x2-x1)(y3-y1)=(x3-x1)(y2-y1)

def isBoomerang(points):    """AB = (points[1][0] - points[0][0], points[1][1] - points[0][1])    BC = (points[2][0] - points[1][0], points[2][1] - points[1][1])    AC = (points[2][0] - points[0][0], points[2][1] - points[0][1])    c = points[2][0] - points[1][0]    d = points[2][1] - points[1][1]"""    a = points[1][0] - points[0][0]    b = points[1][1] - points[0][1]    e = points[2][0] - points[0][0]    f = points[2][1] - points[0][1]    return a*f != e*b

 化为最简

def isBoomerang(points):    return (points[1][0] - points[0][0])*(points[2][1] - points[0][1]) != (points[2][0] - points[0][0])*(points[1][1] - points[0][1])

斜率解法 

先判断有没有相同的点,再判断三点共不共线。

共线的判断方法是,计算点1和点0的斜率,再计算点2和点1的斜率,看两个斜率相不相同。

坑点有三个:

  1. 除法计算时除数不能为0;

  2. 斜率可能是浮点数所以要用1.0 *一下把计算结果转成浮点数;

  3. 两个浮点数比相同不能用等号,要用相减的差和0.0001的比大小来表示

3.面积解法

我们知道

1.当三点共线,三点构成三角形面积为0

2.当三点不共线,三点构成三角形面积不为0

知道三点计算三角形面积的公式有很多种,现在介绍下面这一种。

S=1/2[(x1y2-x2y1)+(x2y3-x3y2)+(x3y1-x1y3)

代码实现

def collinear(points): return (points[0][0] * (points[1][1] - points[2][1]) + points[1][0] * (points[2][1] - points[0][1]) + points[2][0] * (points[0][1] - points[1][1])) != 0

很简短,所以解决问题不要复杂化,先用数学知识解决在用代码实现,效果有时会出乎意料

❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄end❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄