2017-03-28 33 views
0

私は非常にビッグナーであり、Pythonでランダムなポリゴンを作るためのコードを作っています。 コード内にエラーは見つかりませんが、すべての頂点を印刷することはできませんが、1つの頂点のx、y座標のペアだけを印刷します。 誰かに教えてもらえますか?私はmap(tuple、verts)は何らかの副徴候だと思います。Pythonを使ってランダムなポリゴンを作成する

ありがとうございました。

import math, random 
def generatePolygon(ctrX, ctrY, aveRadius, irregularity, spikeyness, numVerts) : 

    irregularity = clip(irregularity, 0,1) * 2*math.pi/numVerts 
    spikeyness = clip(spikeyness, 0,1) * aveRadius 

    # generate n angle steps 
    angleSteps = [] 
    lower = (2*math.pi/numVerts) - irregularity 
    upper = (2*math.pi/numVerts) + irregularity 
    sum = 0 
    for i in range(numVerts) : 
     tmp = random.uniform(lower, upper) 
     angleSteps.append(tmp) 
     sum = sum + tmp 

    # normalize the steps so that point 0 and point n+1 are the same 
    k = sum/(2*math.pi) 
    for i in range(numVerts) : 
     angleSteps[i] = angleSteps[i]/k 

    # now generate the points 
    points = [] 
    angle = random.uniform(0, 2*math.pi) 
    for i in range(numVerts) : 
     r_i = clip(random.gauss(aveRadius, spikeyness), 0, 2*aveRadius) 
     x = ctrX + r_i*math.cos(angle) 
     y = ctrY + r_i*math.sin(angle) 
     points.append((int(x),int(y))) 
     angle = angle + angleSteps[i] 

     return points 

def clip(x, min, max) : 
    if(min > max) : return x  
    elif(x < min) : return min 
    elif(x > max) : return max 
    else :    return x 


verts = generatePolygon(ctrX=250, ctrY=250, aveRadius=100, irregularity=0, spikeyness=0, numVerts=16) 

tupVerts = list(map(tuple,verts)) 

print(tupVerts) 
+0

問題は、 'generatePolygone'であまりにも多くインデントされた' return'ステートメントです。 – Julien

+0

興味深いコード。 'list(map(tuple、verts))'を実行しても意味がありません: 'verts'はすでにタプルのリストです。ところで、変数名として 'sum'、' min'、 'max'を使うべきではありません。なぜなら、それらは同じ名前の組み込み関数を陰にするからです。 (代わりに 'total'、' lo'と 'hi'を使うことをお勧めします)。また、通常のPythonの規約では、camelCaseではなく単純な変数名にsnake_caseを使用しています。詳しくは、[PEP-0008](https://www.python.org/dev/peps/pep-0008/)を参照してください。 –

答えて

0

1つのポイントを計算した後、あなたの関数からすぐに返されました。問題は次のとおりです。

for i in range(numVerts) : 
    r_i = clip(random.gauss(aveRadius, spikeyness), 0, 2*aveRadius) 
    x = ctrX + r_i*math.cos(angle) 
    y = ctrY + r_i*math.sin(angle) 
    points.append((int(x),int(y))) 
    angle = angle + angleSteps[i] 

    return points # <--- here 

for i in range(numVerts) : 
    r_i = clip(random.gauss(aveRadius, spikeyness), 0, 2*aveRadius) 
    x = ctrX + r_i*math.cos(angle) 
    y = ctrY + r_i*math.sin(angle) 
    points.append((int(x),int(y))) 
    angle = angle + angleSteps[i] 

return points # <--- Should look like this 
関連する問題