python動態演示蠻力法解決凸包問題
阿新 • • 發佈:2019-05-12
cat lib 數量 net detail ima roi mar lin
最近開了算法課,但是我的算法著實不咋地,一直搞web和逆向,就沒怎麽編程。記錄一下0.0
算法倒是不難實現,但是這個動態演示很煩,從純粹的可視化小白,強行寫完了,寫完發現非常簡單,只是自己不知道的函數太多了,哭了。。。。
蠻力法就不用解釋了,通俗的說就是把所有可能試一遍。
凸包問題,就是將n個點中某幾個點圍成一個多邊形,除了這n個點,其余的點都在這個多邊形內。
核心算法其實就是一個行列式演變而來,後悔沒學好線代。。。。。
參考:https://blog.csdn.net/u011001084/article/details/72768075
貼出我的代碼:
import random import matplotlib.pyplot as p input = int(input(‘輸入生成點的數量:‘)) dot = [[0]*3 for i in range(input)] x = [[0]*2 for a in range(int(input * (input - 1) / 2))] y = [[0]*2 for b in range(int(input * (input - 1) / 2))] fg = p.figure() cn = fg.add_subplot(1, 1, 1) cn.set_xlim(0, 1000) cn.set_ylim(0, 1000) p.ion() for i in range(input): dot[i][0] = random.randrange(1000) dot[i][1] = random.randrange(1000) dot[i][2] = 0 def judge(inp): n = 0 for i in range(inp): for j in range(i+1, inp): a = dot[j][1] - dot[i][1] b = dot[i][0] - dot[j][0] c = (dot[i][0] * dot[j][1]) - (dot[i][1] * dot[j][0]) sign1 = 0 sign2 = 0 x[n][0] = dot[i][0] x[n][1] = dot[j][0] y[n][0] = dot[i][1] y[n][1] = dot[j][1] n += 1 for k in range(inp): if k == j or k == i: continue if a*dot[k][0]+b*dot[k][1] == c: sign1 += 1 sign2 += 1 if a*dot[k][0]+b*dot[k][1] > c: sign1 += 1 if a*dot[k][0]+b*dot[k][1] < c: sign2 += 1 if (sign1 == (inp - 2)) or (sign2 == (inp - 2)): dot[i][2] = 1 dot[j][2] = 1 cn.scatter(dot[i][0], dot[i][1], color=‘g‘, marker=‘.‘) cn.scatter(dot[j][0], dot[j][1], color=‘g‘, marker=‘.‘) cn.plot(x[n-1], y[n-1], color=‘b‘) cn.scatter(dot[i][0], dot[i][1], color=‘g‘, marker=‘.‘) cn.scatter(dot[j][0], dot[j][1], color=‘g‘, marker=‘.‘) cn.plot(x[n-1], y[n-1], color=‘r‘) p.pause(0.1) cn.lines.pop() judge(input) print("凸包極點:") for i in range(input): if dot[i][2] == 1: print((dot[i][0], dot[i][1]))
import random
import matplotlib.pyplot as p
input = int(input(‘輸入生成點的數量:‘))
dot = [[0]*3 for i in range(input)]
x = [[0]*2 for a in range(int(input * (input - 1) / 2))]
y = [[0]*2 for b in range(int(input * (input - 1) / 2))]
fg = p.figure()
cn = fg.add_subplot(1, 1, 1)
cn.set_xlim(0, 1000)
cn.set_ylim(0, 1000)
p.ion()
for i in range(input):
dot[i][0] = random.randrange(1000)
dot[i][1] = random.randrange(1000)
dot[i][2] = 0
def judge(inp):
n = 0
for i in range(inp):
for j in range(i+1, inp):
a = dot[j][1] - dot[i][1]
b = dot[i][0] - dot[j][0]
c = (dot[i][0] * dot[j][1]) - (dot[i][1] * dot[j][0])
sign1 = 0
sign2 = 0
x[n][0] = dot[i][0]
x[n][1] = dot[j][0]
y[n][0] = dot[i][1]
y[n][1] = dot[j][1]
n += 1
for k in range(inp):
if k == j or k == i:
continue
if a*dot[k][0]+b*dot[k][1] == c:
sign1 += 1
sign2 += 1
if a*dot[k][0]+b*dot[k][1] > c:
sign1 += 1
if a*dot[k][0]+b*dot[k][1] < c:
sign2 += 1
if (sign1 == (inp - 2)) or (sign2 == (inp - 2)):
dot[i][2] = 1
dot[j][2] = 1
cn.scatter(dot[i][0], dot[i][1], color=‘g‘, marker=‘.‘)
cn.scatter(dot[j][0], dot[j][1], color=‘g‘, marker=‘.‘)
cn.plot(x[n-1], y[n-1], color=‘b‘)
cn.scatter(dot[i][0], dot[i][1], color=‘g‘, marker=‘.‘)
cn.scatter(dot[j][0], dot[j][1], color=‘g‘, marker=‘.‘)
cn.plot(x[n-1], y[n-1], color=‘r‘)
p.pause(0.1)
cn.lines.pop()
judge(input)
print("凸包極點:")
for i in range(input):
if dot[i][2] == 1:
print((dot[i][0], dot[i][1]))
python動態演示蠻力法解決凸包問題