使用蠻力法解決凸包問題,並用matplotlib庫在座標平面上繪製凸包

蠻力法的基本思想:兩兩枚舉點集中的點構成一條直線,然後第三層循環判斷是否其餘所有的點帶入這條直線符號都相同,都相同就說明這兩個點屬於凸包的集合

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()

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章