30 怎么用luadraw或者其他的来实现下面的效果,即面面相交.或者有更美丽的效果?

发布于 2026-10-01 22:10:18

111111111.png

下面是我的效果:

color=none,color=white,nocolor,opacity=0

等都无法实现无填充颜色的效果,总是灰色,不好看.

image.png

%!LW recipe=lualatex
\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}

\begin{document}
\begin{luadraw}{name=intersection_planes}
    local ld = luadraw
    local pt3d = ld.pt3d
    local Origin, vecI, vecJ, vecK, M = pt3d.Origin, pt3d.vecI, pt3d.vecJ, pt3d.vecK, pt3d.M

    local g = ld.graph3d:new{
        viewdir={"central",0,60},
        window={-5,6.9,-3.3,6}, 
        size={10,10},
        bbox=false
    }
    local P1 = ld.planeEq(0,0,1,0)
    local P2 = {Origin,M(0,1,1)}
    local l=ld.interPP(P1,P2)
    
    ld.Hiddenlines = true
    ld.Hiddenlinestyle = "dashed"

    g:Dscene3d(
    --g:addAxes(Origin,{arrows=1, color="blue"}),
        g:addPlane(P1, {
            color=none,
            edge=true,
            edgecolor="violet",
            rectangle={vecJ,6,4}
        }),
        g:addPlane(P2,{
            color=none,
            edge=true,
            edgecolor="blue",
            rectangle={M(0,-1,1),6,4}
        }),
        g:addLine(l,{color="black"}),
        g:addLabel(
            "$\\alpha$",M(1.6,-2.7,0),{dir={vecJ, -vecI}},
            "$\\beta$",M(-0.8,-1.7,2), {dir={M(0,1,-1),-vecI}}  
        )
    )
    local P=l[1]+1*l[2]
    g:Ddots3d(P,"black")
    local A=l[1]+-4*l[2]
    g:Dlabel3d({
        "$P$",P,{pos="E",node_options="xshift=0cm"},-
        "$l$",A,{pos="E",node_options="xshift=0cm"}
    })
    g:Show()
\end{luadraw}
\end{document}

查看更多

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

比较取巧的方法:

由于这里遮挡关系并不算太复杂,可以通过画两次(先遮挡再画虚线)的方法来手动维护遮挡关系:

\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
    \begin{luadraw}{name=intersected_surface}
    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,2},
        -- adjust2d = true, 
        -- viewdir = {30,75}
        viewdir = {"yz",0.75,40}
    }
    -- g:Dpolyline3d({{Origin,3*vecI},{Origin,3*vecJ},{Origin,3*vecK}}, "thick,-Stealth")
    g:Dplane({Origin, vecK}, vecI, 2, 4 , ld.all, "DarkBlue,fill=white")
    local vecN = ld.rotate3d(vecK, -70, {Origin,vecI}) -- rotate vecK 30 degree around vecI
    g:Dplane({Origin, vecN}, vecI, 2, 2.5, ld.all, "Orange,fill=white")
    g:Dplane({Origin, vecK}, vecI, 2, 4 , ld.all, "DarkBlue,dashed")
    g:Dplane({vecJ, vecK}, vecI, 2, 2 , ld.all, "DarkBlue,fill=white") -- trick, fill half plane... not elegant actually...
    g:Dplane({Origin, vecN}, vecI, 2, 2.5, ld.all, "Orange,dashed")
    g:Dpolyline3d({-2.5*vecI,2.5*vecI}, "thick")
    g:Ddots3d({Origin})
    g:Dlabel3d(
        "$\\ell$",2.5*vecI,{pos="SW"},
        "$P$",Origin,{pos="E",dist=0.1},
        "$\\alpha$",vecI-2*vecJ,{pos="NE",dir={vecJ,-vecI},node_options="text=DarkBlue",dist=0},
        "$\\beta$",ld.rotate3d(vecI-vecJ, -70, {Origin,vecI}),{pos="E",dir={-vecI,pt3d.prod(vecN,-vecI)},node_options="text=Orange"}
    )
    g:Show()
\end{luadraw}
\end{document}

image.png

Sagittarius Rover
Sagittarius Rover 1小时前
这家伙很懒,什么也没写!

比较遵照你的方案(基于g:Dscene3d)的方法:

\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,2},
        viewdir = {"yz",0.75,40}
    }
    local vecN = ld.rotate3d(vecK,-70,{Origin,vecI})
    ld.Hiddenlines = true; ld.Hiddenlinestyle="dashed"
    g:Dscene3d(
        g:addPlane({Origin,vecK},{contrast=0,rectangle={vecI,2,4},edge=true,edgecolor="DarkBlue",hidden=true}),
        g:addPlane({Origin,vecN},{contrast=0,rectangle={vecI,2,2.5},edge=true,edgecolor="Orange",hidden=true}),
        g:addDots({Origin}),
        g:addLabel(
            "$\\ell$",2.5*vecI,{pos="SW"},
            "$P$",Origin,{pos="E",dist=0.1},
            "$\\alpha$",vecI-2*vecJ,{pos="NE",dir={vecJ,-vecI},color="DarkBlue",dist=0},
            "$\\beta$",ld.rotate3d(vecI-vecJ,-70,{Origin,vecI}),{pos="E",dir={-vecI,pt3d.prod(vecN,-vecI)},color="Orange"}
        )
    )
    g:Dpolyline3d({-2.5*vecI,2.5*vecI}, "thick")
    g:Show()
    \end{luadraw}
\end{document}

image.png

这里的「灰色」的关键在于 contrast 选项(color的默认值就是white,我是能省就省的,所以我不写):

image.png

Some Notes and Comments

  • 我在构造曲面和曲线的时候是比较遵从直角坐标系的,交线的方向就是vecI
  • 我采用ld.rotate3d来处理这里的旋转,这样用到的点比较少
  • 从原图来看,我不知道你为何要用中心投影,更合理的方法应该是斜投影viewdir = {"yz",0.75,40}(类似斜二测画法)
  • 要注意的是,如果一个面是透明的,那么在它后面的线都是可见的,不会变成虚线,只是颜色稍微变暗;相反只有当一个面是不透明的,那么它后面的线才会被ld.Hiddenlines = true; ld.Hiddenlinestyle="dashed"控制。如果一个面是半透明的,那么不会(也不应该)出现虚线

可以对比一下思路 :-)

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览