Figure Asymptote three -- 007
🔗This picture comes from the Asymptote gallery of topic three

From the Asymptote forum.
Show three/fig0070.asy on Github.
Generated with Asymptote 3.00-0.
Categories : Examples 3D | Three.asy
Tags : #Bsp | #Wire frame | #Plan
import bsp; typedef path3[] shape; shape operator *(transform3 T, shape p){ shape os; for(path3 g:p) os.push(T*g); return os; } path3 path(triple[] T){ path3 P; for(triple i:T) P=P--i; return P; } void addshapes(face[] F, shape[] shp, pen drawpen=currentpen, pen fillpen=white) { for(int i=0; i < shp.length; ++i) for(int j=0; j < shp[i].length; ++j) { path3 g=shp[i][j]; picture pic=F.push(g); filldraw(pic, project(g), fillpen, drawpen); // filldraw(pic, g, currentlight.intensity(F[F.length-1].point)*fillpen, drawpen); } } shape cylinder(real R=1, real H=1, int n=18){ shape Cyl; triple[] CTop; triple[] CBot; for(int i=0; i <= n; ++i) CBot.push((R*cos(2pi*i/n), R*sin(2pi*i/n), 0)); CTop = CBot+(0, 0, H); for(int i=0; i < n; ++i) Cyl.push(CBot[i]--CBot[i+1]--CTop[i+1]--CTop[i]--cycle); path3 P=path(CBot)--cycle; Cyl.push(P); Cyl.push(shift(H*Z)*P); return Cyl; } shape rightslab(real x=1, real y=1, real z=1){ shape slab; slab[0] = (0, 0, 0)--(1, 0, 0)--(1, 1, 0)--(0, 1, 0)--cycle; slab[1] = (0, 0, 0)--(1, 0, 0)--(1, 0, 1)--(0, 0, 1)--cycle; slab[2] = (1, 0, 0)--(1, 1, 0)--(1, 1, 1)--(1, 0, 1)--cycle; slab[3] = (1, 1, 0)--(0, 1, 0)--(0, 1, 1)--(1, 1, 1)--cycle; slab[4] = (0, 1, 0)--(0, 0, 0)--(0, 0, 1)--(0, 1, 1)--cycle; slab[5] = (0, 0, 1)--(1, 0, 1)--(1, 1, 1)--(0, 1, 1)--cycle; return scale(x, y, z)*slab; } size(10cm, 0); triple cam=(1600, 200, 150); //currentprojection=orthographic(1600, 800, 400); currentprojection=perspective(cam); //Far away! currentlight=rotate(-45, Z)*(cam+(0, 0, 1000)); real Blen = 180; real Bwdt = 30; real Bhgt = 3; real Clen = 130; real Cwdt = 50; real Chgt = 50; real cylr = 7.5; real cylh = 37.0 ; shape slab1 = shift(-Bwdt/2*Y-Bhgt/2*Z+Clen/2*X)*rightslab(Blen, Bwdt, Bhgt); shape slab2 = shift(-Cwdt/2*Y-Chgt/2*Z-Clen/2*X)*rightslab(Clen, Cwdt, Chgt); shape cyl1 = shift((Blen+Clen/2-2*cylr)*X-(cylh/2)*Z)*cylinder(R=cylr, H=cylh); shape[] group1={slab1}; shape[] group2={slab2}; shape[] group3={cyl1}; face[] faces; addshapes(faces, group1, drawpen=linewidth(0.25bp), fillpen=opacity(0.35)+red); addshapes(faces, group2, drawpen=linewidth(0.25bp), fillpen=opacity(0.5)+lightblue); addshapes(faces, group3, drawpen=linewidth(0.25bp), fillpen=opacity(0.5)+lightyellow); add(faces); shipout(format="pdf", bbox(3mm, white));