deux petites requêtes

Librairie C++ de calcul formel/ C++ symbolic computation library

Modérateur : xcasadmin

Répondre
loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

deux petites requêtes

Message par loic » ven. juin 01, 2012 8:07 am

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

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: deux petites requêtes

Message par parisse » ven. juin 01, 2012 6:33 pm

pour arc, ce serait l'arc d'extremites qui?
Pour bezier, c'est facile à faire, puisqu'il s'agit d'une fonction inerte.

loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

Re: deux petites requêtes

Message par loic » ven. juin 01, 2012 8:10 pm

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!

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: deux petites requêtes

Message par parisse » sam. juin 02, 2012 4:59 pm

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!

loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

Re: deux petites requêtes

Message par loic » sam. juin 02, 2012 5:25 pm

Comme toujours, en tout cas, un grand merci!

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: deux petites requêtes

Message par parisse » lun. juin 04, 2012 1:25 pm

Voila, j'ai mis a jour qtgiac.

loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

Re: deux petites requêtes

Message par loic » lun. juin 04, 2012 2:27 pm

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

loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

Re: deux petites requêtes

Message par loic » mar. juin 05, 2012 6:53 pm

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

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: deux petites requêtes

Message par parisse » mer. juin 06, 2012 8:52 am

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.

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: deux petites requêtes

Message par parisse » mer. juin 06, 2012 11:27 am

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)

loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

Re: deux petites requêtes

Message par loic » mer. juin 06, 2012 8:00 pm

Oui effectivement, il n'y aura que des points en arguments donc des affixes peuvent suffire

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: deux petites requêtes

Message par parisse » jeu. juin 07, 2012 7:24 am

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);
  }


Répondre