免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 发帖

已知立体几何图形的几个点的坐标,如何在平面上画出来

记得以前有一个题,是求一个正方体在平面$\theta$上的正投影的最大面积的,最后一种情况:有一个顶点在$\theta$上,没有棱和$\theta$平行。这个立体图要怎么用tikz画出来?我用Geogebra画了一个,但是很不标准,只能当成示意图,里面的点都是我凭感觉乱画的。想知道用tikz怎么方便地画出这种图。
1.gif
2016-2-29 14:00
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

在我印象中,tikz 处理立体图形也是很麻烦的。不过有tikz-3d(具体名忘记了).

TOP

本帖最后由 abababa 于 2016-3-5 12:25 编辑

回复 2# isee
确实挺麻烦的,刚才问了maven网友,他教了我一个方法,最后画出来的感觉还不错,但是也需要计算点的坐标。
我是用Mathematica软件计算的这些点的坐标,有的地方还不明白。把他跟我说的整理一下就是下面这些:
正方体投影.gif
2016-3-5 12:22

phi=Pi/4
alpha=Pi/4
beta=3Pi/4
gamma=Pi/2
AA = {{Cos[phi], -Sin[phi], 0, 0},{Sin[phi], Cos[phi], 0, 0},{0, 0, 1, 0},{0, 0, 0, 1}}
BB =
{{0, Csc[alpha]*Cos[gamma], -Csc[alpha] Cos[beta], 0},
{-Sin[alpha], Cot[alpha] Cos[beta], Cot[alpha] Cos[gamma], 0},
{Cos[alpha], Cos[beta], Cos[gamma], 0},
{0, 0, 0, 1}}
pl = Inverse[BB].AA.BB
n1=0
n2=1
n3=0
v1=1
v2=-3/2
v3=1/2
d1=v1*n1+v2*n2+v3*n3
pp = {{d1-v1*n1, -v1*n2, -v1*n3, 0}, {-v2*n1, d1-v2*n2, -v2*n3, 0}, {-v3*n1, -v3*n2, d1-v3*n3, 0}, {0, 0, 0, d1}}/d1

下面的这个是立方体坐标,这个我能看懂。
V = {{0, 0, 0, 1}, {4, 0, 0, 1}, {4, 4, 0, 1}, {0, 4, 0, 1}, {0, 0, 4, 1}, {4, 0, 4, 1}, {4, 4, 4, 1}, {0, 4, 4, 1}}
VV1 = pl.Transpose[V]
VV2 = pl.Transpose[V]
VV2[[3]] = {0, 0, 0, 0, 0, 0, 0, 0}
Simplify[Transpose[pp.VV1]],这里是立方体各顶点在平面$\theta$上的坐标(这里网友说是平面$\theta$,我觉得不是,应该是pdf的这个平面上的坐标,平面$\theta$上的坐标感觉还好算一点)
Simplify[Transpose[pp.VV2]],这里是顶点的各垂足在平面$\theta$上的坐标
算出来以后就能用tikz画了,代码:
  1. \begin{tikzpicture}
  2. \coordinate (A) at (0,0);
  3. \coordinate (B) at ({(2+5*sqrt(2))/3},{(4+sqrt(2))/3});
  4. \coordinate (C) at ({10*sqrt(2)/3},{2*(6+sqrt(2))/3});
  5. \coordinate (D) at ({(-2+5*sqrt(2))/3},{(8+sqrt(2))/3});
  6. \coordinate (A_1) at ({-10/3},{-2/3+2*sqrt(2)});
  7. \coordinate (B_1) at ({(-8+5*sqrt(2))/3},{(2+7*sqrt(2))/3});
  8. \coordinate (C_1) at ({10*(-1+sqrt(2))/3},{2*(5+4*sqrt(2))/3});
  9. \coordinate (D_1) at ({-4+5*sqrt(2)/3},{2+7*sqrt(2)/3});

  10. \coordinate (B_h) at ({(2+5*sqrt(2))/3},{(-2+sqrt(2))/3});
  11. \coordinate (C_h) at ({10*sqrt(2)/3},{2*sqrt(2)/3});
  12. \coordinate (D_h) at ({(-2+5*sqrt(2))/3},{(2+sqrt(2))/3});
  13. \coordinate (A_{1h}) at ({-10/3},{-2/3});
  14. \coordinate (B_{1h}) at ({(-8+5*sqrt(2))/3},{(-4+sqrt(2))/3});
  15. \coordinate (C_{1h}) at ({10*(-1+sqrt(2))/3},{2*(-1+sqrt(2))/3});
  16. \coordinate (D_{1h}) at ({-4+5*sqrt(2)/3},{sqrt(2)/3});

  17. \tkzLabelPoints[below](A);
  18. \tkzLabelPoints[left](A_1);
  19. \tkzLabelPoints[right](B,C,D);
  20. \tkzLabelPoints[above left](B_1,C_1,D_1);

  21. \tkzDrawSegments(B,C A_1,B_1 B_1,C_1 C_1,D_1 D_1,A_1 B,B_1 C,C_1);
  22. \tkzDrawSegments[style=dashed](A,B A,D A,A_1 D,D_1 C,D);
  23. \tkzDrawSegments(B,B_h C,C_h A_1,A_{1h} B_1,B_{1h});
  24. \tkzDrawSegments[style=dashed](C_1,C_{1h} D,D_h D_1,D_{1h});
  25. \tkzDrawSegments[style=dashed](D_h,D_{1h} D_{1h},A_{1h} D_{1h},C_{1h} C_{1h},B_{1h} C_h,C_{1h} D_h,C_h);
  26. \tkzDrawSegments(B_{1h},A_{1h} B_{1h},B_h B_h,C_h);
  27. \end{tikzpicture}
