Page 1 sur 1

Une petite figure

MessagePosté: Vendredi 03 Avril 2015, 13:57
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

h16.png


bon week-end
O.G.

Re: Une petite figure

MessagePosté: Dimanche 05 Avril 2015, 11:36
par MB
Merci pour le partage. Le résultat est visuellement très agréable en tous cas. :D