Mouvement affine vitesse uniforme

Résolu
Gerik0 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   -  
Gerik0 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je cherche à faire déplacer un point dans un repère en 2 dimensions de manière affine ( une fonction affine sera attribuée au point ) et avec une vitesse uniforme. C'est-à-dire que quelque soit sa trajectoire, le point se déplacera à la même vitesse.

Actuellement pour ça je calcul l'intersection entre une fonction affine donnée et un cercle de rayon R afin de trouver des nouvelles coordonnées x y.
def Intersection(a, b, Xc, Yc, R, w):
    """
    C(Xc;Yc;R)
    |  (x-Xc)^2 + (y-Yc)^2 = R^2
    |  y = ax+b

    x^2(1+a^2) + x(-2*Xc +2*a*b -2*a*Yc) + (Xc^2 +Yc^2 +b^2 -2*b*Yc -R^2) = 0
    """
    A, B, C = 1+pow(a,2), -2*Xc +2*a*b -2*a*Yc, pow(Xc,2)+pow(Yc,2)+pow(b,2)-2*b*Yc-pow(R,2)
    D = pow(B,2)-4*A*C

    return( [(-B-sqrt(D))/(2*A), (-B+sqrt(D))/(2*A)][w] )

Voilà ce que ça donne en Python, je trouve ce bout de code assez lourd. On m'a déjà dit de regarder du coté des fonction normées (https://fr.wikipedia.org/wiki/Norme_(mathématiques)#En_dimension_infinie) mais je n'ai jamais réussi a mettre ça en place.

Je fais appel à vous pour m'aider à trouver une meilleure solution svp.

Merci.
Bonne soirée !
A voir également:

2 réponses

clement
 
Tu créés ton objet point et tu lui donne une position x, par exemple, 10, et une position y qui sera ta fonction affine avec x.
Puis tu dois avoir une fonction update propre à ton objet point où tu augmente à chaque fois la valeur de self.x, par exemple self.x += 1. Tu n'as plus qu'à faire une boucle qui va appeler update... Après tu dois afficher ça à l'écran. Là, ça dépend de ton module qui s'occupe de l'interface graphique.
0
Gerik0 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
Merci de ta réponse, mais en fait tu m'as juste donné la définition d'une fonction affine.

import tkinter as tk
from random import randint
from math import sqrt

fen = tk.Tk()

can = tk.Canvas(fen, width=300, height=300, bg='#000')
can.pack()

class point:
    
    def __init__(self, x, y, c):
        # Point
        self.e = 5
        self.p = can.create_oval(x-self.e, y-self.e, x+self.e, y+self.e, fill=c)

        # Trajectoire
        self.a = -1*randint(0,5)/[1, 10][randint(0,1)]
        self.b = y
     
class trajectoire1(point):

    def __init__(self, x, y):
        point.__init__(self, x, y, '#00f')
        
        self.x = x
        
        self.update()

    def update(self):
        (x1, y1, x2, y2) = can.coords(self.p)
        self.x += 1

        y = self.a*self.x + self.b
        can.coords(self.p, self.x-self.e, y-self.e, self.x+self.e, y+self.e)

        fen.after(50, self.update)

class trajectoire2(point):

    def __init__(self, x, y):
        point.__init__(self, x, y, '#f00')
        self.update()

    def Intersection(self, a, b, Xc, Yc, R, w):
        """
        C(Xc;Yc;R)
        |  (x-Xc)^2 + (y-Yc)^2 = R^2
        |  y = ax+b

        x^2(1+a^2) + x(-2*Xc +2*a*b -2*a*Yc) + (Xc^2 +Yc^2 +b^2 -2*b*Yc -R^2) = 0
        """
        A, B, C = 1+pow(a,2), -2*Xc +2*a*b -2*a*Yc, pow(Xc,2)+pow(Yc,2)+pow(b,2)-2*b*Yc-pow(R,2)
        D = pow(B,2)-4*A*C

        return( [(-B-sqrt(D))/(2*A), (-B+sqrt(D))/(2*A)][w] )

    def update(self):
        (x1, y1, x2, y2) = can.coords(self.p)

        x = self.Intersection(self.a, self.b, (x1+x2)/2, (y1+y2)/2, 2, 1)
        y = self.a*x + self.b
        
        can.coords(self.p, x-self.e, y-self.e, x+self.e, y+self.e)

        fen.after(50, self.update)
        
def add():
    for h in range(2):
        trajectoire1(0, 300)
        trajectoire2(0, 300)

    fen.after(10000, add)
add()
    
fen.mainloop()

Ici les points rouges se déplacent uniformément contrairement aux points bleus.

Ce que je cherche c'est à améliorer la fonction Intersection qui sert à déplacer un objet de manière uniforme et quelque soit sa trajectoire donnée sous forme de fonction affine.

Il doit certainement y avoir une propriété mathématique pour ça ?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Gerik0 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
quand tu parles des points rouges et bleus, s'agit-il des points correspondants à trajectoire1 et trajectoire2?
comment se déplacent les points de trajectoire1? je m'attendrais à ce que ce soit un déplacement uniforme (à une vitesse constante, variable cependant en fonction de la fonction affine).
0
Gerik0 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
Oui tous les points se déplacent uniformément, mais je voudrais qu'il y est une vitesse de référence tu vois ? Les points rouges vont à la même vitesse quelque soit leur trajectoire. Parce que y = 10x se déplacera forcément plus que y = 0.1x.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
je pense que tu peux simplifier dramatiquement ton calcul.
comme ta fonction est affine et que le rayon de ton cercle est constant, il te suffit de calculer une seule fois (x-Xc) et (y-Yc).
à chaque itération, il te suffit d'ajouter ces valeurs constantes à Xc et de Yc.
par ailleurs, tu pourrais simplifier ton calcul d'intersection, en tenant compte que Yc = aXc +b et donc que (y-Yc) = a(x-Xc)
si tu écris Dy=(y-Yc) et Dx=(x-Xc),
Dx et Dy sont les solutions de:
Dy = aDx
Dx^2 + Dy^2 = R^2
Une autre possibilité serait d'utiliser les fonctions trigonometriques.
qu'en penses-tu?
0
Gerik0 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,
Je suis pas sur d'avoir compris parce que Yc et Xc sont les coordonnées du centre du cercle mais aussi de celui du points. Ce qui fait le déplacement à la même vitesse quelque soit la trajectoire c'est le rayon R, or dans ton équation final R n'y est pas.

Je vais essayé de m'orienter vers la trigonométrie.

Merci de prendre du temps pour me répondre !
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Gerik0 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
je pense que tu n'as pas compris.

1) si tu écris Dy=(y-Yc) et Dx=(x-Xc),
Dx et Dy sont les solutions de:
Dy = aDx
Dx^2 + Dy^2 = R^2
je suppose que tu peux facilement trouver Dx et Dy à partir de ces équations.
en fait: Dx = R/sqrt(1+A^2) et Dy = AR/sqrt(1+A^2)

2) il te suffit de calculer Dx et Dy une seule fois, il n'est pas utile de le faire à chaque itération.

3) à chaque itération, il suffit de calculer:
x=Xc+Dx
y=Yc+Dy
0
Gerik0 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai compris ! Merci beaucoup !
0