Page 1 sur 1

deux petites requêtes

Publié : ven. juin 01, 2012 8:07 am
par loic
Bonjour,

Serait-il possible d'implémenter dans Giac les choses suivantes:

** Etendre la commande "arc" de telle sorte qu'elle puisse admettre trois points (ou trois affixes) comme arguments afin que

Code : Tout sélectionner

arc(A,B,C)
trace l'arc de cercle passant par A,B et C.

** Je souhaiterais disposer dans giac d'une commande "bezier" pour tracer les courbes de Bézier.
Je ne souhaite pas un gen avec l'ensemble du nuage de points en réponse juste un gen avec un sommet at_bezier et un GROUP_VECT contenant les différents points de contrôle

Par exemple:

Code : Tout sélectionner

bezier(1,1+i,2-i,3-2i)
pour créer une courbe de bézier cubique.
Le gen serait qq chose comme:
SYMB pnt--> VECT v
premier élément de v: SYMB de sommet at_bezier
... puis la feuille contiendrait le GROUP_VECT (1,1+i,2-i,3-2i)

Merci d'avance si c'est possible!

++

Loïc

Re: deux petites requêtes

Publié : ven. juin 01, 2012 6:33 pm
par parisse
pour arc, ce serait l'arc d'extremites qui?
Pour bezier, c'est facile à faire, puisqu'il s'agit d'une fonction inerte.

Re: deux petites requêtes

Publié : ven. juin 01, 2012 8:10 pm
par loic
pour arc, ce serait l'arc d'extremites qui?
arc(A,B,C) pour un arc d'extrémités A et C passant par B
Pour bezier, c'est facile à faire, puisqu'il s'agit d'une fonction inerte.
cool, merci bcp!

Re: deux petites requêtes

Publié : sam. juin 02, 2012 4:59 pm
par parisse
Pas si simple de faire arc...
Pour bezier, je mets Bezier pour signaler que c'est une fonction inerte.
Je corrige element pour une ligne polygonale, par contre pour l'instant je laisse tel quel pour la parabole, ce n'est pas clair dans mon esprit que plot(x^2,x=0..5) est une courbe dont on ne veut voir que la portion x=0..5 ou un arc de courbe. J'ai bien peur qu'implémenter le 2ème cas ne nécessite beaucoup trop de modifs...
Ca sera dispo en principe lundi!

Re: deux petites requêtes

Publié : sam. juin 02, 2012 5:25 pm
par loic
Comme toujours, en tout cas, un grand merci!

Re: deux petites requêtes

Publié : lun. juin 04, 2012 1:25 pm
par parisse
Voila, j'ai mis a jour qtgiac.

Re: deux petites requêtes

Publié : lun. juin 04, 2012 2:27 pm
par loic
Je viens de mettre à jour et de lancer qq tests. C'est nickel!

Sinon, je chipote mais c'est important pour la géo 2D:

Code : Tout sélectionner

arc(point(1),point(2),point(3))
renvoie le cercle trigo au lieu d'un undef.
J'ai rajouté un test de colinéarité de mon côté pour le moment mais ça serait mieux si ça pouvait être fait en amont.

++ et encore merci

Re: deux petites requêtes

Publié : mar. juin 05, 2012 6:53 pm
par loic
Désolé, j'ai pas été précis pour la commande Bezier.

La structure est bonne mais il faudrait que le tout soit englobé dans un symb de sommet Pnt.
Le commande Bezier se voulant être exploitée pour du graphique.

Merci d'avance,

Loïc

Re: deux petites requêtes

Publié : mer. juin 06, 2012 8:52 am
par parisse
il faudra que je fasse une version non inerte alors sans majuscules et qui gere les arguments optionnels, et une version inerte, il vaut mieux que la version inerte s'evalue en elle-meme.

Re: deux petites requêtes

Publié : mer. juin 06, 2012 11:27 am
par parisse
Il suffit de rajouter a la fin de plot.cc ceci:

Code : Tout sélectionner

  gen _bezier(const gen & args,GIAC_CONTEXT){
    if (is_undef(args)) return args;
    vecteur v(gen2vecteur(args));
    if (v.empty())
      return gensizeerr(contextptr);
    vecteur attributs(1,default_color(contextptr));
    int s=read_attributs(v,attributs,contextptr);
    return pnt_attrib(symbolic(at_Bezier,gen(vecteur(v.begin(),v.begin()+s),_GROUP__VECT)),attributs,contextptr);
  }
  static const char _bezier_s []="bezier";
  static define_unary_function_eval (__bezier,&_bezier,_bezier_s);
  define_unary_function_ptr5( at_bezier ,alias_at_bezier,&__bezier,0,true);
je peux aussi ajouter du code pour enlever les points si les arguments sont des points (ne garder que les affixes)

Re: deux petites requêtes

Publié : mer. juin 06, 2012 8:00 pm
par loic
Oui effectivement, il n'y aura que des points en arguments donc des affixes peuvent suffire

Re: deux petites requêtes

Publié : jeu. juin 07, 2012 7:24 am
par parisse
il suffit de rajouter une petite boucle:

Code : Tout sélectionner

  gen _bezier(const gen & args,GIAC_CONTEXT){
    if (is_undef(args)) return args;
    vecteur v(gen2vecteur(args));
    if (v.empty())
      return gensizeerr(contextptr);
    vecteur attributs(1,default_color(contextptr));
    int s=read_attributs(v,attributs,contextptr);
    for (int i=0;i<s;++i)
      v[i]=remove_at_pnt(v[i]);
    return pnt_attrib(symbolic(at_Bezier,gen(vecteur(v.begin(),v.begin()+s),_GROUP__VECT)),attributs,contextptr);
  }