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++

  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