如何绘制给定的集合(称为 Brauer Cassini 椭圆形)
{ z : |z-a|·|z-b| <= c }
在复平面上
问题只是如何绘制这条(填充或未填充的)曲线,而不是如何绘制坐标系或其他东西。
有没有一种使用 TikZ 的简单方法可以做到这一点,或者我必须使用 pstricks / gnuplot /或类似的东西?
我更喜欢仅使用 TikZ,因为我已经在 TikZ 中完成了一个复杂的图,我想在其中添加一些双纽线。
答案1
本MWE
使用模块Asymptote
将cassinioval.asy
卡西尼椭圆构建为一条或两条闭合曲线,构造为。它在原点处构造,然后旋转并移动到焦点和polargraph
的位置,参见示例 1、2。A
B
% 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
只是为了好玩:一个 Ti钾Z 版本。该策略非常类似于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}