PDA

Voir la version complète : Subdivision et n-gones



César Vonc
13/03/2012, 17h17
Bonjour,

Je suis actuellement sur un script Python subdivisant un maillage selon la méthode Doo-Sabin qui, en gros, ajoute un polygone à chaque arête et chaque sommet.


Cependant, je bloque sur deux points au sujet des polygones de sommet :

Je n'arrive pas à définir correctement l'ordre de leurs points ABCD, ce qui fait que le nouveau polygone a parfois la diagonale dans le mauvais sens. Y a-t-il un moyen pour que C4d définisse tout seul comment organiser de façon optimale l'ordre de ces points, à la manière d'un n-gone ?

Le second problème est que les polygones de sommets ont autant de côtés que le sommet d'origine a de polygones adjacents. En clair il faut que je puisse créer des n-gones (pour, par exemple, le sommet de la structure de l'image ci-dessous) or je ne trouve pas comment procéder en Python, est-ce faisable ?


http://img4.imageshack.us/img4/5474/doosab.th.png (http://img4.imageshack.us/img4/5474/doosab.png)




PS : Oups, pourrait-on déplacer mon sujet dans le forum Programmation ?

Aurety
13/03/2012, 17h41
Déplacé César ! Tu penses bien que je ne peux pas t'aider mais par contre ce que je peux te dire c'est que lorsque tu "créés un polygone" , le sens des aiguilles d'une montre te donne du positif et l'inverse du négatif. :icon_grin:

César Vonc
13/03/2012, 23h31
Merci Aurety.

Oui, en fait je voulais éviter d'avoir à chercher l'ordre des points pour chaque nouveau polygone, histoire de ne pas alourdir mon script, déjà qu'il s'exécute assez lentement...


Ceci dit, j'ai pu récupérer cet ordre sous forme d'un tableau comme ceci :


[[9, 16], [67, 16], [9, 123], [109, 123], [67, 109]]

Qui signifie que le point 9 est connecté au 16, le 67 au 16, le 9 au 123, etc. (le polygone ici est un pentagone).

Je dois donc transformer cette liste de connexions en une seule liste :


[9, 16, 67, 109, 123]

Quelqu'un a-t-il une idée pour ce faire de façon la plus économe qui soit ?

ksaa
14/03/2012, 03h31
un petit essai :)



import c4d, math
from c4d import gui
#Welcome to the world of Python


def main():
a = [[9, 16], [67, 16], [9, 123], [109, 123], [67, 109]]
b= []
for x in xrange(len(a)):
for y in xrange(len(a[x])):
b.append(a[x][y])


setB = set(b)
ls = list(setB)

print a
print ls

if __name__=='__main__':
main()

oli_d
14/03/2012, 04h55
ksaa, ton code est bien, mais je pense que César a besoin de récupérer les points dans l'ordre des arrêtes.

César pour les N-Gones, il ne me semble que malheureusement se soit encore impossible en python. J'espérais que cela vienne avec la R13, mais c'est raté (en C++ c'est possible). Enfin si tu trouves ça m'intéresse

Pour ton problème j'utiliserais un dictionnaire, genre :


import c4d


def main():
a = [[9, 16], [67, 16], [9, 123], [109, 123], [67, 109]]
#dictionnaire qui permettra pour chaque point de retrouver les adjacents
dic = {}

for i,n in a:
#pour chaque valeur on rentre dans le dictionnaire les nombres
#une fois en etiquette et une fois dans la liste de valeur

if dic.get(i,None): dic[i].append(n)
else : dic[i]=[n]

if dic.get(n,None): dic[n].append(i)
else : dic[n]=[i]

#on prend le premier point
pt = a[0][0]
lst = []

while pt:
#tant qu'on trouve un point on l'ajoute a la liste
lst.append(pt)
#on regarde les points adjacents
for p in dic[pt]:
#si on ne l'a pas dans notre liste on le rajoute et on quitte la boucle for...
if p not in lst :
pt = p
break
else : pt =None
print lst




if __name__=='__main__':
main()Il y a probablement plus simple, mais ça à l'air de marcher

César Vonc
14/03/2012, 22h47
Merci bien, en fait je viens de trouver une solution qui résout mes deux problèmes en même temps !

Vu qu'on ne peut pas créer de n-gones en Python, je créé un triangle par connexion dans mon tableau :

[[9, 16], [67, 16], [9, 123], [109, 123], [67, 109]]avec comme premier point le premier de la liste :
[9, 16] : Pas de triangle
[67, 16] : Triangle 9, 67, 16
[9, 123] : Pas de triangle
[109, 123] : Triangle 9, 109, 123
[67, 109] : Triangle 9, 67, 109

Ce qui me donne bien 3 triangles constituant le pentagone 9, 19, 67, 109, 123.

Pour le transformer en n-gone, je les ajoute à la sélection et exécute la commande Fusion :



commandeid = c4d.MCOMMAND_MELT
marque = c4d.MODELINGCOMMANDFLAGS_CREATEUNDO
mode = c4d.MODELINGCOMMANDMODE_POLYGONSELECTION
converti = utils.SendModelingCommand(command=commandeid, list=[obj], doc=doc, flags=marque, mode=mode)
Et le tour est joué !

http://img849.imageshack.us/img849/996/cubedoosabin.png



Il ne me reste plus qu'un seul problème : détecter les n-gones de mon objet avant la subdivision, car la fonction GetPolygon() ne s'applique qu'aux quadrangles et le résultat est fâcheux pour un objet plus complexe qu'un cube.

Je vais voir du côté de GetNgonEdgesCompact().