学到一些新东西...
查看原图,这里定位的方式最佳的方式应该不是直接通过极坐标给定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}
同样的,一些地方应该用g:DSpolyline而不是g:Dployline3d,但是不想改,我认为这是「教学性3D」,不用强制追求「真实3D」(哼)...