Une petite figure

Tout ce qui concerne le langage Asymptote. Ce langage est utilisable sur le forum via les balises asy.
[participation réservée aux utilisateurs inscrits]
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.
OG
Modérateur honoraire
Modérateur honoraire
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Une petite figure

Message non lu par OG »

Bonjour

Sur tex.stackexchange il y a quelques questions sur Asymptote. Celle-ci http://tex.stackexchange.com/questions/ ... th-surface était amusante car il fallait recoller suffisamment régulièrement deux donuts ou deux tores et pas seulement les juxtaposer. En théorie c'est une équation implicite assez tordue qui va bien au delà des capacités d'Asymptote (il n'y a pas encore de module mathematica :) ). Sans détailler les explications, grosso modo j'ai modifié la paramétrisation du donut sur une des parties avec une fonction bien choisie empiriquement qui donne un recollement $C^1$ (et pas $C^2$). Un peu de calcul et ça marche. Il y a avait aussi un problème de paramétrisation pour faire une surface bien lisse (j'ai fait deux versions en fait). Avec un peu de chances voici le code.

Code : Tout sélectionner

size(200);
import graph3;

currentprojection=perspective(5,4,4);

real R=3;
real a=1;

triple f(pair t) {
  triple z;
  z= ((R+a*cos(t.y))*cos(t.x),(R+a*cos(t.y))*sin(t.x),a*sin(t.y));
  return z;
}


bool active(pair pos) {return (R+a*cos(pos.y))*cos(pos.x)<=3.2;}
bool active2(pair pos) {return (R+a*cos(pos.y))*cos(pos.x)>=-3.2;}

surface s=surface(f,(0,0),(2pi,2pi),200,200, active);
surface ss=shift((2*R+2*a,0,0))*surface(f,(0,0),(2pi,2pi),200,200,active2);

draw(s,green,render(compression=Low,merge=true));
draw(ss,green,render(compression=Low,merge=true));

triple f11 (pair z)
{
  real y,ty,x;
  if (z.y>=0)
    {
      x=z.x+1/2*(z.x+R)^2/a;
      y=sqrt(z.y)*sqrt((R+a)^2-x*x);
    }
  else
    {
      x=z.x+1/2*(z.x+R)^2/a;
      y=-sqrt(abs(z.y))*sqrt((R+a)^2-x*x);
    }
  return (-z.x,y,sqrt(a^2-(R-sqrt((x)^2+y^2))^2));
}

triple f12(pair z)
{
  triple z=f11(z);
  return (z.x,z.y,-z.z);
}

triple f21(pair z)
{
  triple z=f11(z);
  return (-z.x,z.y,z.z);
}
triple f22(pair z)
{
  triple z=f11(z);
  return (-z.x,z.y,-z.z);
}
int N=100;
surface st=surface(f11,(-R-a,-1),(-R,1),N,N);
surface sst=surface(f12,(-R-a,-1),(-R,1),N,N);
surface sstb=shift((2*R+2*a,0,0))*surface(f21,(-R-a,-1),(-R,1),N,N);
surface sstbm=shift((2*R+2*a,0,0))*surface(f22,(-R-a,-1),(-R,1),N,N);
surface pont1=surface(st,sst,sstb,sstbm);
draw(pont1,green);//blue);
et la figure

[attachment=0]h16.png[/attachment]


bon week-end
O.G.
Pièces jointes
h16.png
MB
Administrateur
Administrateur
Messages : 8078
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: Une petite figure

Message non lu par MB »

Merci pour le partage. Le résultat est visuellement très agréable en tous cas. :D
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.