Opérations géométriques en C

Fermé
leoliom Messages postés 171 Date d'inscription jeudi 21 juillet 2016 Statut Membre Dernière intervention 20 février 2024 - Modifié le 25 sept. 2022 à 20:08
leoliom Messages postés 171 Date d'inscription jeudi 21 juillet 2016 Statut Membre Dernière intervention 20 février 2024 - 3 mai 2022 à 16:22

Bonjour,

J’ai un type structure nommé Point défini comme suit :

struct Point Point{
  double x, y;
}


J’ai une fonction du prototype :

Point set_point(double x, double y);

... qui permet de définir un point comme suit :

Point P = set_point(4,3);

On m’a donné aussi :

Point add_point(Point p1, Point p2);

... qui permet d’additionner des points, et :

Point produit_reel_point(double a, Point p);

...qui permet de faire l’opération a * Pa est un réel.

On note T lede type permettant de stocker un tableau de points

Exemple :

T tab = [(1, 1), (4, 4), (6, 7), …]

Si on veut accéder au point (4,4) de ce tableau, on écrit tab[1].

Le but de mon exercice est de traduire en langage C la fonction calcul_A dont le prototype est

Point calcul_A(Tableau_point T, int j1, int j2);

qui calcule:

A = c * somme_{i=1 à n}(P[j1 + i]+ d * (P[j1] + P[j2]))

c et d sont deux réels.

Mon problème est cette fameuse somme comme la faire.Je sais en tout cas que je dois utiliser produit_reel point et add_point

A voir également:

4 réponses

leoliom Messages postés 171 Date d'inscription jeudi 21 juillet 2016 Statut Membre Dernière intervention 20 février 2024 2
Modifié le 1 mai 2022 à 13:39
Bonjour ,en fait set_point permet de créer un point,add_point permet de faire:
Si on a A=(2.0,4.0) et B=(1.0,6.0) C=A+B=(3.0,8.0)
Point set_point (double x , double y ){
  Point P = {x , y } ;
 
  return P;
}
Point add_point(Point P1 , Point P2 ){
  return set_point(P1.x+P2.x,P1.y+P2.y ) ;
}
Point produit_reel_point( double a,Point p){
 Point Pr = {a*p.x,a*p.y} ;
 return Pr;
}






En fait je vais tout reprendre
J'ai une fonction principal appelé fonction approximation_contout_polygonal_par_une_courbe_bezier_degre2 (CONT,j1,j2,d) → Lqui doit approximé une ligne polygonal par une courbe lisse

Exemple:(voir photo)L'approximation est en bleu





On approxime le contour polygonal(P0,P1,P2,P3) par une courbe lisse
J'ai mis en gras la fonction qui m'interresse
L'algorithme est le suivant:




C0 ← Pj1
C2 ← Pj2
n ← j2 − j1
si n = 1 alors

A ←1/2(Pj1 + Pj2)
sinon
A← c(somme allant de i à n-1 de P_i+j1)+ d(Pj1 + Pj2)






Le type bézier2 est composé de 3 points
struct Bezier2{
Point P0,P1,P2
}

Bezier2 approx_bezier2(Tableau_Point Tableau,int j1,int j2){
  
  Bezier2 B;
  Point Pj1=Tableau.tab[j1];
  Point Pj2=Tableau.tab[j2];
  Point C0=Pj1;
  Point C2=Pj2;
  Point A;

  B.P0=C0;
  B.P2=C2;
  int m=j2-j1;
  

  
  if(m==1){
    // Tab= (Pj1, . . . , Pj2) = (Pj1, Pj1+1)
   // r ́eduit  à un seul segment

   C1=division_reel_point(2,add_point(Pj1,Pj2));
   B.P1=C1;
  
  }
  
  else{
   
    // n ≥ 2 :Tableau avec au moins 3 points
    float n=(float)m;
    float c=(3*n)/(n*n-1);
    float d=(1-2*n)/(2*(n+1)) ;
    
    int i;

 <gras>
   //somme de i allant de 1 à n-1 de P_j1+i <=>i=j1+1->j1+n-1 de P_i
    Point somme=set_point(0,0);
  
         for(i=1;i<=m-1;i++){
           somme=add_point(Tableau.tab[i+j1],somme);
         }
      
   

</gras>
    
    
     
    
    A=add_point( produit_reel_point(c,somme) , produit_reel_point(d,add_point(Pj1,Pj2))  );
    B.P1=C1;
   }
  
   
   return B;
}




