如何用 TikZ 绘制双纽线

如何用 TikZ 绘制双纽线

如何绘制给定的集合(称为 Brauer Cassini 椭圆形)

     { z : |z-a|·|z-b| <= c }

在复平面上

问题只是如何绘制这条(填充或未填充的)曲线,而不是如何绘制坐标系或其他东西。

有没有一种使用 TikZ 的简单方法可以做到这一点,或者我必须使用 pstricks / gnuplot /或类似的东西?

我更喜欢仅使用 TikZ,因为我已经在 TikZ 中完成了一个复杂的图,我想在其中添加一些双纽线。

答案1

enter image description here

MWE使用模块Asymptotecassinioval.asy卡西尼椭圆构建为一条或两条闭合曲线,构造为。它在原点处构造,然后旋转并移动到焦点和polargraph的位置,参见示例 1、2。AB

% cassini.tex :
%
\begin{filecontents*}{cassinioval.asy}
import graph;

// The polar representation used according to
// A.A. Savelov, "Planar curves" , pp.147--148, Moscow (1960) (In Russian),
// see also http://en.wikipedia.org/wiki/Cassini_oval
//
struct CassiniOval{
// { z : |z-A|·|z-B| <= C }
  pair A, B; real C;
  int npoints;

  real a,c;
  transform transf;
  real alpha;

  guide[] curve;

  real rho(real phi){
    return c*sqrt(abs(cos(2phi)+sqrt(abs(cos(2phi)^2+(a/c)^4-1))));
  };

  real rho2(real phi){
    return c*sqrt(abs(cos(2phi)-sqrt(abs(cos(2phi)^2+(a/c)^4-1))));
  };

  guide[] normLscate(){
    guide[] g;
    guide q;
    real xMax=sqrt(a^2+c^2);
    real xMin=-xMax;
    if(a>=c){// one contour;
      g.push(transf*(polargraph(rho,0,2pi,npoints)--cycle));
    }else{// two contours;
      q=polargraph(rho,-alpha,alpha,npoints)
        --reverse(polargraph(rho2,-alpha,alpha,npoints))
        --cycle;
      g=(transf*q)^^(transf*reflect(N,S)*q);

    }
    return g;
  }

  void operator init(pair A, pair B, real C, int npoints=300){
    assert(C>0);
    this.A=A; this.B=B;  this.C=C;
    assert(npoints>1);
    this.npoints=npoints;
    this.c=arclength(A--B)/2;
    this.a=sqrt(C);
    transf=shift(A)*rotate(degrees(atan2(B.y-A.y,B.x-A.x)))*shift(c,0);

    if(a<c){alpha=asin((a/c)^2)/2;}
    curve=normLscate();    
  }
}
\end{filecontents*}
%
%
\documentclass[10pt,a4paper]{article}
\usepackage{lmodern}
\usepackage{subcaption}
\usepackage[inline]{asymptote}
\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
%
\begin{document}
%
\begin{figure}
\captionsetup[subfigure]{justification=centering}
    \centering
      \begin{subfigure}{0.49\textwidth}
\begin{asy}
import cassinioval;
size(5cm);
pair A=(-2,0);
pair B=(2,0);
real C=5;

CassiniOval co=CassiniOval(A,B,C);

pen cpen=deepblue;
pen fpen=lightgreen;

fill(co.curve,fpen);
draw(co.curve,cpen);

dot(A,UnFill);
dot(B,UnFill);
label("$A$",A,W);
label("$B$",B,E);

pair Ap=(0,-2);
pair Bp=(0,2);

fpen=lightred+opacity(0.5);
filldraw(CassiniOval(Ap,Bp,C).curve,fpen,cpen);

dot(Ap,UnFill);
dot(Bp,UnFill);
label("$A^\prime$",Ap,W);
label("$B^\prime$",Bp,E);
\end{asy}
%
\caption{Example 1}
\label{fig:1a}
\end{subfigure}
%
\begin{subfigure}{0.49\textwidth}
\begin{asy}
import cassinioval;
size(5cm);
pen cpen=deepblue;
pen fpen=lightgreen+opacity(0.2);

pair A=(-3,-1);
pair B=(2,3);
real C;
CassiniOval co;

for(int i=6;i<16;++i){
  C=i;
  co=CassiniOval(A,B,C);
  filldraw(co.curve,fpen,cpen);
}

dot(A,UnFill);
dot(B,UnFill);
label("$A$",A,W);
label("$B$",B,E);

\end{asy}
%
\caption{Example 2}
\label{fig:1b}
\end{subfigure}
\caption{}
\label{fig:1}
\end{figure}
%
\end{document}
%
% Process:
%
% pdflatex cassini.tex    
% asy cassini-*.asy    
% pdflatex cassini.tex

答案2

只是为了好玩:一个 TiZ 版本。该策略非常类似于g.kov 的精彩回答语法是

\draw[Cassini curve=with centers A and B and constant pi];

其中中心表示两个点,常数表示c问题中所称的。

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[declare function={%
rhoone(\a,\c,\t)=sqrt(\a^2*cos(2*\t)-sqrt(-2*\a^4 + 64*\c^2 + 2*\a^4*cos(4*\t))/2)/2;
rhotwo(\a,\c,\t)=sqrt(\a^2*cos(2*\t)+sqrt(-2*\a^4 + 64*\c^2+2*\a^4*cos(4*\t))/2)/2;},
Cassini curve/.style args={with centers #1 and #2 and constant #3}{%
insert path={
let \p1=($(#2)-(#1)$),\n1={veclen(\x1,\y1)/1cm},\n2={atan2(\x1,\y1)}
in %\pgfextra{\typeout{#1,#2,#3,\n1,\n2}}
[shift={($(#2)!0.5!(#1)$)}]
plot[variable=\t,domain=0:360,smooth,samples=101] 
(\t-\n2+90:{rhotwo(\n1,#3,\t)})
}}]
\path (0,0) coordinate (A) (3,1) coordinate (B) (-2,-2) coordinate (C);
\foreach \X in {A,B,C} {\fill (\X) circle (1pt) node[below]{\X};}
\draw[fill=blue,fill opacity=0.3,Cassini curve=with centers A and B and constant pi];
\draw[fill=red,fill opacity=0.3,Cassini curve=with centers A and C and constant pi];
\end{tikzpicture}
\end{document}

enter image description here

相关内容