How to plot a projection of parallelepiped?

Hi!

I’ve got a graphs of system of equations and parallelepipeds on it.

Tell me, please how to plot a projection of parallelepipeds?

l = Plot3D[Sin[x] + Log[y], {x, -1, 3.14}, {y, 1, 6}, 
   PlotStyle -> Opacity[0.7]];
e = Plot3D[Cos[y] + Exp[x] - 3, {x, -1, 3.14}, {y, 1, 6}, 
   ColorFunction -> "DarkRainbow"];

(*l1=Graphics3D[{Opacity[0.9],Parallelepiped[{-1,-1,0},{{7,0,0},{0,3,\
0},{0,0,5}}]},Axes\[Rule]True]*)
l1 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{-1, 
      1, -0.85}, {{1, 0, 0}, {0, 1, 0}, {0, 0, 1.6}}]}, Axes -> True];
l2 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{-1, 
      2, -0.16}, {{1, 0, 0}, {0, 1, 0}, {0, 0, 1.25}}]}, Axes -> True];
l3 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{-1, 3, 
      0.25}, {{1, 0, 0}, {0, 1, 0}, {0, 0, 1.15}}]}, Axes -> True];
l4 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{-1, 4, 
      0.55}, {{1, 0, 0}, {0, 1, 0}, {0, 0, 1.05}}]}, Axes -> True];
l5 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{-1, 5, 0.77}, {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}]},
    Axes -> True];

l6 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{0, 1, 
      0.01}, {{0.75, 0, 0}, {0, 1, 0}, {0, 0, 1.35}}]}, Axes -> True];
l7 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{0, 2, 
      0.7}, {{0.75, 0, 0}, {0, 1, 0}, {0, 0, 1.07}}]}, Axes -> True];
l8 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{0, 3, 
      1.1}, {{0.75, 0, 0}, {0, 1, 0}, {0, 0, 0.95}}]}, Axes -> True];
l9 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{0, 4, 
      1.4}, {{0.75, 0, 0}, {0, 1, 0}, {0, 0, 0.89}}]}, Axes -> True];
l10 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{0, 5, 
      1.6}, {{0.75, 0, 0}, {0, 1, 0}, {0, 0, 0.86}}]}, Axes -> True];

l11 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{0.75, 1, 
      0.69}, {{0.82, 0, 0}, {0, 1, 0}, {0, 0, 1}}]}, Axes -> True];
l12 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{0.75, 2, 
      1.37}, {{0.82, 0, 0}, {0, 1, 0}, {0, 0, 0.72}}]}, Axes -> True];
l13 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{0.75, 3, 
      1.77}, {{0.82, 0, 0}, {0, 1, 0}, {0, 0, 0.6}}]}, Axes -> True];
l14 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{0.75, 4, 
      2.05}, {{0.82, 0, 0}, {0, 1, 0}, {0, 0, 0.55}}]}, Axes -> True];
l15 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{0.75, 5, 
      2.29}, {{0.82, 0, 0}, {0, 1, 0}, {0, 0, 0.5}}]}, Axes -> True];

l16 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{1.57, 1, 
      0.69}, {{0.82, 0, 0}, {0, 1, 0}, {0, 0, 1}}]}, Axes -> True];
l17 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{1.57, 2, 
      1.37}, {{0.82, 0, 0}, {0, 1, 0}, {0, 0, 0.72}}]}, Axes -> True];
l18 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{1.57, 3, 
      1.77}, {{0.82, 0, 0}, {0, 1, 0}, {0, 0, 0.6}}]}, Axes -> True];
l19 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{1.57, 4, 
      2.05}, {{0.82, 0, 0}, {0, 1, 0}, {0, 0, 0.55}}]}, Axes -> True];
l20 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{1.57, 5, 
      2.29}, {{0.82, 0, 0}, {0, 1, 0}, {0, 0, 0.5}}]}, Axes -> True];

l21 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{2.39, 1, 
      0.01}, {{0.75, 0, 0}, {0, 1, 0}, {0, 0, 1.35}}]}, Axes -> True];
