Longueur et normale à une spline cubique

Bonjour,
J'ai une spline cubique dans le plan 2D d'équation :
xc=at³+bt²+ct+d
yc=at³+bt²+ct+d
t variant de 0 à N
je voudrais connaître l'équation de la droite perpendiculaire à la spline au point x0 / y0 point de la spline, équation qui devra être de la forme y=ax+b ou x=a
deuxièmement je voudrais connaître la longueur de la spline
Comme vous pouvez le voir toute la difficulté vient du fait que la spline est décrite par deux équations, une en x et une en y et non une seulement en y.
Merci
Bien cordialement

Réponses

  • Bonjour.

    Pour une courbe paramétrée (x(t),y(t)), un vecteur directeur d'une tangente en $M(x(t_0),y(t_0))$ est le vecteur de composantes $(x'(t_0),y'(t_0))$; sauf si ces deux dérivées sont simultanément nulles. On en déduit facilement un vecteur normal $(y'(t_0),-x'(t_0))$ puis l'équation d'une normale.

    Cordialement.
  • Bonjour,
    merci !
    deux autres questions :
    1 : que faire si les deux dérivées sont nulles
    2 : merci mais tu ne m'as pas répondu pour la longueur ?
    Bien cordialement
  • 1) voir un cours sur les courbes paramétrées. Le cas se présente rarement, je doute qu'il arrive avec les spline.
    2) voir un cours sur les applications de l'intégration (ou simplement taper "longueur d'une courbe" sur un moteur de recherche).
  • Désolé mais le cas de la longueur d'un arc dans le cas de splines cubiques paramétrées je ne sais pas faire, je ne sais pas intégrer sur plusieurs variables.
    Y a-t-il une âme charitable pour me donner la formule exacte dans ce cas précis ?
  • Il y a un seul paramètre et ce paramètre est la seule variable d'intégration !
    Tu as une paramétrisation $M(t)$ et tu veux savoir la distance parcourue par le point $M$ quand $t$ varie de $0$ à $N$. C'est facile : tu intègres de $0$ à $N$ la norme du vecteur vitesse $M'(t)$.
  • Je ne comprends pas désolé je suis nul en maths,
    pendant que j'y suis je voudrais aussi savoir le centre de cette courbe.
  • Pourquoi alors poses-tu cette question (de la longueur de la courbe) ?
    Et qu'est-ce que le "centre" d'une courbe ???
  • En fait je voudrais directement l'équation de la longueur de la courbe, c'est pour un programme informatique.
    J'appelle centre de la courbe le point de celleci à égale distance des deux extrémités en suivant la courbe.
  • Deux remarques pas très intéressantes. Si on a \[\begin{cases} x_c=at^3+bt^2+ct+d\\
    y_c=at^3+bt^2+ct+d, \end{cases}\]alors $x_c=y_c$ pour tout $t$. Autrement dit, pour dire que $x_c$ et $y_c$ sont paramétrés par des polynômes de degré $3$ quelconques, il faut choisir des lettres différentes. On peut noter $a$, $b$, etc., des réels quelconques mais d'une ligne à l'autre, ils faut qu'ils gardent la même valeur, sans quoi on ne peut pas faire le moindre calcul. C'est la raison pour laquelle il est maladroit de parler de $y=ax+b$ ou de $x=a$ juste en-dessous, vu que $a$ et $b$ sont « déjà pris ».

    Comme le dit Gérard, il est rare que les deux dérivées s'annulent en même temps avec des données « de la vraie vie ». Si jamais cela arrivait, on pourrait utiliser une version de la règle de L'Hôpital. Ce que l'on cherche, c'est équation de la tangente. On la met sous forme $y=px+q$ si on peut. En fait, c'est surtout la pente de la tangente qu'on cherche, c'est-à-dire $p$, et on en déduit $q$ par $q=y_c(t_0)-px_c(t_0)$. En général, elle vaut $p=\frac{y'(t_0)}{x'(t_0)}$. Si $x'(t_0)=0$ et $y'(t_0)\ne0$, ce quotient « vaut » $\infty$, la tangente est verticale. Si $x'(t_0)=0=y'(t_0)$, on peut chercher $\lim_{t\to t_0}\frac{y'(t)}{x'(t)}$, qui par la règle de L'Hôpital vaut $\frac{y''(t_0)}{x''(t_0)}$ si ce quotient existe dans $\R\cup\{\infty\}$. S'il n'existe pas, on est vraiment badloqué en maudit, c'est que $y''(t_0)=0=x''(t_0)$. On peut alors jouer au même jeu et obtenir $\lim_{t\to t_0}\frac{y'(t)}{x'(t)}=\frac{y'''(t_0)}{x'''(t_0)}$ (et là, les deux ne s'annuleront pas simultanément parce qu'on part de polynômes de degré au plus $3$ : soit la dérivée troisième est constante et non nulle, soit le degré était au plus $2$ et une dérivée d'ordre $1$ ou $2$ constante et non nulle était apparue avant).

    Bref, voici une présentation possible du calcul :
    1. Si $x'(t_0)\ne0$, alors $p=\dfrac{y'(t_0)}{x'(t_0)}$ et $q=y_c(t_0)-px_c(t_0)$.
    2. Si $x'(t_0)=0$, deux sous-cas :
      1. si $y'(t_0)\ne0$, alors « $p=\infty$ » : la tangente est verticale, son équation est $x=x_c(t_0)$ ;
      2. si $y'(t_0)=0$, deux sous-sous-cas :
        1. si $x''(t_0)\ne0$, alors $p=\dfrac{y''(t_0)}{x''(t_0)}$ et $q=y_c(t_0)-px_c(t_0)$ ;
        2. si $x''(t_0)=0$, deux sous-sous-sous-cas :
          • si $y''(t_0)\ne0$, alors « $p=\infty$ » : la tangente est verticale, son équation est $x=x_c(t_0)$ ;
          • si $y''(t_0)=0$, alors $p=\dfrac{y'''(t_0)}{x'''(t_0)}$ et $q=y_c(t_0)-px_c(t_0)$.
  • Bonjour,

    Si tu es "nul en maths", pourquoi donc as tu besoin de ça ?
    Tu pourrais te donner la peine d'expliquer ton contexte.
    L'habitude ici est d'aider les gens qui font preuve de bonne volonté, mais pas de faire leur travail à leur place.

    Cordialement,

    Rescassol
  • Merci cela répond à ma question sur l'équation de la droite perpendiculaire.
    Oui en effet j'aurais dû les appeler a_x,b_x,c_x,d_x et a_y,b_y,c_y,d_y car les coefficients a,b,c,d de la première équation ne sont pas les même que pour la deuxième désolé
  • Pour répondre à la question de Rescassol : je suis informaticien donc je n'ai pas toutes compétences en mathématiques, je pensais peut-être naïvement que je pouvais poser mes questions sur ce forum.
    Quand on ne s'y connais pas dans un domaine trois solutions :
    - se former soi-même : long, incertain et coûteux
    - payer quelqu'un pour réfléchir à notre place : coûteux mais bon faisable si on a pas le choix
    - demander sur un forum : gratuit et les réponses pourront être réutilisées par d'autres personnes de passage
    Si je n'obtiens pas les réponses à mes questions sur ce forum je paierai des professeurs mais ça serait quand même malheureux d'en arriver là
  • Pour expliquer brièvement le contexte : je travaille sur un logiciel de mesures de feuilles sur parts d'herbier, donc je modélise les nervures par des splines cubiques et j'ai besoin de connaître la perpendiculaire à la nervure médiane pour la tester à différents niveaux et trouver la tranche la plus large pour calculer la largeur de la feuille, puis de mesurer la longueur de cette nervure médiane et j'ai aussi besoin de connaître le centre de cette nervure médiane
  • Bonjour,

    Je n'ai pas dit que tu n'aurais pas d'aide ici, mais que tu ne sois pas un étudiant paresseux qui demande qu'on lui fasse son travail n'était pas évident à priori, en l'absence de précision du contexte.
    Bon, en quel langage programmes tu ?
    Dans le cadre de la programmation de quelle application utilises tu des splines ?
    Ce que t'as répondu Math Coss t'est il compréhensible ?
    Jusqu'à quel niveau es tu allé en math ?

    Cordialement,

    Rescassol
  • je programme en C++, c'est dans le cadre d'une application appelée BIOASPOR en liaison avec le Muséum de Paris, l'Université de Poitiers et Tela-Botanica cette application sera open-source.
    Oui la réponse de Math Cross est compréhensible pour moi
    j'ai un niveau L2 en maths mais ça date de plus de 10 ans alors j'ai pas mal oublié !
  • Bonjour,

    C'est plus clair maintenant.
    Ce que tu appelles centre de la nervure, est ce le centre de gravité de la courbe spline, ou autre chose ?
    La perpendiculaire au point $(x_0,y_0)$ de paramètre $t_0$ a pour vecteur directeur par exemple $\overrightarrow{V}(Y'_c(t_0),-X'_c(t_0))$.

    Cordialement,

    Rescassol
  • Attention, ce que j'ai écrit, c'est pour la tangente et pas la normale.

    Pour la longueur, la formule générale de la longueur d'une courbe paramétrée par $(x(t),y(t))$ avec $t\in[a,b]$ est : \[L=\int_a^b\sqrt{x'(t)^2+y'(t)^2}\mathrm{dt}.\] Pour en calculer une approximation numérique (on ne peut pas espérer une formule si $x$ et $y$ sont des polynômes de degré $\ge2$), un bon compromis entre facilité de calcul et efficacité est la méthode de Simpson : \[L\simeq
    \frac{h}{3}\bigg[f(x_0)+2\sum_{j=1}^{n/2-1}f(x_{2j})+4\sum_{j=1}^{n/2}f(x_{2j-1})+f(x_n)\bigg],\] avec
    • $\displaystyle f(t)=\sqrt{x'(t)^2+y'(t)^2}$ pour tout $t$, c'est la fonction à intégrer ;
    • $n$ est le nombre (pair) d'intervalles dans la subdivision, qu'il faut choisir en fonction de la précision souhaitée ;
    • $h=\dfrac{b-a}{n}$ est le pas de la subdivision ;
    • $x_j=a+jh$ pour tout $j\in\{0,\dots,n\}$.
    Difficile de dire a priori quelle valeur de $n$ choisir parce que la précision est proportionnelle à $\frac{(b-a)^5}{n^4}\max|f^{(4)}|$, c'est-à-dire qu'elle dépend de $f$.
  • Ok il m'a fallu un petit temps pour comprendre le problème de la longueur mais c'est OK pour moi reste le centre
  • ce que j'appelle centre de la spline c'est le point de cette spline où les deux parties de la spline de chaque côté jusqu'aux extrémités sont de même longueur donc je pense qu'il s'agit bien du centre de gravité
  • Bonjour,
    je vous pose cette question car elle peut être vue d'un point de vue mathématique (géométrie) et est à la frontière avec l'informatique (traitement d'image).
    Soit une feuille dentée comme celle-ci :
    http://uptreeid.com/PICSleafonly/TermSimpleTooth.jpg
    Nous sommes dans le plan 2D donc avec des x et des y, je connais le contour de la feuille comme suite de couples (x,y) et peut déterminer si un pixel fait ou non partie de la feuille.
    Je voudrais connaître et séparer les dents de cette feuille (points bas avant, arrière et sommets), une idée de comment faire, je sais le problème n'est pas simple.
    Le contour de la feuille peut être vue comme une courbe paramétrique.
    Merci
    Cordialement.

    [Restons dans la discussion que tu as ouverte sur le sujet AD]
  • Non, ce n'est pas le centre de gravité.
  • OK donc reste deux questions le centre de la spline et cette nouvelle question
    En tout cas je vous remercie vivement des réponses données
  • j'ai codé la formule de la longeur mais ça ne fonctionne pas
    j'obtiens en effet de hautes valeurs pour chaque f(xj)
    voilà comment j'ai dérivé la fonction x et y :
    x'=3ax*x²+2bxx+c
    y'=3ay*y²+2byy+c
    est-ce bien cela ou dois-je faire ainsi :
    x'(t)=x(t)-x(t-1)
    ?
    Merci
  • Heu ... pourquoi est-ce le même c ?

    Qu'est-ce que ça veut dire "de hautes valeurs pour chaque f(xj) " ?
  • pour le c c'est une faute de frappe
    dans la formule de Math Coss il y a des f(x_j) et ils ont de hautes valeurs dans mon algo dues au fait que les coefficients constants c de la dérivée ont de hautes valeurs (de l'ordre de 700), du coup quand j'en fait la somme par la formule de Simpson et car j'ai pris un n = 10000 j'obtiens des valeurs de longueur de l'ordre de 1015 alors que je devrais trouver des valeurs de l'ordre de 1000
  • je pense que soit il faut diviser la somme à la fin par autre chose que h/3 soit je me suis trompé dans la formule de la dérivée
  • mes splines sont en effet quasi-verticales, c'est peut-être un cas particulier ?
  • personne pour mes trois questions ?
    résumé des questions :
    - dents d'un feuille
    - centre d'une spline cubique
    - problème dans le calcul de la longueur d'une spline cubique
  • Pour détecter les dents, une suggestion un peu vague qui marche si les points du bords, disons $(M_i)_{0\le i\le n}$ sont assez nombreux et s'ils sont donnés dans l'ordre. Elle consiste à détecter les discontinuités de l'angle formé par l'axe des abscisses et le vecteur $\overrightarrow{M_iM_{i+1}}$, calculé par
    atan2(y[i+1]-y[i ], x[i+1]-x[i ])
    
    En effet, en un point de rebroussement, la valeur de cet angle devrait changer pratiquement de $\pi$, du moins une dent « devrait se voir ». Une façon de tester : afficher la liste de ces valeurs, détecter s'il y a des sauts importants ($>\frac\pi2$ ?), tracer en rouge les pixels correspondants aux points où l'indice est celui d'un saut important.


    Pour le calcul de la longueur, c'est un peu décevant que ça marche si mal. Qu'est-ce que ça donne avec $n=100$ intervalles au lieu de $10000$ ?
  • OK merci je testerai plus tard pour les dents mais je ne pense pas que ça marche car en effet les dents peuvent être de n'importe quel angle d'orientation et plus ou moins convexes, pour la longueur non ça ne marche pas non plus avec 100 mais j'ai une idée c'est faire la somme de tous les segments (xi,yi;xi+1,yi+1)
  • pour les dents une idée pourrait être de calculer la courbure qui doit être signée en un point de contour et de repérer les changements de signe
  • mais comment calculer cette courbure signée (là j'ai encore besoin des maths)
  • du genre une courbure négative si le sommet de la courbure est dirigé vers le centre du contour et positive sinon
  • Voici qui ne répond pas tout à fait à la question : le rayon du cercle circonscrit à un triangle $M_1M_2M_3$, où les coordonnées de $M_1$ sont (x1,y1), etc., est : \[r = \frac{\sqrt{ (x_1^2 - 2x_1x_2 + x_2^2 + y_1^2 - 2y_1y_2 + y_2^2)
    (x_1^2 - 2x_1x_3 + x_3^2 + y_1^2 - 2y_1y_3 + y_3^2)
    (x_2^2 - 2x_2x_3 + x_3^2 + y_2^2 - 2y_2y_3 + y_3^2)}}
    {2(-x_2y_1 + x_3y_1 + x_1y_2 - x_3y_2 - x_1y_3 + x_2y_3)}.\] En plus exploitable :
    r = 1/2*sqrt( (x1^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2)
        *(x1^2 - 2*x1*x3 + x3^2 + y1^2 - 2*y1*y3 + y3^2)
        *(x2^2 - 2*x2*x3 + x3^2 + y2^2 - 2*y2*y3 + y3^2) )
        /(-x2*y1 + x3*y1 + x1*y2 - x3*y2 - x1*y3 + x2*y3)
    
    Ce rayon a le signe du dénominateur :
    -x2*y1 + x3*y1 + x1*y2 - x3*y2 - x1*y3 + x2*y3
    
    lequel détermine si la base $(\overrightarrow{M_1M_2},\overrightarrow{M_1M_3})$ est directe ou pas. Autrement dit, ce signe est positif si « l'arc $M_1M_2M_3$ tourne vers la gauche » et négatif « s'il tourne vers la droite ». (Si le dénominateur est nul, les trois points sont alignés, pas de cercle circonscrit.)

    À moins que ce ne soit un secret industriel, tu pourrais poster un vrai fichier de points pour une feuille. (Il faudrait alors que tu postes un fichier texte avec un suffixe .tex ou .csv, qu'importe le format exact du contenu.)
  • J'avoue que j'ai un peu la flemme de poster un fichier CSV mais je n'en vois pas l'utilité car je te l'ai dit un contour est une suite de points contigus du contour de la feuille. Ce que j'ai un peu peur en ne prenant en compte que 3 pixels c'est que le bruit soit pris en compte, il faudrait en effet tenir compte au moins de 5 pixels avant et 5 pixels après
  • L'utilité, ce serait de me permettre de bricoler moi-même pour étayer ou rejeter moi-même, comme un grand garçon, les propositions passées et éventuelles à venir.

    L'inconvénient de prendre 5 points à la fois, c'est qu'en général il n'y a pas de cercle qui passe par cinq points pris au hasard. Voici une façon approchée de trouver quand même un cercle :
    • on se donne cinq points $M_i$ de coordonnées $(x_i,y_i)$ ($1\le i\le 5$) ;
    • pour $b,c,d\in\R$, on note $f(x,y)=x^2+y^2-2bx-2cy+d$ ;
    • on cherche $b$, $c$, $d$ qui minimise $S=\displaystyle\sum_{i=1}^5f(x_i,y_i)^2$ ;
    • le centre du cercle est $(b,c)$, le rayon est $\displaystyle\sqrt{b^2+c^2-d}$.
  • OK alors je vais t'envoyer ça
  • Merci pour les points. Ces feuilles sont bien rondes, hein ! Rien de miraculeux à proposer, deux remarques quand même :
    • la première chose que j'ai eu envie de faire, c'est de diviser toutes les coordonnées par $1000$ ; la deuxième, de faire une moyenne pour remplacer le point $M_k$ par une moyenne pondérée (un barycentre) \[\begin{pmatrix}\frac{1}{4}x_{k-1}+\frac24x_k+\frac14x_{k+1}\\\frac{1}{4}y_{k-1}+\frac24y_k+\frac14y_{k+1}\end{pmatrix}
      \quad\text{ou}\quad
      \begin{pmatrix}\frac{1}{16}x_{k-2}+\frac{4}{16}x_{k-1}+\frac{6}{16}x_k+\frac4{16}x_{k+1}+\frac{1}{16}x_{k+2}\\\frac{1}{16}y_{k-2}+\frac{4}{16}y_{k-1}+\frac{6}{16}y_k+\frac4{16}y_{k+1}+\frac{1}{16}y_{k+2}\end{pmatrix}
      \;:\]ça régularise un peu (voir figure jointe) ; les coefficients sont calculés d'après les coefficients du binôme ;
    • pour calculer la longueur si la courbe est données uniquement par des points, il suffit en effet de faire la somme des segments ; une formule comme Simpson ne se justifie que si on a des vrais paramétrages par des fonctions (comme dans le titre du message qui parle de spline).
    Figures pour montrer que « moyenner améliore » (un peu) : en vert, les points initiaux ; en bleu, les points moyennés :
    • (pdf) tracé du bord de la feuille ;
    • (ci-dessous à gauche) détail du précédent ;
    • (ci-dessous à droite) tracé de l'angle $(\vec{\imath},\overrightarrow{M_kM_{k+1}})$ (pour $k$ de $800$ à $1100$) comme ici : on voit apparaître des choses.
    83394
Connectez-vous ou Inscrivez-vous pour répondre.