复制代码

TOP

虽然看不懂,但看起来好厉害的样子……

TOP

回复 4# kuing

AA和BB两个矩阵听他说是旋转的意思,一个是绕直线旋转,一个是旋转多少角度,最后做成一个pl矩阵。pp矩阵是沿向量方向向某个指定平面投影的意思。
唉,还是让我看线性代数的书,只是我看了也不了解,本身就不太懂。目前能用tikz画这个图就行了。

TOP

回复 5# abababa

闲来无事又看了下这帖,我试了一下
BB={{0,Csc[alpha]*Cos[gamma],-Csc[alpha] Cos[beta],0},{-Sin[alpha],Cot[alpha] Cos[beta],Cot[alpha] Cos[gamma],0},{Cos[alpha],Cos[beta],Cos[gamma],0},{0,0,0,1}};
{0,0,z,1}.BB
结果输出 {z Cos[alpha], z Cos[beta], z Cos[gamma], 1}
于是我猜,这个 BB 是不是就是将 `z` 轴旋转到直线 `L`: `x/\cos\alpha=y/\cos\beta=z/\cos\gamma` 呢?
如果我猜对了,那么 Inverse[BB].AA.BB 相就当于:将 `L` 旋转到 `z` 轴,然后绕 `z` 轴旋转,最后再旋转回 `L` 上,效果就是绕 `L` 旋转了。
另外,照这样看,那开头输入的 alpha=Pi/4、beta=3Pi/4、gamma=Pi/2 需要满足余弦平方和为 1。

TOP

1.png
2019-4-9 20:34

2.png
2019-4-9 20:34

3.png
2019-4-9 20:34

4.png
2019-4-9 20:34

TOP

另外,如果想画立体图形,最方便的还是asymptote宏包

TOP

回复 8# hejoseph

对,定是 asymptote 宏包了~!

TOP

有空再学习下 asymptote,现在依照 7# Euler 角的方法,不借助其他工具在 tikz 里画楼主的图:
  1. \documentclass{article}
  2. \usepackage{tikz}
  3. \usetikzlibrary{calc}

  4. \def\setEangles#1,#2,#3;{\def\apa{#1}\def\bta{#2}\def\gma{#3}}
  5. \newcommand\getEpoints[4]{%
  6. \pgfmathparse{
  7. #1*(cos(\apa)*cos(\gma)-cos(\bta)*sin(\apa)*sin(\gma))
  8. +#2*(-cos(\bta)*cos(\gma)*sin(\apa)-cos(\apa)*sin(\gma))
  9. +#3*sin(\apa)*sin(\bta)
  10. }
  11. \coordinate (#4x) at (\pgfmathresult,0);
  12. \pgfmathparse{
  13. #1*(cos(\gma)*sin(\apa)+cos(\apa)*cos(\bta)*sin(\gma))
  14. +#2*(cos(\apa)*cos(\bta)*cos(\gma)-sin(\apa)*sin(\gma))
  15. -#3*cos(\apa)*sin(\bta)
  16. }
  17. \coordinate (#4y) at (0,\pgfmathresult);
  18. \pgfmathparse{#1*sin(\bta)*sin(\gma)+#2*cos(\gma)*sin(\bta)+#3*cos(\bta)}
  19. \coordinate (#4z) at (0,0,\pgfmathresult);
  20. \coordinate (#4) at ($(#4x)+(#4y)+(#4z)$);
  21. \coordinate (#4xy) at ($(#4x)+(#4y)$);
  22. \coordinate (#4xz) at ($(#4x)+(#4z)$);
  23. \coordinate (#4yz) at ($(#4y)+(#4z)$);
  24. }

  25. \begin{document}

  26. \begin{tikzpicture}[x={(-135:0.5cm)},y={(1cm,0)},z={(0,1cm)}]
  27. \coordinate (A) at (0,0);
  28. \draw[-latex](A)--(5,0)node[left]{$x$};
  29. \draw[-latex](A)--(0,5)node[right]{$y$};
  30. \draw[-latex](A)--(0,0,5)node[above]{$z$};
  31. \setEangles 30,35,40;
  32. \getEpoints 400B
  33. \getEpoints 040D
  34. \getEpoints 004{A1}
  35. \getEpoints 440C
  36. \getEpoints 404{B1}
  37. \getEpoints 044{D1}
  38. \getEpoints 444{C1}
  39. \draw(A)node[below]{$A$}--(B)node[right]{$B$}--(C)node[right]{$C$}--(D)node[above]{$D$}--cycle;
  40. \draw(A1)node[left]{$A_1$}--(B1)node[right]{$B_1$}--(C1)node[above]{$C_1$}--(D1)node[above]{$D_1$}--cycle;
  41. \foreach \i in {A,B,C,D} {\draw(\i)--(\i1);}
  42. \foreach \i in {B,C,D,A1,B1,C1,D1} {\draw[dashed](\i)--(\i xy);}
  43. \draw[dashed](Bxy)--(Cxy)--(Dxy)--(D1xy)--(A1xy)--(B1xy)--cycle;
  44. \draw[dashed](C1xy)--(Cxy)(C1xy)--(B1xy)(C1xy)--(D1xy);
  45. \end{tikzpicture}

  46. \end{document}
复制代码
效果:
QQ截图20190412152959.png
2019-4-12 15:30

其中 \setEangles 的那三个数就是 `\alpha`, `\beta`, `\gamma`,我上面设的 30,35,40 只是随手写的,你可以更改它们看不同的效果。
为了方便画投影,我让一个 \getEpoints 就定义 7 个点:目标点及其三个坐标轴和三个坐标平面的投影。
$\href{https://kuingggg.github.io/}{\text{About Me}}$

TOP

返回列表 回复 发帖