30 这里画交线时,怎么画比较优雅?

发布于 2026-10-04 21:11:36

我是用scale调整红色交线a,b长度的,然后标签交线a,b都是在直线上取点的,有没有更好的方法只画alpha和beta面内的交线,我想可能是裁剪吧,或者计算交线在面内的两个端点.
另外直线的点法式local l={M(0,1,1),vecK}中,每次画直线都是以该点为中心画直线的.很像表示平面的矩形是以该点为中心画一个矩形

image.png

\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
    \begin{luadraw}{name=intersected_surface_Dscene}
    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},
        viewdir = {"yz",0.75,40},
        -- bbox=false
    }
    local P1={M(0,0,1.5),vecK}
    local P2={Origin,vecK}
    local m=ld.rotate3d(vecK,-45,{Origin,vecI})
    local P3={M(0,0,0.75),m}

    local O1,u1,v1=ld.orthoframe(P1)
    local O2,u2,v2=ld.orthoframe(P2)
    local O3,u3,v3=ld.orthoframe(P3)
    local a = ld.interPP(P1, P3)
    --g:Dline3d(a, "Navy, very thick")
    local b = ld.interPP(P2, P3)
    --g:Dline3d(b, "Navy, very thick")
    ld.Hiddenlines = true; ld.Hiddenlinestyle="dashed"
    g:Dscene3d(
        g:addPlane(P1,{contrast=0,rectangle={u1,4,2},edge=true,edgecolor="cyan"}),
        g:addPlane(P2,{contrast=0,rectangle={u2,4,2},edge=true,edgecolor="DarkBlue"}),
        g:addPlane(P3,{contrast=0,rectangle={u3,4,2},edge=true,edgecolor="black"}),
        g:addLine(a,{color="red",scale=0.2}),
        g:addLine(b,{color="red",scale=0.2})
    ) 
    g:Dlabel3d(
            "$\\alpha$",-2*u1-v1+O1,{pos="NE",node_options="cyan,xshift=0.3cm"},
            "$\\beta$",-2*u2-v2,{pos="NE",node_options="text=blue,xshift=0.4cm",dist=0},
            "$\\gamma$",2*u3-v3+O3,{pos="NE",node_options="xshift=-0.1cm"}
        )
    local A= a[1]+1.3*a[2]
    local C= b[1]+1.3*b[2]
    --g:Ddots3d({A,C}, "cyan,scale=2")
    g:Dlabel3d(
        "$a$",A,{pos="W",node_options="red"},
        "$b$",C,{pos="W",node_options="red"}
    )
    --g:Dpolyline3d({{Origin,3*vecI},{Origin,3*vecJ},{Origin,3*vecK}}, "thick,-Stealth")
    g:Show()
    \end{luadraw}
\end{document}

查看更多

关注者
0
被浏览
58
1 个回答
Sagittarius Rover
Sagittarius Rover 7小时前
这家伙很懒,什么也没写!
有没有更好的方法只画alpha和beta面内的交线,我想可能是裁剪吧,或者计算交线在面内的两个端点.
另外直线的点法式local l={M(0,1,1),vecK}中,每次画直线都是以该点为中心画直线的

这里的交线 local L1,L2 = ld.interPP(P1,Ps),ld.interPP(P2,Ps)获得的直线形式为形如{A,u},这里的A是交线“a”和“b”的中点,很巧的是,由于我们的刻意构造,在这个视角下,交线的方向恰为vecI所在的方向,同时我们在:

 g:addPlane(P1,{contrast=0,rectangle={vecI,2,4},edge=true,edgecolor="DarkBlue",hidden=true}),
        g:addPlane(P2,{contrast=0,rectangle={vecI,2,4},edge=true,edgecolor="DarkBlue",hidden=true}),

沿着vecI绘制的长度为2个单位,所以前后延长1个单位即可恰好得到两个端点:

g:Dpolyline3d({{O1-vecI,O1+vecI},{O2-vecI,O2+vecI}},"semithick,red")

完整代码:

\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
    \begin{luadraw}{name=intersected_surface_Dscene}
    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 = {-3,3,-2.5,2.5},
        viewdir = {"yz",0.75,40}
    }
    local vecN = ld.rotate3d(vecK,-50,{Origin,vecI})
    local P1,P2 = {0.75*vecK,vecK},{-0.75*vecK,vecK}
    local Ps = {Origin,vecN}
    local L1,L2 = ld.interPP(P1,Ps),ld.interPP(P2,Ps)
    ld.Hiddenlines = true; ld.Hiddenlinestyle="dashed"
    g:Dscene3d(
        g:addPlane(P1,{contrast=0,rectangle={vecI,2,4},edge=true,edgecolor="DarkBlue",hidden=true}),
        g:addPlane(P2,{contrast=0,rectangle={vecI,2,4},edge=true,edgecolor="DarkBlue",hidden=true}),
        g:addPlane(Ps,{contrast=0,rectangle={vecI,2,4.5},edge=true,edgecolor="Orange",hidden=true})
    )
    local O1,_ = table.unpack(L1)
    local O2,_ = table.unpack(L2) -- 
    g:Dpolyline3d({{O1-vecI,O1+vecI},{O2-vecI,O2+vecI}},"semithick,red")
    g:Dlabel3d(
        "$\\gamma$",O2+0.9*vecJ+1.1*vecI-0.6*vecK,{},
        "$\\alpha$",O1-1.1*vecJ+1.1*vecI,{pos="NE",node_options="text=DarkBlue"},
        "$\\beta$",O2-2.25*vecJ+1.1*vecI,{},
        "$a$",O1,{pos="W",node_options="text=red"},
        "$b$",O2,{}
    )
    g:Show()
    \end{luadraw}
\end{document}

image.png

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览