如何绘制正四棱锥的外接球?

发布于 2026-09-22 13:34:42

如题,希望绘制如下的正四棱锥的外接球:

image.png

查看更多

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

原图又在骗

如果「D」点确实是截面圆与视界圆的切点的话,那么根本不可能看到如上角度的蓝色三角形:

\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
    \begin{luadraw}{name=cuboid_sphere}
    local ld = luadraw
    local pt3d = ld.pt3d
    local M, Origin, vecK = pt3d.M, pt3d.Origin, pt3d.vecK
    local g = ld.graph3d:new{
        window3d = {-5,5,-5,5,-5,5},
        window = {-5,5,-5,5},
        -- adjust2d = true, 
        viewdir = {20,75} 
    }
   require 'luadraw_spherical'
    local sM = ld.sM
    ld.Hiddenlines = true;ld.Hiddenlinestyle = "dashed"
    g:Define_sphere{ color = "", edgewidth=8, edgecolor="black" }
    local sqrt = math.sqrt
    local h = 1.75
    local O1, P = M(0,0,-h), sM(0,0)
    local Out = {}
    g:DScircle({O1,vecK},{out=Out});
    local D, _ = table.unpack(Out)
    local A = ld.rotate3d(D, 90, {O1, vecK})
    local B = ld.rotate3d(A, 90, {O1, vecK})
    local C = ld.rotate3d(B, 90, {O1, vecK})
    local vecn = pt3d.prod(A-P,D-P)
    local O2 = ld.proj3d(Origin,{P,vecn})
    local h1,h2 = pt3d.abs(Origin-O1),pt3d.abs(Origin-O2)
    local r1,r2 = sqrt(3^2-h1^2),sqrt(3^2-h2^2)
    g:DScircle({Origin,vecK})
    local T = ld.facet2poly( ld.cvx_hull3d({A,B,C,D,P}) )
    g:Dcircle3d(O1,r1,vecK,"draw=none,fill=blue!25, fill opacity=0.4") 
    g:Dcircle3d(O2,r2,vecn,"draw=none,fill=blue!25, fill opacity=0.4") 
    g:DScircle({O1,vecK}); g:DScircle({O2,vecn})
    g:Dpoly(T,{color="violet!30!white",mode=ld.mFlatHidden,edgewidth=8,hiddenstyle="dashed"})
    g:Dspherical()
    g:Dpolyline3d({P,O1,A,Origin},"blue,dashed,semithick")
    g:Dballdots3d({Origin,O1,A,B,C,D,P},"red",0.75)
    g:Dlabel3d(
        "$O$",Origin,{pos="W"},
        "$O_1$",O1,{},
        "$P$",P,{pos="N"},
        "$A$",A,{pos="NE"},
        "$B$",B,{pos="W"},
        "$C$",C,{pos="S"},
        "$D$",D,{pos="E"},
        "$h$",O1/2,{pos="W"},
        "$R$",P/2,{pos="",node_options="text=blue"},
        "$R$",A/2,{},
        "$r$",(O1+A)/2,{pos="E"}
    )
    g:Show()
\end{luadraw}
\end{document}

image.png

把底面微调成长方形,修改这里的旋转角度:

    local D, _ = table.unpack(Out)
    local A = ld.rotate3d(D, 75, {O1, vecK}) -- <- 75 degree?
    local B = ld.rotate3d(A, 115, {O1, vecK})
    local C = ld.rotate3d(B, 75, {O1, vecK})

完整代码如下:

\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
    \begin{luadraw}{name=cuboid_sphere}
    local ld = luadraw
    local pt3d = ld.pt3d
    local M, Origin, vecK = pt3d.M, pt3d.Origin, pt3d.vecK
    local g = ld.graph3d:new{
        window3d = {-5,5,-5,5,-5,5},
        window = {-5,5,-5,5},
        -- adjust2d = true, 
        viewdir = {20,75} 
    }
   require 'luadraw_spherical'
    local sM = ld.sM
    ld.Hiddenlines = true;ld.Hiddenlinestyle = "dashed"
    g:Define_sphere{ color = "", edgewidth=8, edgecolor="black" }
    local sqrt = math.sqrt
    local h = 1.75
    local O1, P = M(0,0,-h), sM(0,0)
    local Out = {}
    g:DScircle({O1,vecK},{out=Out});
    local D, _ = table.unpack(Out)
    local A = ld.rotate3d(D, 75, {O1, vecK}) -- <- 75 degree?
    local B = ld.rotate3d(A, 115, {O1, vecK})
    local C = ld.rotate3d(B, 75, {O1, vecK})
    local vecn = pt3d.prod(A-P,D-P)
    local O2 = ld.proj3d(Origin,{P,vecn})
    local h1,h2 = pt3d.abs(Origin-O1),pt3d.abs(Origin-O2)
    local r1,r2 = sqrt(3^2-h1^2),sqrt(3^2-h2^2)
    g:DScircle({Origin,vecK})
    local T = ld.facet2poly( ld.cvx_hull3d({A,B,C,D,P}) )
    g:Dcircle3d(O1,r1,vecK,"draw=none,fill=blue!25, fill opacity=0.4") 
    g:Dcircle3d(O2,r2,vecn,"draw=none,fill=blue!25, fill opacity=0.4") 
    g:DScircle({O1,vecK}); g:DScircle({O2,vecn})
    g:Dpoly(T,{color="violet!30!white",mode=ld.mFlatHidden,edgewidth=8,hiddenstyle="dashed"})
    g:Dspherical()
    g:Dpolyline3d({P,O1,A,Origin},"blue,dashed,semithick")
    g:Dballdots3d({Origin,O1,A,B,C,D,P},"red",0.75)
    g:Dlabel3d(
        "$O$",Origin,{pos="W"},
        "$O_1$",O1,{},
        "$P$",P,{pos="N"},
        "$A$",A,{pos="NE"},
        "$B$",B,{pos="W"},
        "$C$",C,{pos="S"},
        "$D$",D,{pos="E"},
        "$h$",O1/2,{pos="W",dist=0.1},
        "$R$",P/2,{pos="",dist=0,node_options="text=blue"},
        "$R$",A/2,{},
        "$r$",O1/3+2*A/3,{pos="S"}
    )
    g:Show()
\end{luadraw}
\end{document}

我们可以获得比较贴近原图的效果...

image.png

真的别用伪3D来骗了😡😡😡😡😡修改和分析成本很大,打咩!

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览