50 是否有成熟的方案绘制如下的圆锥曲线的图像?

发布于 2025-11-17 20:56:53

希望绘制的效果如下:

image.png

查看更多

关注者
0
被浏览
36
2 个回答
Sagittarius Rover
Sagittarius Rover 1小时前
这家伙很懒,什么也没写!

一个基于tkz-elements+tkz-euclide的方案如下:

% lualatex
\documentclass[tikz,border=5pt]{standalone}
\usepackage[mini]{tkz-euclide}
\usepackage{tkz-elements}
\usepackage{fouriernc}
\directlua{
    init_elements()
    z.O = point(0, 0)
    z.F = point(1, 0)
    z.m = point(-1, 1)
    z.n = point(-1, -1)
    L.mn = line(z.m, z.n)
    CO.PA = conic(z.F, L.mn, 1)
    PA.curve = CO.PA:points(-6, 6, 100)
    slope = 1.1 -- you can modify the slope of Line.AB
    z.Fp = z.F + point(1,slope)
    L.AB = line(z.F, z.Fp)
    z.B, z.A = intersection(CO.PA, L.AB)
    z.Fpp = z.F:rotation( -math.pi / 2, z.Fp )
    L.CD = line(z.F, z.Fpp)
    z.C, z.D = intersection(CO.PA, L.CD)
}
\begin{document}
\begin{tikzpicture}
\tkzGetNodes
\tkzInit[xmin=-1,xmax=9,ymin=-6,ymax=4]
\tkzDrawX[noticks,thick]\tkzDrawY[noticks,thick]
\tkzDrawCoordinates[smooth,thick](PA.curve)
\tkzDrawSegments[thick](A,B C,D)
\tkzDrawPoints[blue](O,F,A,B,C,D)
\tkzLabelPoints[below left](O)
\tkzLabelPoints[below=3pt](A,D,F)
\tkzLabelPoints[right](B,C)
\end{tikzpicture}
\end{document}

image.png

一个显然的优点是方便控制「斜率参数」、「坐标轴长度」、「抛物线的焦点准线参数」等...

不过有点小瑕疵,如何使用一行命令控制全局的line width=1pt呢,不知为何\tkzSetUpLine并不能对图里的所有线都生效ε=( o`ω′)ノ

Absinthe
Absinthe 37分钟前
这家伙很懒,什么也没写!

一个基于 asymptotegeometry 模块的方案(编译可以在官方在线网站 Asymptote Web Application, 注意需要在最前面加上 import workcone;, 虽然没有加上也可以编译出来)如下

settings.outformat="pdf"; unitsize(1cm); 
import geometry; defaultpen(1pt);
draw(Label("$x$",1,S),(-1,0)--(4,0),arrow=Arrow());
draw(Label("$y$",1,W),(0,-4)--(0,4),arrow=Arrow());
label("$O$",(0,0),SW);
parabola parab=(parabola)(conic(bqe(0,0,1,-4,0,0))); draw(parab); 
point F=parab.F; label("$F$",F,2.5*dir(S+2*E));
real a=135;
line CD=line(a,F); line AB=perpendicular(F,CD); //draw(AB); draw(CD);
point[] P1=intersectionpoints(parab,AB); point A=P1[1],B=P1[0];
point[] P2=intersectionpoints(parab,CD); point C=P2[1],D=P2[0];
draw(A--B);  label("$A$",A,SE); label("$B$",B,E);
draw(C--D);  label("$C$",C,E); label("$D$",D,S);
draw(A--C ^^ B--D);
draw(box((-2,-5),(8,4*sqrt(2))),invisible);

效果如下
image.png

asy 提供了一种 defaultpen(1pt); 控制默认画笔线宽的方法。
image.png

坐标轴的控制 graph 模块应该也提供了相关函数(不过我给忘了,后面再补上吧)。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览