IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Tangente en un point d'une courbe


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Par défaut Tangente en un point d'une courbe
    Bonjour,

    Je suis en train de réaliser une application qui dessine le contour d'une forme.

    Je voudrais maintenant calculer la tangente et la normale au contour en un certain point. Cependant, je ne connais que quelques points du contour mais pas l'équation de la fonction (simplement dessinée avec drawCurved).

    J'ai donc utilisé une approximation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    dx = X(i+1) - X(i-1);
    dy = Y(i+1)- Y(i-1);
     
    (tx, ty) = (dx,dy)/(sqrt(dx^2 + dy^2));
    (tx,ty) est alors le vecteur unité de la tangente et (-ty, tx) le vecteur unité de la normale mais le résultat n'est pas satisfaisant !

    Il faudrait donc que je passe par la dérivée de la fonction...mais que je n'ai pas. Avez-vous une idée? Si je dois installer un librairie pour les dérivées, cela ne me dérange pas...

    Merci pour vos réponses

  2. #2
    Expert confirmé
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Par défaut
    Tu prends tes point i-1 et i+1 ... as tu essayé de prendre plus de sample ? ( i -2, i - 3, .., i +2, i+3, ... ) ..

    Voici les belles formules de maths http://fr.wikipedia.org/wiki/Tangent...9om%C3%A9trie)

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Tu transformes tes points en polynome, et tu calcules la dérivée du polynome (c'est facile)...

    Il y a plusieurs méthodes de créer un polynome, si tu as un nombre fini (<10 par exemple) de points caractèristiques, tu peux utiliser une série de lagrange...

    J'ai choppé un petit bout de code (C) de mon moteur:
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    void	Polynom_MakeLagrangeSerie(Float_t* aDst, UInt_t deg, const Float_t* aX, const Float_t* aY)
    {
    	// Lagrange serie construction... thats "quite" easy... we just "add" deg+1 polynoms (of degree deg) together...
    	// For each polynom 'i', the polynom to add is the products of all (x - aX[j]) with (j != i).
    	// each polynom is then multiplied by aY[i] and devided by its value when x = aX[i], final result being aY[i] at aX[i], and 0 at aX[j],j!=i
     
    	// cleaning destination polynom...
    	RW_MEMCLEAR(aDst,sizeof(Float_t)*deg);
     
    	// allocating temporary polynom...
    	Float_t* aTmp = RW_ALLOC_ARRAY(Float_t,deg+1);
    	for (UInt_t i = 0; (i <= deg); ++i) {
    		Float_t val = aY[i];
    		if (val) {
    			Float_t tmpEval = 1.f;
    			RW_MEMCLEAR(aTmp,sizeof(Float_t)*deg);
    			aTmp[0] = 1.f; // ALWAYS !!
    			// ok... computing the polynom to add with 'i'
    			UInt_t n = 0;
    			for (UInt_t j = 0; (j <= deg); ++j) {
    				if (i != j) {
    					tmpEval *= (aX[i] - aX[j]);
    					++n;
    					for (UInt_t k = n; (k > 0); --k)
    						aTmp[k] = aTmp[k-1] - aX[j] * aTmp[k];
    					aTmp[0] *= -aX[j];
    				}
    			}
    			// Mult of the polynom !
    			Polynom_MAdd(aDst,aDst,deg,aTmp,deg,(val / tmpEval));
    		}
    	}
    	// WE ARE DONE !!!
    	RW_FREE(aTmp);
    }
     
     
    void	Polynom_MAdd(Float_t* pOut, const Float_t* pSrc1, UInt_t deg1, const Float_t* pSrc2, UInt_t deg2, Float_t f)
    {
    	UInt_t deg = RW_MIN2(deg1,deg2);
    	UInt_t i = 0;
    	for (;(i<=deg);++i) *pOut++ = *pSrc1++ + (*pSrc2++ * f);
    	for (;(i<=deg1);++i) *pOut++ = *pSrc1++;
    	for (;(i<=deg2);++i) *pOut++ = (*pSrc2++ * f);
    }

Discussions similaires

  1. Tangente en un point d'une courbe
    Par anna0510 dans le forum MATLAB
    Réponses: 3
    Dernier message: 06/01/2014, 13h57
  2. séléctionner le point d'une courbe avec la souris et un axe
    Par maristil dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 10/04/2009, 11h57
  3. Déplacer un point sur une courbe
    Par Wassim123 dans le forum MATLAB
    Réponses: 3
    Dernier message: 19/09/2007, 13h23
  4. Réponses: 4
    Dernier message: 22/05/2007, 17h08
  5. Réponses: 2
    Dernier message: 22/09/2005, 21h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo