2017-03-28 3 views
0

Je suis un très gros et je fais un code pour faire un polygone aléatoire par python. Je ne trouve aucune erreur dans le code mais je ne peux pas imprimer tous les sommets mais seulement imprimer une paire de coordonnées x, y d'un sommet. Quelqu'un pourrait-il me le faire savoir? Je pense que la carte (tuple, verts) est quelque chose de problématique.Faire des polygones aléatoires en utilisant python

Merci beaucoup.

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

Le problème est votre instruction 'return' qui est indentée un trop grand nombre de fois dans' generatePolygone'. – Julien

+0

Code intéressant. Il ne sert à rien de faire 'list (map (tuple, verts))': 'verts' est déjà une liste de tuples. BTW, vous ne devriez pas utiliser 'sum',' min' ou 'max' comme noms de variables parce que cela occulte les fonctions intégrées des mêmes noms. (Je suggère d'utiliser 'total',' lo' et 'hi' à la place). En outre, la convention habituelle de Python est d'utiliser snake_case pour les noms de variables simples, pas camelCase, veuillez consulter [PEP-0008] (https://www.python.org/dev/peps/pep-0008/) pour plus de détails. –

Répondre

0

Vous êtes revenu trop tôt de votre fonction après avoir calculé un point. Voici le problème:

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