Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

dessiner un entrelacs tkinter

0 votes

Je suis sur un projet de dessin graphique en tkinter (certains ont dejà pu le remarquer avec mes anciens posts :p ).
le but est de dessiner un double quadrillage, un appelé "mur", dans lequel ce qu'on appelera entrelac ne doit en aucun cas franchir, et un autre appelé "cadre", c'est lui qui délimitera les dimensions de notre dessin.

création du quadrillage en guise d'exemple

On crée les coordonnées du cadre :

coords du cadre  {0: (0, 0, 20, 20), 1: (60, 0, 80, 20), 2: (120, 0, 140, 20), 3: (0, 60, 20, 80), 4: (60, 60, 80, 80), 5: (120, 60, 140, 80), 6: (0, 120, 20, 140), 7: (60, 120, 80, 140), 8: (120, 120, 140, 140)}

On ensuite un sous-quadrillage sur lequel se basera le mur avec les coordonnées :

coords du mur :  {0: (30, 30, 50, 50), 1: (90, 30, 110, 50), 2: (30, 90, 50, 110), 3: (90, 90, 110, 110)}

on relie quelques points du mur entre eux pour créer des murs justement !

dict create_line :  {0: (90.0, 30.0, 90.0, 90.0), 1: (30.0, 90.0, 90.0, 90.0)}

Ici on a crée deux lignes au clic souris.

Si vous voulez, ça donne un truc de ce genre :

image

Avec en jaune le quadrillage appelé "cadre", et en vert le quadrillage appelé "mur", ensuite le trait bleu que l'ont voit est le mur choisit crée en cliquant sur quelques points du quadrillage "mur".

Méthode pour créer l'entrelacs

J'aimerai maintenant crée un entrelacs celte à partir de ce quadrillage !
Voici une méthodologie proposée, celle de Glassner, quelques instructions détaillées ici.

Dans les grandes lignes, on a besoin de savoir ça

  • si l’arête et l’arête voisine sont sans mur alors on construit une diagonale qui représente le lieu de croisement de l’entrelacs et pour lequel il faudra distinguer le dessus du dessous par la suite (a),
  • si l’arête est sans mur et que l’arête voisine comporte un mur alors
    on trace une portion de courbe (1/8ème de cercle par exemple),
    parallèle au mur et qui doit se terminer au niveau de l’arête non
    marquée de façon à pouvoir dessiner par la suite le "dessus-dessous" (b),
  • si l’arête et l’arête voisine comportent chacune un mur alors si les
    murs associés forment un angle droit, on construit un angle droit ;
    si par contre ils sont parallèles, on construit un segment horizontal
    ou vertical (c).

Mon problème

Edit :
Dans un premier temps :
- Comment faire pour savoir si un point marqué comme 'murOk' est bien un voisin d'un autre marqué avec l e même tag?

Pour l'instant j'obtiens :

dict coords :  {(200, 260, 220, 280): 'murOk', (200, 200, 220, 220): 'mur', (290, 290, 310, 310): 'murOk', (230, 230, 250, 250): 'cadre', (170, 290, 190, 310): 'murOk', (260, 260, 280, 280): 'murOk', (170, 230, 190, 250): 'murOk', (260, 200, 280, 220): 'murOk', (170, 170, 190, 190): 'murOk', (290, 170, 310, 190): 'murOk', (230, 170, 250, 190): 'murOk', (230, 290, 250, 310): 'murOk', (290, 230, 310, 250): 'murOk'}

A savoir, tous les points marqués comme 'murOk', sont soit des points reliés directement, soit des points à l'extrémité du quadrillage, ces derniers sont considérés comme faisant partie du mur effectif pour la résolution du problème.

Ps : j'ai jamais codé en "prod", rien que des projets scolaires =/
Donc tout conseil d'ordre général sur la clarté du code, le pephuitage, les bonne méthodes de codage etc... est le bienvenue.

demandé 19-Avr-2015 par boblinux (3,092 points)
edité 22-Avr-2015 par boblinux

Je pense que sur cette question tu débordes du cadre d'IndexError (modèle question précise/meilleur réponse). Du coup je downvote.

Pose ton code, même si il est embryonnaire.

C'est noté jc, quand j'ai assez d'inspiration je poste le bout de code =D, c'est juste que je veux éviter de poster du code juste pour faire du bruit, j'aimerai poster le code qui permet qui a un rapport direct avec la résolution du problème (pas besoin de poster les codes permettant de montrer comment j'ai fait pour taguer mes points en fonction de s'ils sont reliés entre eux ou pas par ex...).
Mais étant donné que je n'ai pas bien saisi la méthode de résolution, c'est pas évident de poster du code pertinent.
Ps : j'ai édité ma question pour plus de précision et ai éliminé le bruit inutile

1 Réponse

0 votes
 
Meilleure réponse

Bon, après mûre reflexion, j'ai trouvé :

def is_neighboor(coord_srce,coord_dest):
    if ((bas_gauche(coord_srce,coord_dest)==True) or
       (bas_droit(coord_srce,coord_dest)==True) or
       (haut_droit(coord_srce,coord_dest)==True) or
       (haut_gauche(coord_srce,coord_dest)==True)) :
        return True
    else:
        return False

def bas_gauche(coord_srce,coord_dest):
    if (coord_dest[0] == coord_srce[0]-30) and (coord_dest[1] == coord_srce[1]+30) and (coord_dest[2] == coord_srce[2]-30) and (coord_dest[3] == coord_srce[3]+30):
        return True

def bas_droit(coord_srce,coord_dest):
    if (coord_dest[0] == coord_srce[0]+30) and (coord_dest[1] == coord_srce[1]+30) and (coord_dest[2] == coord_srce[2]+30) and (coord_dest[3] == coord_srce[3]+30):
        return True

def haut_droit(coord_srce,coord_dest):
    if (coord_dest[0] == coord_srce[0]+30) and (coord_dest[1] == coord_srce[1]-30) and (coord_dest[2] == coord_srce[2]+30) and (coord_dest[3] == coord_srce[3]-30):
        return True

def haut_gauche(coord_srce,coord_dest):
    if (coord_dest[0] == coord_srce[0]-30) and (coord_dest[1] == coord_srce[1]-30) and (coord_dest[2] == coord_srce[2]-30) and (coord_dest[3] == coord_srce[3]-30):
        return True
répondu 22-Avr-2015 par boblinux (3,092 points)
...