l22 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{2.39, 2, 
      0.7}, {{0.75, 0, 0}, {0, 1, 0}, {0, 0, 1.07}}]}, Axes -> True];
l23 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{2.39, 3, 
      1.1}, {{0.75, 0, 0}, {0, 1, 0}, {0, 0, 0.95}}]}, Axes -> True];
l24 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{2.39, 4, 
      1.4}, {{0.75, 0, 0}, {0, 1, 0}, {0, 0, 0.89}}]}, Axes -> True];
l25 = Graphics3D[{Opacity[0.3], 
    Parallelepiped[{2.39, 5, 
      1.6}, {{0.75, 0, 0}, {0, 1, 0}, {0, 0, 0.89}}]}, Axes -> True];



e1 = Graphics3D[{Opacity[0.3], Green, 
    Parallelepiped[{0.4, 
      1, -0.914}, {{0.97, 0, 0}, {0, 1, 0}, {0, 0, 1.5}}]}, 
   Axes -> True];
e2 = Graphics3D[{Opacity[0.3], Green, 
    Parallelepiped[{1.07, 1, 
      0.586}, {{0.6, 0, 0}, {0, 1, 0}, {0, 0, 1.5}}]}, Axes -> True];
e3 = Graphics3D[{Opacity[0.3], Green, 
    Parallelepiped[{1.48, 1, 
      2.086}, {{0.33, 0, 0}, {0, 1, 0}, {0, 0, 0.76}}]}, Axes -> True];

e4 = Graphics3D[{Opacity[0.3], Green, 
    Parallelepiped[{0.88, 
      2, -0.914}, {{0.6, 0, 0}, {0, 1, 0}, {0, 0, 1.5}}]}, 
   Axes -> True];
e5 = Graphics3D[{Opacity[0.3], Green, 
    Parallelepiped[{1.36, 2, 
      0.586}, {{0.42, 0, 0}, {0, 1, 0}, {0, 0, 1.5}}]}, Axes -> True];
e6 = Graphics3D[{Opacity[0.3], Green, 
    Parallelepiped[{1.67, 2, 
      2.086}, {{0.24, 0, 0}, {0, 1, 0}, {0, 0, 0.76}}]}, Axes -> True];

e7 = Graphics3D[{Opacity[0.3], Green, 
    Parallelepiped[{0.95, 
      3, -0.914}, {{0.54, 0, 0}, {0, 1, 0}, {0, 0, 1.5}}]}, 
   Axes -> True];
e8 = Graphics3D[{Opacity[0.3], Green, 
    Parallelepiped[{1.42, 3, 
      0.586}, {{0.37, 0, 0}, {0, 1, 0}, {0, 0, 1.5}}]}, Axes -> True];
e9 = Graphics3D[{Opacity[0.3], Green, 
    Parallelepiped[{1.72, 3, 
      2.086}, {{0.19, 0, 0}, {0, 1, 0}, {0, 0, 0.76}}]}, Axes -> True];

e10 = Graphics3D[{Opacity[0.3], Green, 
    Parallelepiped[{0.58, 
      4, -0.914}, {{0.83, 0, 0}, {0, 1, 0}, {0, 0, 1.5}}]}, 
   Axes -> True];
e11 = Graphics3D[{Opacity[0.3], Green, 
    Parallelepiped[{1.17, 4, 
      0.586}, {{0.55, 0, 0}, {0, 1, 0}, {0, 0, 1.5}}]}, Axes -> True];
e12 = Graphics3D[{Opacity[0.3], Green, 
    Parallelepiped[{1.53, 4, 
      2.086}, {{0.34, 0, 0}, {0, 1, 0}, {0, 0, 0.76}}]}, Axes -> True];

e13 = Graphics3D[{Opacity[0.3], Green, 
    Parallelepiped[{0.12, 
      5, -0.914}, {{1.05, 0, 0}, {0, 1, 0}, {0, 0, 1.5}}]}, 
   Axes -> True];
