Surface 3D

Tout ce qui concerne le langage Asymptote. Ce langage est supporté sur le forum via les balises asy.

Modérateur : gdm_asy

Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
loicwood
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 121
Inscription : dimanche 23 octobre 2011, 11:24
Localisation : Souppes sur Loing

Surface 3D

Message par loicwood »

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.

chellier
Modérateur
Modérateur
Messages : 355
Inscription : samedi 25 juillet 2009, 12:25
Localisation : Le Creusot

Re: Surface 3D

Message par chellier »

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

loicwood
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 121
Inscription : dimanche 23 octobre 2011, 11:24
Localisation : Souppes sur Loing

Re: Surface 3D

Message par loicwood »

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 ?

OG
Modérateur
Modérateur
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Re: Surface 3D

Message par OG »

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.

loicwood
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 121
Inscription : dimanche 23 octobre 2011, 11:24
Localisation : Souppes sur Loing

Re: Surface 3D

Message par loicwood »

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 ?

OG
Modérateur
Modérateur
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Re: Surface 3D

Message par OG »

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.

loicwood
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 121
Inscription : dimanche 23 octobre 2011, 11:24
Localisation : Souppes sur Loing

Re: Surface 3D

Message par loicwood »

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.

OG
Modérateur
Modérateur
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Re: Surface 3D

Message par OG »

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
Modérateur
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Re: Surface 3D

Message par OG »

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.

loicwood
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 121
Inscription : dimanche 23 octobre 2011, 11:24
Localisation : Souppes sur Loing

Re: Surface 3D

Message par loicwood »

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.

OG
Modérateur
Modérateur
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Re: Surface 3D

Message par OG »

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.