Esce que c'est plus clair ou bien j'explicite encore davantage
1
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 1 mai 2022 à 16:55
Merci, oui, c'est bien plus clair.

Ta solution consistant à précalculer la valeur de la "somme" des points du tableau dans une boucle avant ta ligne 49 est une façon de faire.

Tu pourrais aussi faire une fonction qui retourne un type Point et fait la somme des Points contenu dans un tableau de Points dont tu passes la dimension, ce qui te permettrait de mettre l'appel de ta fonction directement en ligne 49.
1
leoliom Messages postés 171 Date d'inscription jeudi 21 juillet 2016 Statut Membre Dernière intervention 20 février 2024 2 > [Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024
3 mai 2022 à 16:22
Merci pour ces conseils
1
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 29 avril 2022 à 01:36
Salut leoliom,

Tout est très confus.

Puisqu'on te donne des fonctions, si tu postais le code des fonctions qui te sont fournies peut-être qu'on y verrait plus clair.

Le prototype que tu indiques
set_point(double x,double y)
semble erroné par rapport à l'usage que tu mentionnes :
Point P = set_point(4,3);
. Il devrait plutôt être :
Point set_point(double x,double y)
...

Par ailleurs, tu dis que on t'a "donné" aussi la "fonction add_point qui permet d’additionner des points". Personnellement, je ne sais pas ce que "additionner des points" signifie. Dans le contexte de ce que tu décris, une fonction add_point() pourrait être une fonction qui ajoute un Point dans un Tableau_point ou alors avoir un sens mathématique. Sans le code de cette fonction, on ne peut que jouer aux devinettes.

Tu dis que tu as le code de
produit_reel_point(double a,Point P)
... peux-tu le fournir ?

Ensuite, je suppose qu'on te donne aussi les réels
c
et
d
, non ? Quels sont-ils ?

Après, tu dis qu'on te donne :

Point calcul_A(Tableau_point T,int j1,int j2)
A=c(somme de i=1->n de P_j1+i)+d(P_j1+P_j2)

Manifestement, il s'agit d'une fonction qui retourne un Point, dont on peut supposer qu'il résulte du calcul de A, et que A serait de type Point.

Qu'est-ce que
n
?

Après, il y a un problème de notation dans ce qu'on te donne :

c(somme de i=1->n de P_j1+i)+d(P_j1+P_j2)
  • je suppose que c() signifie un produit de c avec le contenu de la parenthèse.
  • je suppose que i=1->n signifie que i est une variable interne à la fonction qui prend successivement les valeurs de 1 à n dans une boucle
  • on manque de contexte pour comprendre ce que signifie la notation P_j1, est-ce le Point contenu dans le tableau T à l'indice j1 ? Autre chose ?
  • on manque de contexte pour comprendre ce que signifie la notation P_j1+i


Peux-tu dire, en français, qu'elle est ton interprétation des opérations élémentaires signifiées par ces notations ?

Tu parles d'un tableau de points T, qui est d'ailleurs sensé être passé en paramètre de ta fonction
calcul_A
te donne-t-on les valeurs contenues dans ce tableau (les Point) et sa taille (le nombre d'éléments Point) qu'il contient ? A ton avis, à quel moment ce tableau, ou son contenu, est-il utilisé dans la fonction ?

Dal
0
Bonjour désolé finalement j’ai résolu le problème .Je met ici la solution ou bien c’est pas La peine
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
30 avril 2022 à 15:28
Tu pourrais tout d'abord répondre aux questions posées, puis poster ta solution, cela permettrait à ce topic d'avoir du sens :-)
0
leoliom Messages postés 171 Date d'inscription jeudi 21 juillet 2016 Statut Membre Dernière intervention 20 février 2024 2
1 mai 2022 à 13:04
Ah oui désolé
0