e14 = Graphics3D[{Opacity[0.3], Green, 
    Parallelepiped[{0.93, 5, 
      0.586}, {{0.6, 0, 0}, {0, 1, 0}, {0, 0, 1.5}}]}, Axes -> True];
e15 = Graphics3D[{Opacity[0.3], Green, 
    Parallelepiped[{1.388, 5, 
      2.086}, {{0.3, 0, 0}, {0, 1, 0}, {0, 0, 0.76}}]}, Axes -> True];

Show[l, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, 
  l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, l25];
Show[l, e, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, 
  e14, e15];

Show[l, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, \
l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, l25, e, e1, e2, e3, \
e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15]
Show[l, e];

here I plotted a projection of equations

  ContourPlot[{Cos[y] + Exp[x] - 3 == 0, Sin[x] + Log[y] == 0, 
      Parallelepiped[{0.4, 
        1, -0.914}, {{0.97, 0, 0}, {0, 1, 0}, {0, 0, 1.5}}]}, {x, -1, 
      Pi}, {y, -5, Pi}]

You want to project a parallelepiped onto a plane? Then have two base vectors b_1 and b_2 in that plane and use Projection where e.g.in the first argument appear all (eight) vertices of the parallelepiped and in the second argument appear all (two) base vectors - all different pairs are needed; this is a compact small expression. Then plot the resulting points in the base b_1, b_2 of that plane. If you do then the ConvexHull of the projected points, you get the projection without inner points.

Can you give an example, please ?

