Mouvement affine vitesse uniforme [Résolu]

Gerik0 8 Messages postés samedi 15 avril 2017Date d'inscription 7 juin 2017 Dernière intervention - 24 mai 2017 à 21:36 - Dernière réponse : Gerik0 8 Messages postés samedi 15 avril 2017Date d'inscription 7 juin 2017 Dernière intervention
- 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 !
Afficher la suite 

8 réponses

Répondre au sujet
0
Utile
3
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 8 Messages 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 ?
yg_be 4187 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 17 décembre 2017 Dernière intervention > Gerik0 8 Messages postés samedi 15 avril 2017Date d'inscription 7 juin 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).
Gerik0 8 Messages 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.
Commenter la réponse de clement
yg_be 4187 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 17 décembre 2017 Dernière intervention - Modifié par yg_be le 25/05/2017 à 11:43
0
Utile
3
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 8 Messages 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 !
yg_be 4187 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 17 décembre 2017 Dernière intervention > Gerik0 8 Messages postés samedi 15 avril 2017Date d'inscription 7 juin 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
Gerik0 8 Messages postés samedi 15 avril 2017Date d'inscription 7 juin 2017 Dernière intervention - 7 juin 2017 à 22:48
J'ai compris ! Merci beaucoup !
Commenter la réponse de yg_be