如何绘制面面垂直模型的外接球?

发布于 2026-09-21 00:09:53

如题,希望绘制如下的图片:

image.png

查看更多

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

学到一些新东西...

查看原图,这里定位的方式最佳的方式应该不是直接通过极坐标给定A,B,C,D四个点的坐标(实际上也很难确定),注意到其实这里的B,C,D应该是截面圆和视界圆的交点,所以我使用了out这个小特性:

   local A = sM(-140,120)
    local Out1, Out2 = {}, {}
    g:DScircle({A,vecK},{out=Out1});
    local B,C = table.unpack(ld.reverse(Out1))
    local M = (A+B)/2
    local vecN = pt3d.prod(B-A,vecK)
    g:DScircle({M,vecN},{out=Out2});
    local _,D = table.unpack(Out2)

以下是我的完整代码尝试:

\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
    \begin{luadraw}{name=perpendicular_circle}
    local ld = luadraw
    local pt3d, cpx = ld.pt3d, ld.cpx
    local M, Mc, Ms = pt3d.M, pt3d.Mc, pt3d.Ms
    local Origin, vecI, vecJ, vecK = pt3d.Origin, pt3d.vecI, pt3d.vecJ, pt3d.vecK
    local g = ld.graph3d:new{
        window3d = {-5,5,-5,5,-5,5},
        window = {-5,5,-5,5},
        -- adjust2d = true, 
        viewdir = {0,70}
    }
    require 'luadraw_spherical'
    local sM = ld.sM
    ld.Hiddenlines = true;ld.Hiddenlinestyle = "dashed"
    g:Define_sphere{ color = "", edgewidth=8, edgecolor="black" }
    g:DScircle({Origin, vecK})
    local A = sM(-140,120)
    local Out1, Out2 = {}, {}
    g:DScircle({A,vecK},{out=Out1});
    local B,C = table.unpack(ld.reverse(Out1))
    local M = (A+B)/2
    local vecN = pt3d.prod(B-A,vecK)
    g:DScircle({M,vecN},{out=Out2});
    local _,D = table.unpack(Out2)
    local O1,O2 = ld.proj3d(Origin,{M,vecK}),ld.proj3d(Origin,{M,vecN})
    local r1,r2 = pt3d.abs(C-O1), pt3d.abs(D-O2)
    g:Dcircle3d(O1,r1,vecK,"draw=none, fill=violet!50, fill opacity=0.4")
    g:Dcircle3d(O2,r2,vecN,"draw=none, fill=violet!50, fill opacity=0.4")
    g:Dspherical()
    g:Dpolyline3d({{A,B,C},{A,B,D},{C,D}},true,"dashed,red,thick")
    g:Dpolyline3d({{Origin,O1,M,O2},{A,Origin},{A,O1},{A,O2}},true,"dashed,blue!60,thick")
    g:Dballdots3d({Origin,O1,O2,A,B,C,D,M},"red")
    g:Dangle3d(Origin,O2,M,0.2,"thick");g:Dangle3d(Origin,O1,M,0.2,"thick");g:Dangle3d(O1,M,O2,0.2,"thick")
    g:Dlabel3d(
        "$O$",Origin,{pos="N"},
        "$O_2$",O2,{},
        "$D$",D,{},
        "$O_1$",O1,{pos="S"},
        "$M$",M,{pos="S"},
        "$A$",A,{pos="NE"},
        "$B$",B,{pos="SW"},
        "$C$",C,{pos="E"},
        "$\\ell$",M,{pos="W",node_options="text=red"},
        "$R$",A/2,{pos="",node_options="text=blue"},
        "$r_1$",(A+O1)/2,{},
        "$r_2$",(A+O2)/2,{}
    )
    g:Show()
\end{luadraw}
\end{document}

image.png

同样的,一些地方应该用g:DSpolyline而不是g:Dployline3d,但是不想改,我认为这是「教学性3D」,不用强制追求「真实3D」(哼)...

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览