Une petite figure

Tout ce qui concerne le langage Asymptote. Ce langage est supporté par 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.
OG
Modérateur
Modérateur
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Une petite figure

Message 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.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
MB
Administrateur
Administrateur
Messages : 7406
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: Une petite figure

Message par MB »

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