掌握 3 点知识,绘制 3D 立方体

掌握 3 点知识,绘制 3D 立方体

我需要画这个图在此处输入图片描述而我只知道点A(11,-1,2)、B(13,2,8)和E(8,5,0)的坐标。

答案1

您可以使用交叉积来计算其他角。

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\begin{document}
\tdplotsetmaincoords{70}{110}
\begin{tikzpicture}[tdplot_main_coords,line join = round, line cap = round,
    declare function={Ax=11;Ay=-1;Az=2;Bx=13;By=2;Bz=8;Ex=8;Ey=5;Ez=0;
        Fx=Ex+Bx-Ax;Fy=Ey+By-Ay;Fz=Ez+Bz-Az;}]
 \begin{scope}
   \pgfmathsetmacro{\myn}{sqrt(pow(Bx-Ax,2)+pow(By-Ay,2)+pow(Bz-Az,2))}
   \def\tdplotcrossprod(#1,#2,#3)(#4,#5,#6){%
        \pgfmathsetmacro{\tdplotresx}{(#2) * (#6) - (#3) * (#5)}% 
        \pgfmathsetmacro{\tdplotresy}{(#3) * (#4) - (#1) * (#6)}% 
        \pgfmathsetmacro {\tdplotresz }{(#1) * (#5) - (#2) * (#4)}}
   \tdplotcrossprod(Bx-Ax,By-Ay,Bz-Az)(Ex-Ax,Ey-Ay,Ez-Az)       
   \pgfmathsetmacro{\mynx}{\tdplotresx/\myn}
   \pgfmathsetmacro{\myny}{\tdplotresy/\myn}
   \pgfmathsetmacro{\mynz}{\tdplotresz/\myn}
   \path (Ax,Ay,Az) coordinate[label=left:{$A$}] (A) 
     (Bx,By,Bz) coordinate[label=above left:{$B$}] (B)
     (Ex,Ey,Ez) coordinate[label=right:{$E$}] (E) 
     (Fx,Fy,Fz) coordinate[label=right:{$F$}] (F)
     (Ax+\mynx,Ay+\myny,Az+\mynz) coordinate[label=left:{$D$}] (D) 
     (Bx+\mynx,By+\myny,Bz+\mynz) coordinate[label=left:{$C$}] (C)
     (Fx+\mynx,Fy+\myny,Fz+\mynz) coordinate[label=right:{$G$}] (G)
     (0,0,0) coordinate (O)
     (15,0,0) coordinate[label=left:{$x$}] (ex)
     (0,10,0) coordinate[label=right:{$y$}] (ey)
     (0,0,10) coordinate[label=right:{$z$}] (ez);
 \end{scope}    
 \draw[thick] (A) -- (B) -- (F) -- (E) -- cycle
  (A) -- (D) -- (C) -- (B) (C) -- (G) -- (F); 
 \begin{scope}
  \clip (A) --(D) -- (C) -- (G) -- (F) -- (E) -- cycle 
  (current bounding box.south west) -| (current bounding box.north east) -| cycle;
  \draw[very thick,-stealth] (O) -- (ex);
  \draw[very thick,thick,-stealth] (O) -- (ey);
  \draw[very thick,thick,-stealth] (O) -- (ez);
 \end{scope}
 \begin{scope}
  \clip (A) --(D) -- (C) -- (G) -- (F) -- (E) -- cycle ;
  \draw[dashed] (O) -- (ex);
  \draw[dashed] (O) -- (ey);
  \draw[dashed] (O) -- (ez);
 \end{scope}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

圣诞快乐!

隐藏线是隐藏的,所以实际上除非有某种透明度,否则我们看不到隐藏线。虚线只是表达隐藏线的一种惯例。虚线不是真实的,而隐藏线是真实的,但是是隐藏的。虚线过去主要用于黑白图形。Dashed不是唯一的惯例:想想隐藏面和虚线面(它们是什么?^^)。我们可以使用颜色、不透明度/透明度、闪电作为表达隐藏线和隐藏面的另一种方式。

在带有模块的 Asymptote 中three,我只是按原样绘制/填充事物,也就是说,简单的放松大脑没什么技巧。更确切地说,我用它opacity(.5)来填充立方体的面。3D 效果非常棒。您可以看到标签,O并且H它们是透明的,因为它们是隐藏的;标签B是正常的,因为B是可见的。常见的内置计算如下。

  • cross(B-A,E-A)是向量AB和AE的叉积的向量;
  • unit(u)给出向量方向上的单位向量u
  • a=length(B-A)是矢量的长度AB,即立方体边长;因此
  • D=A+a*unit(cross(B-A,E-A))是立方体ABCD EFGH的顶点D;

在此处输入图片描述

// http://asymptote.ualberta.ca/
unitsize(5mm);
//import three;
import graph3;
currentprojection=obliqueX(55);
currentprojection.center=true;
//currentlight=nolight;  //  not working ? 
// vertexes of the cube
triple A=(11,-1,2), B=(13,2,8), E=(8,5,0), F=B+E-A;
real a=length(A-B);
triple D=A+a*unit(cross(B-A,E-A)), C=D+B-A;
triple G=C+F-B, H=G+E-F;
    
// pens for filling and drawing surfaces
pen pfill=green+opacity(.2);   // change opacity as you wish
pen pdraw=red+linewidth(1pt);
    
// define a command to fill and draw a face
void Drawface(triple A,triple B,triple C, triple D){
draw(surface(A--B--C--D--cycle),pfill);
draw(A--B--C--D--cycle,pdraw); 
}

// now come those faces
Drawface(B,C,G,F);Drawface(A,B,F,E);
Drawface(A,B,C,D);Drawface(E,F,G,H);
Drawface(A,D,H,E);
    
// labeling
dot("$A$",A,plain.SW);dot("$B$",B,plain.W);
dot("$C$",C,plain.NW);dot("$D$",D,plain.NW);
dot("$E$",E,plain.SE);dot("$F$",F,plain.E);
dot("$G$",G,plain.NE);dot("$H$",H,plain.NW);
dot("$O$",O,plain.NW);
    
// axes
//draw(Label("$x$",EndPoint),O--12X,Arrow3);
//draw(Label("$y$",EndPoint),O--10Y,Arrow3);
//draw(Label("$z$",EndPoint),O--8Z,Arrow3);
axes3("$x$","$y$","$z$",max=(10,8,8),Arrow3);

相关内容