答案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);