Advertisement
sdb2754

Untitled

Jun 13th, 2015
454
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.09 KB | None | 0 0
  1. rotate[\[Phi]_, \[Theta]_, \[Psi]_] := {{Cos[\[Phi]] Cos[\[Psi]], \
  2. -Cos[\[Phi]] Sin[\[Psi]],
  3. Sin[\[Phi]]}, {Cos[\[Psi]] Sin[\[Theta]] Sin[\[Phi]] +
  4. Cos[\[Theta]] Sin[\[Psi]],
  5. Cos[\[Theta]] Cos[\[Psi]] -
  6. Sin[\[Theta]] Sin[\[Phi]] Sin[\[Psi]], -Cos[\[Phi]] \
  7. Sin[\[Theta]]}, {-Cos[\[Theta]] Cos[\[Psi]] Sin[\[Phi]] +
  8. Sin[\[Theta]] Sin[\[Psi]],
  9. Cos[\[Psi]] Sin[\[Theta]] + Cos[\[Theta]] Sin[\[Phi]] Sin[\[Psi]],
  10. Cos[\[Theta]] Cos[\[Phi]]}}
  11.  
  12. face[\[Theta]_, \[Phi]_, \[Psi]_, p2_, p3_, ori_] :=
  13. Module[{v1, v2, v3, v4},
  14. v1 = rotate[\[Phi], \[Theta], \[Psi]].ori;
  15. v2 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p2);
  16. v3 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p2 + p3);
  17. v4 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p3);
  18. Polygon[{{v1.{1, 0, 0}, v1.{0, 1, 0}},
  19. {v2.{1, 0, 0}, v2.{0, 1, 0}},
  20. {v3.{1, 0, 0}, v3.{0, 1, 0}},
  21. {v4.{1, 0, 0}, v4.{0, 1, 0}}}]
  22. ]
  23.  
  24. renderorder[\[Theta]_, \[Phi]_, \[Psi]_, p2_, p3_, ori_] :=
  25. Module[{v1, v2, v3, v4},
  26. v1 = rotate[\[Phi], \[Theta], \[Psi]].ori;
  27. v2 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p2);
  28. v3 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p2 + p3);
  29. v4 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p3);
  30. Mean[Flatten@{{v1.{0, 0, 1}},
  31. {v2.{0, 0, 1}},
  32. {v3.{0, 0, 1}},
  33. {v4.{0, 0, 1}}}]
  34. ]
  35.  
  36. shader[\[Theta]_, \[Phi]_, \[Psi]_, p2_, p3_, ori_] :=
  37. Module[{v1, v2, v3, v4, lvec, nvec},
  38. v1 = rotate[\[Phi], \[Theta], \[Psi]].ori;
  39. v2 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p2);
  40. v3 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p2 + p3);
  41. v4 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p3);
  42.  
  43. lvec = {-1, 1, 1};
  44.  
  45. nvec = Cross[v2 - v1, v3 - v1];
  46.  
  47. 1 - ArcCos[lvec.nvec/(Norm[lvec] Norm[nvec])]/\[Pi]
  48.  
  49. ]
  50.  
  51. surfaces = {
  52. {{1, 0, 0}, {0, 1, 0}, {0, 0, 0}},
  53. {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}},
  54. {{1, 0, 0}, {0, 0, 1}, {0, 0, 0}},
  55. {{1, 0, 0}, {0, 0, 1}, {0, 1, 0}},
  56. {{0, 1, 0}, {0, 0, 1}, {0, 0, 0}},
  57. {{0, 1, 0}, {0, 0, 1}, {1, 0, 0}}};
  58.  
  59. Module[{\[Theta] = 0, \[Phi] = 0, \[Psi] = 0, \[Delta] = \[Pi]/24,
  60. order, shade},
  61. Framed@Pane[
  62. EventHandler[Dynamic[
  63. order =
  64. Transpose[
  65. SortBy[Table[{i,
  66. renderorder[\[Theta], \[Phi], \[Psi], surfaces[[i]][[1]],
  67. surfaces[[i]][[2]], surfaces[[i]][[3]]]}, {i, 1,
  68. Length[surfaces]}] // N, Last]][[1]];
  69. Show[
  70. Graphics[
  71. Table[{(GrayLevel[
  72. shader[\[Theta], \[Phi], \[Psi], surfaces[[#]][[1]],
  73. surfaces[[#]][[2]], surfaces[[#]][[3]]]] & /@
  74. order)[[i]], (face[\[Theta], \[Phi], \[Psi],
  75. surfaces[[#]][[1]], surfaces[[#]][[2]],
  76. surfaces[[#]][[3]]] & /@ order)[[i]]}, {i, 1,
  77. Length[surfaces]}]]
  78. , PlotRange -> {{-2, 2}, {-2,
  79. 2}}]], {"UpArrowKeyDown" :> (\[Theta] = \[Theta] + \[Delta]),
  80. "LeftArrowKeyDown" :> (\[Phi] = \[Phi] - \[Delta]),
  81. "DownArrowKeyDown" :> (\[Theta] = \[Theta] - \[Delta]),
  82. "RightArrowKeyDown" :> (\[Phi] = \[Phi] + \[Delta]), {"KeyDown",
  83. "w"} :> (\[Psi] = \[Psi] - \[Delta])}]
  84. ]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement