Surface 3D

Tout ce qui concerne l'utilisation ou l'installation d'Asymptote.

Modérateur: gdm_asy

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

Surface 3D

Messagepar loicwood » Vendredi 15 Février 2013, 17:04

Bonsoir,

j'essaye de représenter la surface donnée par l'équation suivante :

$$z=5+(-\sqrt{1-x^2-(y-|x|)^2})\times\cos(30\times(1-x^2-(y-|x|)^2)$$



J'utilise le code suivant :
Code: Tout sélectionner
import graph3;
import math;
import palette;

size(7.5cm,0);

currentprojection=orthographic(4,2,3);
currentlight=(5,-2,4);

real f(pair z) {return 5+(-sqrt(1-z.x^2-(z.y-abs(z.x))^2))*cos(30*(1-z.x^2-(z.y-abs(z.x))^2));}

draw(surface(f,(-1,-1),(1,1.5),nx=32,Spline),
                   lightblue+opacity(0.8),blue);


http://t.co/YwpTqHcg

(J'ai effectué un copier-coller de http://www.marris.org/asymptote/Surfaces_3D/index.html et ai remplacé la fonction).

Quand je compile, il ne se passe rien... Où sont les erreurs ?

Merci.
loicwood
Kilo-utilisateur
 
Messages: 118
Inscription: Dimanche 23 Octobre 2011, 10:24
Localisation: Souppes sur Loing
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: Surface 3D

Messagepar chellier » Vendredi 15 Février 2013, 18:44

Bonsoir,

loicwood a écrit:Quand je compile, il ne se passe rien... Où sont les erreurs ?

Il y a un problème de définition de la surface (par exemple en (1,1.5))

Christophe
chellier
Modérateur
 
Messages: 355
Inscription: Samedi 25 Juillet 2009, 11:25
Localisation: Le Creusot
Statut actuel: Actif et salarié | Enseignant

Re: Surface 3D

Messagepar loicwood » Vendredi 15 Février 2013, 19:51

Oui, en effet.

J'ai modifié en utilisant une condition :

Code: Tout sélectionner
real f(pair z){
   real temp=1-z.x^2-(z.y-abs(z.x))^2;
   if(temp>=0) return sqrt(temp);
   else return 0;
   }


Comment faire pour ne pas renvoyer 0, que le point ne soit pas dessiné (si j'omets le else, j'ai une erreur, ce qui paraît logique) ?

Autre question : peut-on dessiner une courbe définie de façon implicite ?
loicwood
Kilo-utilisateur
 
Messages: 118
Inscription: Dimanche 23 Octobre 2011, 10:24
Localisation: Souppes sur Loing
Statut actuel: Actif et salarié | Enseignant

Re: Surface 3D

Messagepar OG » Vendredi 15 Février 2013, 22:25

Bonsoir


Pour le premier problème, la fonction étant du type f(z) avec z de type pair, il vaut mieux que l'ensemble de définition soit
un pavé de $\R^2$, sinon c'est plus délicat. L'idéal serait d'avoir ta surface paramétré $(x(t,s),y(t,s),z(t,s))$ avec $t$ et $s$
dans un intervalle. L'autre solution qui n'aura peut-être pas le rendu escompté est de reprendre ton code et d'ajouter un
tableau de booléens dans la définition de la surface. Tu peux voir l'exemple
http://asymptote.sourceforge.net/galler ... urface.asy

Pour le second problème, il faut voir du côté de contour (pour la 2D). Il y a aussi contour3 mais dessine une surface.


O.G.
OG
Modérateur
 
Messages: 2285
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: Surface 3D

Messagepar loicwood » Samedi 16 Février 2013, 10:13

Bonjour,

la solution avec contour3 fonctionne correctement, même si le résultat n'est pas très harmonieux.

Code: Tout sélectionner
import graph3;
import math;
import palette;
import contour3;

size(15cm,0);

currentprojection=orthographic(
camera=(5.34520223262398,0.601970556105364,-0.257767843527222),
up=(0.000445258521916593,-0.0003681064336251,0.00837347927763778),
target=(3.63424568217141e-16,-4.71085843944952e-16,2.10768902331182e-16),
zoom=0.556837418177559);
currentlight=(5,-2,4);

real f(real x, real y, real z){ return (2*x^2+y^2+z^2-1)^3-x^2*z^3/10-y^2*z^3;}

limits((-1,-1,1),(1,1.5,6));

surface s=surface(contour3(f,(-3,-3,-3),(3,3,3),35,35));

//draw(s,red+opacity(0.5),render(merge=true));

draw(s,mean(palette(s.map(zpart),Rainbow())),black);


Pour la première courbe, je l'ai reprise telle quelle, j'explore les différentes possibilités d'Asymptote, et je suis loin de comprendre toutes les subtilités du code. J'ai compilé l'exemple en remplaçant above par active, mais je ne vois guère la différence. Il me semble que cela jour exclusivement sur la couleur ?
loicwood
Kilo-utilisateur
 
Messages: 118
Inscription: Dimanche 23 Octobre 2011, 10:24
Localisation: Souppes sur Loing
Statut actuel: Actif et salarié | Enseignant

Re: Surface 3D

Messagepar OG » Samedi 16 Février 2013, 22:42

Bonsoir

Il me semble que dans
Code: Tout sélectionner
surface s=surface(V,a,b,40,Spline,active);

active va sélectionner les carreaux de Bézier tracés
tandis que dans
Code: Tout sélectionner
draw(s,mean(palette(s.map(new real(triple v) {
          return above((v.x,v.y)) ? 1 : 0;}),
      new pen[] {lightblue,lightgreen})),black);

above choisit la couleur.


O.G.
OG
Modérateur
 
Messages: 2285
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: Surface 3D

Messagepar loicwood » Dimanche 17 Février 2013, 18:56

En effet, la courbe obtenue est différente avec ou sans active.

J'obtiens quelque chose d'assez différent de la courbe générée par Google, mais cela sera suffisant.

Merci pour l'aide.
loicwood
Kilo-utilisateur
 
Messages: 118
Inscription: Dimanche 23 Octobre 2011, 10:24
Localisation: Souppes sur Loing
Statut actuel: Actif et salarié | Enseignant

Re: Surface 3D

Messagepar OG » Lundi 18 Février 2013, 22:53

Bonsoir

Le premier exemple est paramétrisable. Ainsi on obtient une surface bien lisse
Code: Tout sélectionner

  import graph3;
import math;
import palette;

size(7.5cm,0);

currentprojection=orthographic(4,2,3);
//currentlight=(5,-2,4);

real f(pair z) {return 5+(-sqrt(1-z.x^2-(z.y-abs(z.x))^2))*cos(30*(1-z.x^2-(z.y-abs(z.x))^2));}


real f(pair z){
  real temp=1-z.x^2-(z.y-abs(z.x))^2;
  if(temp>=0) return sqrt(temp);
  else return 0;
}


triple f(pair t){
  real y=abs(t.x)+t.y*sqrt(1-t.x^2);
  real temp=max(1-t.x^2-(y-abs(t.x))^2,0);
  return (
          (t.x),
          y,
          sqrt(temp)
          );
}


pen p=rgb(0.2,0.5,0.7);
surface s=surface(f,(-1,-1),(1,1.01),12,12,Spline);
draw(s,lightgray,meshpen=p,render(merge=true));



Il y a juste une anomalie volontaire dans le code : (1,1.01) avec le 1.01. Si je mets 1 alors asymptote m'insulte en
me disant que la fonction n'est pas périodique. J'ai regardé un peu l'origine du message mais
je ne trouve pas, la décision de prendre un spline périodique est automatique...

O.G.
OG
Modérateur
 
Messages: 2285
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: Surface 3D

Messagepar OG » Mardi 19 Février 2013, 14:53

Je continue sur l'erreur produite par le code
Code: Tout sélectionner
    import graph3;
    import math;
    import palette;
   size(7.5cm,0);
   currentprojection=orthographic(4,2,3);
    //currentlight=(5,-2,4);
   triple f(pair t){
      real y=abs(t.x)+t.y*sqrt(1-t.x^2);
      real temp=max(1-t.x^2-(y-abs(t.x))^2,0);
      return (
              (t.x),
              y,
              sqrt(temp)
              );
    }
    pen p=rgb(0.2,0.5,0.7);
    surface s=surface(f,(-1,-1),(1,1),12,12,Spline);
    draw(s,lightgray,meshpen=p,render(merge=true));

qui est
Code: Tout sélectionner
/usr/local/share/asymptote/graph_splinetype.asy: 89.10: function values are not periodic

Le choix entre spline périodique ou not_a_knot est automatique et décidé donc par Asymptote
lors de tests. Comme c'est du numérique, c'est un test avec un zéro relatif (sqrtEpsilon), qui
est fait sur matrice globale des points 3D générés. Par contre lors de l'exécution du calcul du
spline bicubique périodique, un autre test est fait pour vérifier le caractère périodique (toujours
relatif à sqrtEpsilon) mais uniquement sur le vecteur, et qui est donc plus strict.
Évidemment c'est du charabia, il faut aller lire graph3.asy, graph_splinetype et surtout three_tube.asy
c'est beaucoup plus clair !


O.G.
OG
Modérateur
 
Messages: 2285
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: Surface 3D

Messagepar loicwood » Mardi 19 Février 2013, 19:09

Merci beaucoup pour le graphique !

Pour les explications de l'erreur, c'est beaucoup trop compliqué pour moi... Le jour où je maîtriserai Asymptote, je pourrais me pencher sur le coed.
loicwood
Kilo-utilisateur
 
Messages: 118
Inscription: Dimanche 23 Octobre 2011, 10:24
Localisation: Souppes sur Loing
Statut actuel: Actif et salarié | Enseignant

Re: Surface 3D

Messagepar OG » Mardi 19 Février 2013, 23:13

loicwood a écrit:Merci beaucoup pour le graphique !

Pour les explications de l'erreur, c'est beaucoup trop compliqué pour moi... Le jour où je maîtriserai Asymptote, je pourrais me pencher sur le coed.

Comme j'ai écrit le code, c'est plus facile pour moi (sauf ces histoires de choix de type de spline).
Le code est en fait une adaptation d'un code fortran de Scilab pour faire la surface $z=f(x,y)$ et on ajoute une méthode très naïve pour faire la surface
paramétrée $x(u,v),y(u,v),z(u,v)$, bien lisse. Mais ce n'est pas une question de code Asymptote, c'est une question de math :)
et c'est juste un peu fastidieux à écrire.

Ton exemple avec contour3 est intéressant. Vu que c'est polynomiale, avec un peu/beaucoup de travail
on doit pouvoir faire une surface bien lisse.

O.G.
OG
Modérateur
 
Messages: 2285
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence


Retourner vers Asymptote

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité