두 등고선 사이의 점근선 채우기 영역

두 등고선 사이의 점근선 채우기 영역

나는 Asymptote그래픽을 만드는 데 사용합니다. 윤곽선 C_1과 C_2로 정의된 두 개의 곡선이 있습니다. 두 곡선 사이의 영역을 채우고 싶습니다. 문제는 윤곽선이 guide 점근선 구조를 반환하는데 이것이 명령에 허용되지 않는다는 것입니다 buildcycle. 누구든지 이 문제를 해결하는 방법을 말해 줄 수 있습니까? 감사해요. 이것은 내가 사용하는 코드이며 두 개의 곡선을 생성하지만 이들 사이의 영역을 채우지 못합니다.

import graph;
import patterns;
import contour; 

usepackage("mathrsfs");

size(8cm);

real eps=0.001;
real xmax=5.5,ymax=5.5;
pair af,ag;

real f(real x, real y) {return sqrt(1+x)-sqrt(x)+sqrt(1+y)-sqrt(y);}
real g(real x, real y) {return 1/sqrt(1+x)+1/sqrt(1+y);}

guide[][] Cf=contour(f,(eps,eps),(xmax,ymax),new real[] {1});
guide[][] Cg=contour(g,(eps,eps),(xmax,ymax),new real[] {1});

//these two lines are used to find intersection points
path D1=(0,ymax)--(xmax+eps,ymax);
path D2=(xmax,0)--(xmax,ymax+eps); 

draw(Cf);
draw(Cg);

//path pp=buildcycle(Cf,D1,Cg,D2);
// the preceding line produces and error if commented

xaxis(Label(scale(0.75)*"$x$"),xmax=6,Arrow);
yaxis(Label(rotate(90)*scale(0.75)*"$y$"),ymax=6,Arrow);

label("$\mathscr{C}_{1}$",(xmax,0.2));
label("$\mathscr{C}_{2}$",(xmax,1.9));
label("I"  ,(.2,.2));
label("II" ,(1.,1.));
label("III",(3.5,3.5));

end;

답변1

을 (를) 교체할 때 작동 Cf하며 원하는(단일) 가이드를 얻을 수 있습니다 .CgCf[0][0]Cg[0][0]

path pp=buildcycle(Cf[0][0],D1,Cg[0][0],D2);

또한 귀하의 정의에서 D1및 : 을 약간 수정했습니다 .D2D1D2pp~ 아니다어쨌든 교차합니다.

path D1=(0,ymax-eps)--(xmax+eps,ymax-eps);
path D2=(xmax-eps,0)--(xmax-eps,ymax+eps);

사용 방법에 대한 적절한 설명은 contour매우 잘 만들어진 (완전하지 않음)을 참조하세요.점근선에 대한 튜토리얼Charles Staats, p. 32.

import graph;
import patterns;
import contour; 

usepackage("mathrsfs");

size(8cm);

real eps=0.001;
real xmax=5.5,ymax=5.5;
pair af,ag;

real f(real x, real y) {return sqrt(1+x)-sqrt(x)+sqrt(1+y)-sqrt(y);}
real g(real x, real y) {return 1/sqrt(1+x)+1/sqrt(1+y);}

guide[][] Cf=contour(f,(eps,eps),(xmax,ymax),new real[] {1});
guide[][] Cg=contour(g,(eps,eps),(xmax,ymax),new real[] {1});

//these two lines are used to find intersection points
path D1=(0,ymax-eps)--(xmax+eps,ymax-eps);
path D2=(xmax-eps,0)--(xmax-eps,ymax+eps);

path pp=buildcycle(Cf[0][0],D1,Cg[0][0],D2); 
fill(pp,.8white); draw(pp);

xaxis(Label(scale(0.75)*"$x$"),xmax=6,Arrow);
yaxis(Label(rotate(90)*scale(0.75)*"$y$"),ymax=6,Arrow);

label("$\mathscr{C}_{1}$",(xmax,0.2));
label("$\mathscr{C}_{2}$",(xmax,1.9));
label("I"  ,(.2,.2));
label("II" ,(1.,1.));
label("III",(3.5,3.5));

여기에 이미지 설명을 입력하세요

답변2

비교를 위해 Metapost 버전이 있습니다. 암시적 방정식이나 Asymptote의 기능만큼 영리한(또는 복잡한) 것에 대한 지원이 없으므로 contourOP가 기꺼이 피했던 "긴 표현"을 얻기 위해 일부 대수학을 피할 수 없었습니다. 그리고 0에 가까울 때 오버플로를 피하기 위해 x이 두 곡선이 선을 기준으로 대칭을 이루고 (0,0)--(1,1)C1은 통과 (9/16,9/16)하고 C2는 통과한다는 사실을 활용하고 있습니다 (3,3). 따라서 루프를 사용하여 오른쪽 곡선을 구성합니다. 이 점들 중; 그런 다음 MP의 reflectedabout매크로를 사용하여 필요한 위쪽 절반을 만듭니다.

prologues := 3;
outputtemplate := "%j%c.eps";

beginfig(1);
u := 1cm;
path xx, yy, ff, gg;
xx = (1/2 left -- 6 right) scaled u;
yy = xx rotated 90;
drawarrow xx; drawarrow yy;

vardef f(expr x) = 
  save s; numeric s;
  s = (1+sqrt(x)-sqrt(1+x))**2;
  (1-2s+s**2)/(4s)
  enddef;

vardef g(expr x) = 
   (1+x)/(2+x-2*sqrt(1+x))-1
   enddef;

s = 0.05;
ff = ((9/16,9/16) for x = 9/16+s step s until 5.5: -- (x,f(x)) endfor) scaled u;
gg = ((3,3)       for x =    3+s step s until 5.5: -- (x,g(x)) endfor) scaled u;

ff := reverse ff reflectedabout(origin,(1,1)) & ff;
gg := reverse gg reflectedabout(origin,(1,1)) & gg;

path A;
A = ff -- reverse gg -- cycle;
fill A withcolor .9[blue,white];
draw ff;
draw gg;

string s; s = "";
for $=0,9/16u,3u:
  s := s & "I";
  label.urt(s,($,$));
  endfor

label.urt(btex ${\cal C}_1$ etex, point infinity of ff);
label.urt(btex ${\cal C}_2$ etex, point infinity of gg);

label.bot(btex $x$ etex, point 1 of xx);
label.lft(btex $y$ etex, point 1 of yy);

endfig;
end.

해당 영역의 끝 부분도 그리려면 my draw ff; draw gg;를 으로 바꾸면 됩니다 draw A.

여기에 이미지 설명을 입력하세요

관련 정보