
Я использую Asymptote версии 2.80 на ПК с W10. Я пытаюсь повторно использовать старый (2019) код для построения пересечения сферы с конусом. Сгенерированный в 2019 году рисунок объединен. ?
Я сделал это в 2019 году, но сейчас при компиляции получаю следующее сообщение об ошибке:
if(s.triangular) abort(triangular); ^ C:\Program Files\Asymptote2_80/three_surface.asy: 1296.25: Пересечение path3 с треугольником Безье еще не реализовано.
Код следующий: все этапы строительства нарисованы.
\begin{figure}[h]
\centering
\begin{asy}
size(10cm);
import graph3;
currentprojection=orthographic((5,1,2),up=Z);
settings.render=4; // Pose pb si =0 : Le plan devant la sphere est absent
settings.prc=false;
currentlight=Viewport;
real k=1;
path3 Directrice = rotate(30,Y)*unitcircle3;
draw(Directrice,orange);
triple S=(0,-1.5,2);
draw(Label ("S",green),S);
path3 Directrice = rotate(60,-Y)*unitcircle3;
path3 Directrice = shift(1.5,0,0)*Directrice;
triple P1 = relpoint(Directrice,0);
triple P2 = relpoint(Directrice,0.25);
triple P3 = relpoint(Directrice,0.5);
triple P4 = relpoint(Directrice,0.75);
// t.x => point m de D -- t.y => facteur k
triple f(pair t) {
triple Point =relpoint(Directrice,t.x);
real X= S.x+t.y*(Point.x-S.x);
real Y= S.y+t.y*(Point.y-S.y);
real Z= S.z+t.y*(Point.z-S.z);
//dot((X,Y,Z),orange);
return (X,Y,Z);
}
surface s1=surface(f,(0,0),(1,1),36,36,Spline);
draw(s1,orange+opacity(.7));
surface sph=shift(0,0,0)*scale3(1)*unitsphere;
draw(sph,blue);
limits((0,0,0),(k+2,k+2,k+2));
xaxis3("$x$",Arrow3);
yaxis3("$y$",Arrow3);
zaxis3("$z$",Arrow3);
draw(Directrice,red);
dot(Directrice^^S,orange);
// size(p) = C'est le nombre de points qui définissent le path p
for(int i=0; i<size(Directrice);++i) {
draw(point(Directrice,i)--S,dashed);
}
/////// INTERSECTION -- On recherche les points d'intersection de 100 segments [Sm] avec la sphère.
triple[][] inter;
path3 ch1,ch2;
int n=100;
for(int i=0; i<n; ++i){
path3 p=S--relpoint(Directrice,i/n);
inter.push(intersectionpoints(p,sph,0.001));
draw(p,yellow);
}
for(int i=0; i<inter.length; ++i){
if (inter[i].length!=0){
ch1=ch1..inter[i][0];
dot(inter[i][0],2bp+green);
}
if(inter[i].length==2){
ch2=ch2..inter[i][1];
dot(inter[i][1],2bp+red);}
}
draw(ch1..cycle,1bp+green);
draw(ch2..cycle,1bp+red);
// Il reste à fermer la boucle : du 1er point de construction de ch1 au 1er point de construction ce ch2, et idem pour le dernier point
draw(point(ch1,0)..point(ch2,0),5bp+orange );
draw(point(ch1,(size(ch1)-1) )..point(ch2,(size(ch2)-1) ) ,5bp+orange );
\end{asy}
\caption{Projection gnomonique 3D \label{Fig_Proj_Gnomo_3D} }
\end{figure}
Какие точки пересечения (между чем и чем) я могу попросить перенастроить?
Идея состоит в том, чтобы нарисовать гномоническую проекцию земного параллеля на плоскость, касательную к северному полюсу, затем на плоскость, касательную к экватору, затем на плоскость, касательную на 50 градусах северной широты: любое решение без использования «точек пересечения» приветствуется.