Mouvement affine vitesse uniforme

Résolu/Fermé
Gerik0 Messages postés 8 Date d'inscription samedi 15 avril 2017 Statut Membre Dernière intervention 7 juin 2017 - 24 mai 2017 à 21:36
Gerik0 Messages postés 8 Date d'inscription samedi 15 avril 2017 Statut Membre Dernière intervention 7 juin 2017 - 7 juin 2017 à 22:48
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

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 samedi 15 avril 2017 Statut Membre Dernière intervention 7 juin 2017
Modifié le 25 mai 2017 à 00:34
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 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > Gerik0 Messages postés 8 Date d'inscription samedi 15 avril 2017 Statut Membre Dernière intervention 7 juin 2017
Modifié le 25 mai 2017 à 15:24
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 samedi 15 avril 2017 Statut Membre Dernière intervention 7 juin 2017
26 mai 2017 à 12:00
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 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
Modifié le 25 mai 2017 à 11:43
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 samedi 15 avril 2017 Statut Membre Dernière intervention 7 juin 2017
26 mai 2017 à 12:10
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 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > Gerik0 Messages postés 8 Date d'inscription samedi 15 avril 2017 Statut Membre Dernière intervention 7 juin 2017
Modifié le 26 mai 2017 à 12:30
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 samedi 15 avril 2017 Statut Membre Dernière intervention 7 juin 2017
7 juin 2017 à 22:48
J'ai compris ! Merci beaucoup !
0