问题
这一次的编程作业是判断共线点。
问题大致描述如下:
给定平面上一些点,判断其中是否有四个及以上的点共线,把所有这些点找出来并连线。原题链接
思路
一种做法是暴力求解,遍历所有四个点,判断其是否共线。这种做法简单粗暴,但是时间复杂度在 O ( N 4 ) O(N^4) O(N4)。
另一种做法是以其中一个点为坐标原点,计算其他点到该点的倾角,按倾角的大小对其他点排序,找出三个以上连续相同的点,与该点本身,构成共线。遍历所有的点,重复上述操作,可得到所有共线组。
这题的难点在于不重复。因为在计算的时候,很有可能会计算重复的共线组。我的策略是,以共线组的倾角为共线组的特征,建立一个倾角集合,将所有的共线组按倾角进行分类,倾角重复的视为一类,不再计算。
代码
# -*- coding: utf-8 -*-
"""
Created on Thu Nov 19 18:54:15 2020
@author: zxw
"""
import matplotlib.pyplot as plt
import numpy as np
import math
# N=6
# x = [19000,18000,32000,21000,1234,14000]
# y = [10000,10000,10000,10000,5678,10000]
# N = 8
# x = [10000,0,3000,7000,20000,3000,14000,6000]
# y = [0,10000,7000,3000,21000,4000,15000,7000]
# 输入数据
# 暴力求解
## 判断三点共线
def Collinear(x,y,z):
return (y[1]-x[1])*(z[0]-x[0]) == (y[0]-x[0])*(z[1]-x[1])
def Brute():
for i in range(N):
for j in range(i+1,N):
for m