如果「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}
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}我们可以获得比较贴近原图的效果...
