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.

savoir si il y a un angle (tkinter)

+2 votes

Yop,
Je suis de retour avec mon petit projet tkinter ;p
Au stade où j'en suis, j'aimerai repérer un angle formé à partir de points de coordonnées, pour répondre à cette problématique (selon la méthode glassner):

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).

Donc mon code à ce stade là scanne tous les points de coordonnées pour définir lesquelles sont des murs (tag : murOk) et lesquelles sont voisins, voici le résultat de l'exécution donnée à ce stade là :
graphiquement, les murs tracés ressemblent à cela :


image

et les résultats de la ligne de commande à ça (scanne chaque point faisant partie du mur et définit ses voisins s'ils font partie du murs eux aussi, ici ce qu'on appelle mur sont les points reliés par le trait bleu ainsi que les points jaune à l'extrémité ):

[200, 200, 220, 220]  est voisin de  [170, 230, 190, 250]
[200, 200, 220, 220]  est voisin de  [170, 170, 190, 190]
[200, 200, 220, 220]  est voisin de  [230, 170, 250, 190]
[290, 290, 310, 310]  est voisin de  [260, 260, 280, 280]
[260, 260, 280, 280]  est voisin de  [290, 290, 310, 310]
[260, 260, 280, 280]  est voisin de  [230, 290, 250, 310]
[260, 260, 280, 280]  est voisin de  [290, 230, 310, 250]
[170, 230, 190, 250]  est voisin de  [200, 200, 220, 220]
[260, 200, 280, 220]  est voisin de  [290, 170, 310, 190]
[260, 200, 280, 220]  est voisin de  [230, 170, 250, 190]
[260, 200, 280, 220]  est voisin de  [290, 230, 310, 250]
[170, 170, 190, 190]  est voisin de  [200, 200, 220, 220]
[290, 170, 310, 190]  est voisin de  [260, 200, 280, 220]
[230, 170, 250, 190]  est voisin de  [200, 200, 220, 220]
[230, 170, 250, 190]  est voisin de  [260, 200, 280, 220]
[230, 290, 250, 310]  est voisin de  [260, 260, 280, 280]
[290, 230, 310, 250]  est voisin de  [260, 260, 280, 280]
[290, 230, 310, 250]  est voisin de  [260, 200, 280, 220]

Comment savoir si des points de coordonnées faisant partie du mur constituent un angle?
@bubulle Edit : La question revient à évaluer trois points A, B et C, de coordonnées (xA,yA,zA,wA ; xB,yB,zB,wB, ; xC,yC,zC, wC respectivement) et définir si les droits AB et AC forment un angle droit tout en prenant en compte la façon dont les coordonnées sont codés ci-dessus .
Et au passage un petit conseil pour construire l'angle droite en tkinter avec du createline ou createrectangle en fonction des points de coordonnées serait le bienvenue x)

demandé 4-Mai-2015 par boblinux (3,092 points)
edité 8-Mai-2015 par boblinux

De mon point de vue, il s'agit d'un petit problème de géométrie cartésienne.
Je peux te proposer une formule si tu exprimes ton problème dans des termes du genres:

J'ai 3 points A, B et C de coordonnées (xa, ya, za), (xb, yb,
z
b) et (xc, yc, z_c). Comment savoir que les droites AB et AC sont
parallèles ? orthogonales ?

Enfin, tu vois l'esprit...

(pas con) j'édit mon post =D

1 Réponse

+2 votes
 
Meilleure réponse

Je suis surpris que tu ais 4 coordonnées pour tes points mais pourquoi pas, la 3D c'est has-been ;)

Voici une manière de faire :
Je suppose que A, B et C sont des listes des coordonnées décrivant trois points, angle_droit(A, B, C) retourne True si les droites AB et AC sont perpendiculaires.

vecteur = lambda p1, p2: [c2-c1 for (c1, c2) in zip(p1, p2)]
produit_scalaire = lambda v1, v2: sum(c1*c2 for (c1, c2) in zip(v1, v2))
angle_droit = lambda a, b, c: produit_scalaire(vecteur(a, b), vecteur(a, c)) == 0
répondu 5-Mai-2015 par bubulle (2,120 points)
sélectionné 18-Mai-2015 par boblinux
...