2017-08-23 62 views
-3

創建多邊形我生成隨機座標的Python爲每個頂點如下:在Python

n = 10 
V = [] 
V=range(n) #vertices 

random.seed(1) 
points = [] 

for i in V: 
    x = random.randint(0,50) 
    y = random.randint(0,50) 
    points.append((x,y)) 

我需要創建使用這些頂點的閉合多邊形。有人能爲我提供一個建議嗎?

+0

什麼樣的多邊形的? – DyZ

+1

連接這些點的封閉多邊形。簡單地說是一個有10條邊的多邊形(因爲頂點數爲10)。 – ccc

+0

它是否必須凸出?它是否允許自相交? – DyZ

回答

1

如果你不想要十字路口,實現這一目標的一種方法是按照一定的旋轉規則排列你的座標對。在上面的例子中,我首先定義一箇中心點(這裏分別是所有x值和y值的平均值),然後計算每個座標對與該中心點定義的角度。正如JRG已經說過,您可以通過附加的第一點貴點的序列得到一個封閉的多邊形:

import numpy as np 
from matplotlib import pyplot as plt 

def draw_polygon(ax, n): 

    x = np.random.randint(0,50,n) 
    y = np.random.randint(0,50,n) 

    ##computing the (or a) 'center point' of the polygon 
    center_point = [np.sum(x)/n, np.sum(y)/n] 

    angles = np.arctan2(x-center_point[0],y-center_point[1]) 

    ##sorting the points: 
    sort_tups = sorted([(i,j,k) for i,j,k in zip(x,y,angles)], key = lambda t: t[2]) 

    ##making sure that there are no duplicates: 
    if len(sort_tups) != len(set(sort_tups)): 
     raise Exception('two equal coordinates -- exiting') 

    x,y,angles = zip(*sort_tups) 
    x = list(x) 
    y = list(y) 

    ##appending first coordinate values to lists: 
    x.append(x[0]) 
    y.append(y[0]) 

    ax.plot(x,y, label = '{}'.format(n)) 

if __name__ == '__main__': 

    fig,ax = plt.subplots() 

    for n in range(3,11,2): 
     draw_polygon(ax,n) 

    ax.legend() 
    plt.show() 

結果看起來是這樣的: several random polygons

0

給定n,只生成n-1個隨機頂點,最後在列表中添加第一個元素作爲第n個元素來獲得閉合多邊形。

NOTE:你需要特殊的處理,新產生的頂點已經不存在在列表中

找到,如果頂點形成真正的多邊形,發現下面的文章

https://math.stackexchange.com/questions/52733/equation-to-check-if-a-set-of-vertices-form-a-real-polygon

import random 

n = 10 
V = [] 
V = range(n-1) #vertices 

random.seed(1) 
points = [] 

for i in V: 
    x = random.randint(0,50) 
    y = random.randint(0,50) 
    points.append((x,y)) 

points.append(points[0]) 
print(points) 

樣品運行

======== RESTART: C:/polygon.py ======== 
[(8, 36), (48, 4), (16, 7), (31, 48), (28, 30), (41, 24), (50, 13), (6, 31), (1, 24), (8, 36)] 
+0

這並不保證不會有自交。 – DyZ

+0

嗨JRG,謝謝你的回答。但是,我們如何將這些點與線連接以形成一個封閉的多邊形? – ccc