如何在 Asymptote 中找到圆的交点来创建双曲线?

如何在 Asymptote 中找到圆的交点来创建双曲线?

我有一个绘制几个同心圆的渐近线文件。

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 < 9090 < 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

文件输出

这不会触及交叉点(最明显的是焦点附近),但它确实绘制了双曲线。

相关内容