Had you only typed

    Clear[pepP, pepL, pepF, plane, proJ, prjL]
    pepP[x1_?NumericQ, x2_?NumericQ, x3_?NumericQ] :=
     (* euclidean orthonormal base *)
     Block[{p0 = {0, 0, 0}, v1 = {x1, 0, 0}, v2 = {0, x2, 0}, 
        v3 = {0, 0, x3}},
       If[Chop[v1.Cross[v2, v3]] == 0,
        Print["Parallelepiped has no volume in 3D."];
        Return[$Failed]
        ];
       Flatten[{#, Plus[v3, #] & /@ #} &[{p0, v1, v1 + v2, v2}], 1]
       ] /;(* otherwise get orientation right *) x1 > 0 && x2 > 0 && x3 > 0
    pepL[x1_?NumericQ, x2_?NumericQ, x3_?NumericQ] := 
     Block[{p = pepP[x1, x2, x3], l1, l2},
      l1 = Flatten[{p[[1 ;; 4]], {p[[1]]}}, 1];
      l2 = Flatten[{p[[5 ;; 8]], {p[[5]]}}, 1];
      Join[Partition[l1, 2, 1], Partition[l2, 2, 1], Transpose[{p[[1 ;; 4]], p[[5 ;; 8]]}]]
       ]
    pepF[x1_?NumericQ, x2_?NumericQ, x3_?NumericQ] := 
     Block[{p = pepP[x1, x2, x3]},
      {p[[1 ;; 4]], {p[[1]], p[[2]], p[[6]], p[[5]]}, {p[[2]], p[[3]], p[[7]], p[[6]]}, 
       {p[[3]], p[[4]], p[[8]], p[[7]]}, {p[[4]], p[[1]], p[[5]], p[[8]]}, p[[5 ;; 8]]}
       ]
    (* get a base in the plane to project onto *)
    plane[\[CurlyPhi]_?NumericQ, v_] := N[RotationMatrix[\[CurlyPhi], v][[1 ;; 2]]] /; Length[v] == 3 
                && VectorQ[v, NumericQ]
    (* orthogonal or orthographic projection *)
    proJ[b_, l_] := (Most[Projection[#, b[[1]]] + Projection[#, b[[2]]]]) & /@ l
    prjL[b_, l_] := proJ[b, #] & /@ l /; Length[b] == 2 && Chop[Dot[b[[1]], b[[2]]]] == 0
    
    In[63]:= Graphics3D[Line /@ pepL[1, 2, 3], Axes -> True, AxesLabel -> {X, Y, Z}]
    
    In[192]:= Graphics3D[{Opacity[.93], Polygon /@ pepF[1, 2, 3]}, 
     Axes -> True, AxesLabel -> {X, Y, Z}]
    
    In[191]:= plane[0 \[Degree], {1, 3, 1}]
    Out[191]= {{1., 0., 0.}, {0., 1., 0.}}
    
    In[190]:= Graphics[Line /@ prjL[plane[0 \[Degree], {1, 3, 1}], pepL[1, 2, 3]], 
     Axes -> True, AxesLabel -> {Subscript[x, p], Subscript[y, p]}]

you had solved it on your own. Now do a projection

Graphics[Line /@ prjL[plane[43 \[Degree], {1, -3, 1}], pepL[1, 2, 3]], Axes -> True, 
 AxesLabel -> {Subscript[x, p], Subscript[y, p]}]

Please note that the above picture is a 2D graphics, not a 3D graphics! It’s shown in the 2D co-ordinate system of the projection plane. The edges of the parallelepiped are shown for control, not for confusion. Convince yourself by doing the convex hull which is the projection

ConvexHullMesh[Flatten[prjL[plane[43 \[Degree], {1, -3, 1}], pepL[1, 2, 3]], 1]]

In reality one must find some co-ordinate base in the projection plane, which has been done here rather rude by the function plane. Furthermore in general no point of the parallelepiped will coincide with the co-ordinate origin of the projection plane, as it is the case in the above code for the sake of simplicity. Certainly you will have knowledge about the projection plane from the context of your work.

Thank you!!!

The orthographic projection of parallel lines onto a plane needs to produce parallel lines. The convex hull mesh above seems not to show that. So boiler-plate code to check this has been typed

(* Test: the projection needs to have 3 groups of paralellel lines, \
each group containing 4 lines *)
Clear[pepQ]
pepQ[l_] := Block[{x = Subtract @@@ l, n = {0, 0, 0}},
   If[Cross[x[[1]], x[[3]]] == n && Cross[x[[3]], x[[5]]] == n && 
     Cross[x[[5]], x[[7]]] == n && Cross[x[[2]], x[[4]]] == n && 
     Cross[x[[4]], x[[6]]] == n && Cross[x[[6]], x[[8]]] == n && 
     Cross[x[[9]], x[[10]]] == n && Cross[x[[10]], x[[11]]] == n && 
     Cross[x[[11]], x[[12]]] == n, True, False]
   ] /; Last[Dimensions[l]] == 3
pepQ[l_] := Block[{x = Subtract @@@ l},
   If[Chop[Det[{x[[1]], x[[3]]}]] == 0 && 
     Chop[Det[{x[[3]], x[[5]]}]] == 0 && 
     Chop[Det[{x[[5]], x[[7]]}]] == 0 && 
     Chop[Det[{x[[2]], x[[4]]}]] == 0 && 
     Chop[Det[{x[[4]], x[[6]]}]] == 0 && 
     Chop[Det[{x[[6]], x[[8]]}]] == 0 && 
     Chop[Det[{x[[9]], x[[10]]}]] == 0 && 
     Chop[Det[{x[[10]], x[[11]]}]] == 0 && 
     Chop[Det[{x[[11]], x[[12]]}]] == 0, True, False]
   ] /; Last[Dimensions[l]] == 2

and the parallelepiped as well as the projection has been tested

In[78]:= pepQ[pepL[1, 2, 3]]
Out[78]= True

In[129]:= 
With[{v = RandomReal[{-17, 17}, 3]},
 If[Chop /@ v == {0, 0, 0},
  Print["Random zero vector. Try again!"];
  Return[$Failed], (* else *)
  And @@ (pepQ[
       prjL[plane[(#) \[Degree], v], pepL[1, 2, 3]]] & /@ 
     RandomReal[{-360, 360}, 128])
  ]
 ]

Out[129]= True

it works. Somehow the convex hull mesh looks like an optical illusion - one seems not to see 3 pairs of parallels, but only 2 pairs of parallels.