蠻力法的基本思想:兩兩枚舉點集中的點構成一條直線,然後第三層循環判斷是否其餘所有的點帶入這條直線符號都相同,都相同就說明這兩個點屬於凸包的集合
import numpy as np
import random
import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist
x = [];y = []
ansx = [[]];ansy = [[]]
def judge(n, m, num):
flag = 0
A = y[n] - y[m]
B = x[m] - x[n]
C = x[n] * y[m] - x[m] * y[n]
for i in range(0, num):
if A * x[i] + B * y[i] + C > 0:
if flag < 0:
return False
elif flag == 0:
flag = 1
elif A * x[i] + B * y[i] + C < 0:
if flag > 0:
return False
elif flag == 0:
flag = -1
return True;
fig = plt.figure('Convex Hull', (15,12))
ax = axisartist.Subplot(fig, 1,1,1)
fig.add_axes(ax)
ax.axis[:].set_visible(False)
ax.axis["x"] = ax.new_floating_axis(0, 0)
ax.axis["y"] = ax.new_floating_axis(1, 0)
ax.axis["x"].set_axisline_style("->", size=1)
ax.axis["y"].set_axisline_style("->", size=1)
ax.axis["x"].set_axis_direction('top')
ax.axis["y"].set_axis_direction('left')
n = 100
x=[random.randint(-100,100) for i in range(0,n)]
y=[random.randint(-100,100) for i in range(0,n)]
print(x)
print(y)
for i in range(0, n):
plt.scatter(x[i],y[i],color='b')
for i in range(0, n):
for j in range(0, n):
if i == j:
continue
if judge(i, j, n) == True:
ansx.append([x[i], x[j]])
ansy.append([y[i], y[j]])
for i in range(len(ansx)):
plt.plot(ansx[i],ansy[i],'k')
plt.scatter(ansx[i],ansy[i],color='r')
plt.show()