我有一个绘制几个同心圆的渐近线文件。
settings.outformat="pdf";
import geometry;
unitsize(2cm);
int n=20;
for(int k=0; k<n; ++k){
for(int i=0; i<20; ++i)
draw(scale(sqrt(2)*((k/n)+i)/6)*unitcircle,red);
clip(shift(-2,-2)*yscale(4)*xscale(6)*unitsquare);
for(int i=0; i<20; ++i)
draw(shift(2,0)*scale(sqrt(2)*((k/n)+i)/6)*unitcircle,blue);
clip(shift(-2,-2)*yscale(4)*xscale(6)*unitsquare);
}
如果您查看最左边的圆圈点,它似乎创建了双曲线的分支。我如何使用渐近线找到这个交点并绘制双曲线?
答案1
像这样吗?
settings.outformat="pdf";
size(9cm);
int n=20;
pair[][] hyPoint;
guide f1(int k, int i){return scale(sqrt(2)*((k/n)+i)/6)*unitcircle;}
guide f2(int k, int i){return shift(2,0)*f1(k,i);}
for(int k=0; k<n; ++k){
for(int i=0; i<n; ++i){
draw(f1(k,i),darkblue+ 0.2*bp);
draw(f2(k,i),yellow +0.2*bp);
}
}
hyPoint[0]=new pair[];
for(int j=0;j<n-8;++j){
hyPoint[0].append(intersectionpoints(f1(n-1,j),f2(n-1,j+8)));
}
hyPoint[1]=new pair[];
for(int j=0;j<n-8;++j){
hyPoint[1].append(intersectionpoints(f1(n-1,j),f2(n-1,j+8-1)));
}
dot(hyPoint[0],darkblue,UnFill);
dot(hyPoint[1],yellow,UnFill);
clip(shift(-2,-2)*yscale(4)*xscale(6)*unitsquare);
答案2
我将以不同的方式来处理这个问题,并且实际上不去寻找交点。
展开所有的东西,你会发现在原点处有各种半径的圆,在 (2,0) 处有各种半径的圆。当你从两个圆的交点开始,将两个相交圆的半径增加(或减少)相同的量,并连接新旧交点时,就会形成双曲线。换句话说,双曲线是 (x,y) 的集合,满足:对于( 其中)
dist( (0,0) , (x,y) ) - dist( (2,0) , (x,y) ) = 2a
的各种值。a
-1 < a < 1
A共同推导表示这是双曲线。用和 的(x-1)^2/a^2 - y^2/(1-a^2) = 1
参数坐标绘制最容易。(1+a*sec(t),sqrt(1-a^2)*tan(t))
-90 < t < 90
90 < t < 270
settings.outformat="pdf";
import geometry;
import graph; // added
unitsize(2cm);
int n=20;
for(int k=0; k<n; ++k){
for(int i=0; i<20; ++i)
draw(scale(sqrt(2)*((k/n)+i)/6)*unitcircle,red);
for(int i=0; i<20; ++i)
draw(shift(2,0)*scale(sqrt(2)*((k/n)+i)/6)*unitcircle,blue);
}
for ( int a = 1 ; a <= 8 ; ++a ) {
pair f(real t) {
return (1+a/(9*Cos(t)),sqrt(81-a^2)*Tan(t)/9);
}
draw(graph(f,-89,89),green+linewidth(1)); // right halves
draw(graph(f,91,269),green+linewidth(1)); // left halves
}
clip(shift(-2,-2)*yscale(4)*xscale(6)*unitsquare); // relocated
这不会触及交叉点(最明显的是焦点附近),但它确实绘制了双曲线。