问题描述
小M正在玩一个几何游戏,给定一个二维平面上的三个点 points,其中每个点用坐标 points[i] = [xi, yi] 表示。如果三点构成一个回旋镖,则返回 true。回旋镖的定义是三点不在一条直线上,并且这三个点互不相同。
请你帮助小M判断这些点是否构成一个回旋镖。
测试样例
样例1:
输入:
points = [[1, 1], [2, 3], [3, 2]]
输出:True
样例2:
输入:
points = [[1, 1], [2, 2], [3, 3]]
输出:False
样例3:
输入:
points = [[0, 0], [1, 1], [1, 0]]
输出:True
解答代码
def solution(points: list) -> bool:
# 检查三点是否互不相同
if points[0] == points[1] or points[0] == points[2] or points[1] == points[2]:
return False
# 解构三个点的坐标
(x1, y1), (x2, y2), (x3, y3) = points
# 计算叉积,判断三点是否共线
# 使用的公式是: (x2 - x1) * (y3 - y1) != (y2 - y1) * (x3 - x1)
return (x2 - x1) * (y3 - y1) != (y2 - y1) * (x3 - x1)
if name == 'main':
# 测试用例
print(solution(points=[[1, 1], [2, 3], [3, 2]]) == True) # 输出: True
print(solution(points=[[1, 1], [2, 2], [3, 3]]) == False) # 输出: False
print(solution(points=[[0, 0], [1, 1], [1, 0]]) == True) # 输出: True
思路
方法
检查点的唯一性:
- 首先,函数检查给定的三个点是否互不相同。如果任意两个点相同,则它们显然无法构成一个三角形,因为三角形需要三个不同的顶点。这一步通过比较点的坐标来实现。
解构点的坐标:
- 接下来,函数将传入的点列表 `points` 解构为三个独立的坐标对 `(x1, y1)`、`(x2, y2)` 和 `(x3, y3)`。这有助于后续的计算。
计算叉积:
- 为了判断三个点是否共线,函数使用了一个几何方法:计算由这三个点构成的向量的叉积。在二维平面上,两个向量 `(x1, y1)` 和 `(x2, y2)` 的叉积可以通过公式 `x1*y2 - y1*x2` 来计算。这个叉积的结果是一个标量,它表示这两个向量所构成的平行四边形的有向面积。
- 在这个问题中,我们计算由点1到点2的向量 `(x2-x1, y2-y1)` 和由点1到点3的向量 `(x3-x1, y3-y1)` 的叉积。如果这两个向量不共线(即它们不平行且不反向),则它们的叉积不为零。
- 因此,我们通过检查 `(x2 - x1) * (y3 - y1) != (y2 - y1) * (x3 - x1)` 来判断这三个点是否共线。如果这个条件成立(即叉积不为零),则这三个点不共线,可以构成一个三角形。
返回结果:
- 根据叉积的计算结果,函数返回 `True` 或 `False`,表示给定的三个点是否可以构成一个非共线的三角形。
测试用例
-
测试用例1:
points=[[1, 1], [2, 3], [3, 2]]- 这三个点不共线,因此可以构成一个三角形。函数应返回
True。
- 这三个点不共线,因此可以构成一个三角形。函数应返回
-
测试用例2:
points=[[1, 1], [2, 2], [3, 3]]- 这三个点共线(都在直线
y=x上),因此无法构成一个三角形。函数应返回False。
- 这三个点共线(都在直线
-
测试用例3:
points=[[0, 0], [1, 1], [1, 0]]- 这三个点不共线(尽管其中两个点在水平线上,但第三个点不在该线上),因此可以构成一个三角形。函数应返回
True。
- 这三个点不共线(尽管其中两个点在水平线上,但第三个点不在该线上),因此可以构成一个三角形。函数应返回