Signaler

Mouvement affine vitesse uniforme [Résolu]

Posez votre question Gerik0 8Messages postés samedi 15 avril 2017Date d'inscription 7 juin 2017 Dernière intervention - Dernière réponse le 7 juin 2017 à 22:48 par Gerik0
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 !
Utile
+0
plus moins
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.
Gerik0 8Messages postés samedi 15 avril 2017Date d'inscription 7 juin 2017 Dernière intervention - 25 mai 2017 à 00:27
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 ?
Répondre
yg_be 3576Messages postés lundi 9 juin 2008Date d'inscription ContributeurStatut 19 octobre 2017 Dernière intervention - 25 mai 2017 à 15:09
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).
Répondre
Gerik0 8Messages postés samedi 15 avril 2017Date d'inscription 7 juin 2017 Dernière intervention - 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.
Répondre
Donnez votre avis
Utile
+0
plus moins
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?
Gerik0 8Messages postés samedi 15 avril 2017Date d'inscription 7 juin 2017 Dernière intervention - 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 !
Répondre
yg_be 3576Messages postés lundi 9 juin 2008Date d'inscription ContributeurStatut 19 octobre 2017 Dernière intervention - 26 mai 2017 à 12:26
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
Répondre
Gerik0 8Messages postés samedi 15 avril 2017Date d'inscription 7 juin 2017 Dernière intervention - 7 juin 2017 à 22:48
J'ai compris ! Merci beaucoup !
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !