/*
Science building harvard
Unit 1 = 1m
Origin: corner to Memorial hall
z-direction: main entrance face side
x-direction: cooling tower side
Oliver Knill, Jul 2000-Jun 2001
Harvard University
All the measurements are rough estimates from photos
From above:
v0 v1 v2 v3 v4 v5 v6 v7 v8=a2
U9 U10 P37 P38 b19=2b+b14
u7=b19 +--------+ +-----------+
/ Spp8*\ P34 P33
u6 U7 / +---+-----------+ 2b
u5 +-----+U8 U11 |U12 |
| * Sp8 * | |
x | * Sp7 Spp7 | |
V4 | * Sp6 * | |
u4 U5+------+U6 x Spp6 |P35 |P36
/ V3 * Sp5 +-----------+ b18=2b-b15
/ xV1 Spp5 | |
/ V2 * Sp4 * | |
u3 U4+ * x * Sp3 | |
| Sp1 * | |
| Sp2 Spp4 | P41 P42| b17
| * | ========= |
| | P39 P40| b16
u2 U3+ Spp1 | |
\ * Spp3 | |
u1 +U2 * | |
| Spp2 | |
| * | |
P4 | S1 S2 S3 S4 S5 P12=U0
u0=b +--+----------------------------------------------+ P3 b
| U1| | | | | | | |
| | | | | | DD b13 | | |
| | | | | | a13 |-----------|
| | | | | | | |
|P10 | P8 | | | P7 P31 P32| b12
+---------+---------------------------+ ========= | b11 b2
| T1 T2 T3 T4 T5 P45 | P29 P30|
| | Glass | a9 a10|
|+--+ |------------------+ | |
b3 || | |------------------+ | P27 P28| b10
|+--+ |------------------+ b20 | ========= | b9
| a3 | P43 P44 | P25 P26|
| | a14 | |
| | |-----------|
| | | | |
| | | | |
| | |-----------|
| | | |
b1 | P5 +---------------------------+ P6 |
| +--+ | b8 P24 P23 |-----------|
| b4 +--+ | b7 ======== |P15 | P16 b5
| a4 | P21 P22 | O O |
|P1 | P9 a7 a8 |P13 | P14 b0
0 +---------+-------------------------------P19=P20-+ P2
0 a1 a2 a5 a6 a
P11 P17 P18
*/
#include "greenhouse.inc"
#declare h1 = 30; // height of library block
#declare h2 = 20; // height of administration block
#declare h3 = 40; // height of first stair block
#declare h4 = 70; // height of large back block
#declare h5 = 50; // height of second stair block
#declare h6 = 60; // height of third stair block
#declare h7 = 70; // height of fourth stair block
#declare h8 = 80; // height of fifth stair block
#declare h9 = 100; // height of sixth stair block
#declare h10 = 30; // height of big block near cooling tower
#declare h11 = 30; // height of big block at other end
#declare a = 250; // width of building
#declare b = 250; // length of building
#declare a1 = 80; // width of library block
#declare a2 = 190; // start of large bock in back
#declare a5 = a2+10; // beginning of column for large block
#declare a6 = a2+40; // end of column for large block
#declare b0 = 6; // offset of large block
#declare b1 = 50; // length of administr block
#declare b2 = 180; // start of stair block
#declare st = 25; // step width
#declare c3 = 20; // bigger prism length
#declare d3 = 15; // bigger prism width
#declare c4 = 7; // smaller prism length
#declare d4 = 12; // smaller prism width
#declare e3 = 30; // height bigger prism
#declare e4 = 20; // height smaller prism
#declare a3 = 30; // location of air roof (bigger prism)
#declare b3 = 100; // location of air roof (bigger prism)
#declare a4 = a1-c4; // location of air roof (smaller prism)
#declare b4 = b1/2; // location of air roof (smaller prism)
#declare a7 = (a1+a2)/2; // left point of first white chimney
#declare a8 = a7+30; // right point of first white chimney
#declare b7 = b1/2; // position of first white chimney
#declare b8 = b1/2+5; // position of first white chimney
#declare e5 = 20; // height of first white chimney
#declare a9 = a2+10; // left point of two big white chimneys
#declare a10 = a2+50; // right point of two big white chimneys
#declare b9 = 80; // location of second white chimney y begin
#declare b10 = 88; // location of second white chimney y end
#declare b11 = 150; // location of third white chimney y begin
#declare b12 = 158; // location of third white chimney y end
#declare e6 = 30; // height of second white chimney
#declare e7 = 30; // height of third white chimney
#declare s1 = st; // start of first stair
#declare s2 = 2*st; // start of second stair
#declare s3 = 3*st; // start of third stair
#declare s4 = 4*st; // start of fourth stair
#declare s5 = 5*st; // start of fifth stair
#declare s6 = 6*st; // start of sixth stair
#declare a13 = s6+5; // x-center of first telescope
#declare b13a = b-25; // y-center of first telescope
#declare b13b = b-40; // y-center of first telescope
#declare r13 = 15; // radius of first telescope
#declare r14 = 10; // radius of second telescope
#declare a14 = a1+70; // determines lenght of greenhouse
#declare b5 = 20; // width of big box with hyperbolidic coolers
#declare b15 = 30; // width of big box on end of building
#declare b14 = 10; // hanging over of big box at end of building
#declare b16 = (2*b-b15+b)/2; // location of fourth white chimney
#declare b17 = b16+8; // end of fourth white chimney
#declare b18 =2*b-b15;
#declare b19 =2*b+b14;
#declare b20 = b2-40; // start of greenhouse
#declare P1 = <0,0,0>; // Edge near memorial hall
#declare P2 = ; // Edge near cooling hyperboloids
#declare P3 = ; // Edge near highest point
#declare P4 = <0,0,b>; // Edge at lower stair
#declare P5 = ; // Inner court corner
#declare P6 = ; // Inner court corner
#declare P7 = ; // Inner court corner
#declare P8 = ; // Inner court corner
#declare P9 = ; // Library-Administration corner
#declare P10= < 0,0,b2>; // Stairs corner
#declare P11= ; // Large block corner
#declare P12= ; // Large block corner
#declare P13= ;
#declare P14= ;
#declare P15= ; // Corners on big box
#declare P16= ; // Corners of big box
#declare P35= ; // Corners of other big box
#declare P36= ;
#declare P37= ;
#declare P38= ;
#declare P17= ; // Corner of Column for big box
#declare P18= ; // dito
#declare P19= ; // dito
#declare P20= ; // dito
#declare P21= ; // Corner of first white chimney
#declare P22= ; // Corner of first white chimney
#declare P23= ; // Corner of first white chimney
#declare P24= ; // Corner of first white chimney
#declare P25= ; // Corner of second white chimney
#declare P26= ; // Corner of second white chimney
#declare P28= ; // Corner of second white chimney
#declare P27= ; // Corner of second white chimney
#declare P29= ; // Corner of third white chimney
#declare P30= ; // Corner of third white chimney
#declare P32= ; // Corner of third white chimney
#declare P31= ; // Corner of third white chimney
#declare P39= ; // Corner of fourth white chimney
#declare P40= ; // Corner of fourth white chimney
#declare P41= ; // Corner of fourth white chimney
#declare P42= ; // Corner of fourth white chimney
#declare P43= ; // One corner of greenhouse P43,P44,P45,P8
#declare P44= ; // Second corner of greenhouse P43,P44,P45,P8
#declare P45= ; // Third corner of greenhouse P43,P44,P45,P8
#declare P33 = ; // Corner at other end
#declare P34 = ; // Inner court corner
#declare S1 = ; // Corners of stairs
#declare S2 = ;
#declare S3 = ;
#declare S4 = ;
#declare S5 = ;
#declare S6 = ;
#declare T1 = ; // Corners of stairs
#declare T2 = ;
#declare T3 = ;
#declare T4 = ;
#declare T5 = ;
#declare T6 = ;
#declare Pr1 = ; // Bigger Prism
#declare Pr2 = ; // Bigger Prism
#declare Pr3 = ; // Bigger Prism
#declare Pr4 = ; // Bigger Prism
#declare Qr1 = ; // Smaller Prism
#declare Qr2 = ; // Smaller Prism
#declare Qr3 = ; // Smaller Prism
#declare Qr4 = ; // Smaller Prism
#declare DD1 = ; // First telescope Dome center
#declare DD2 = ; // Second telescope Dome center
// -------------------The Spider -----------------------------------------------------
#declare v0=0; // divisions of the interval 0,a2
#declare v1=7;
#declare v2=30;
#declare v3=70;
#declare v4=100;
#declare v5=120;
#declare v6=160;
#declare v7=170;
#declare v8=a2; // a2=190
#declare u0=b; // divisions of the interval [b=250,b19=510]
#declare u1=b+20;
#declare u2=b+50;
#declare u3=b+90;
#declare u4=b+130;
#declare u5=b+190;
#declare u6=b+210;
#declare u7=b+230; // 250+260
#declare h12=30; // height of the lecture hall building
#declare U0 = P12; // points on floor
#declare U1 = ; // Start describing wall
#declare U2 = ;
#declare U3 = ;
#declare U4 = ;
#declare U5 = ;
#declare U8 = ;
#declare U6 = U5+(U8-U5)/3;
#declare U7 = U5+2*(U8-U5)/3;
#declare U9 = ;
#declare U10 = ;
#declare U11 = ;
#declare U12 = ;
#declare UU0 = U0+<0,h12,0>; // points on roof
#declare UU1 = U1+<0,h12,0>;
#declare UU2 = U2+<0,h12,0>;
#declare UU3 = U3+<0,h12,0>;
#declare UU4 = U4+<0,h12,0>;
#declare UU5 = U5+<0,h12,0>;
#declare UU6 = U6+<0,h12,0>;
#declare UU7 = U7+<0,h12,0>;
#declare UU8 = U8+<0,h12,0>;
#declare UU9 = U9+<0,h12,0>;
#declare UU10 = U10+<0,h12,0>;
#declare UU11 = U11+<0,h12,0>;
#declare UU12 = U12+<0,h12,0>;
#declare Cc = U6; // center of the cube
#declare wc = 20; // radius of cube
#declare hc = 45; // height of the cube
#declare V1 = <-wc,0,-wc>;
#declare V2 = <+wc,0,-wc>;
#declare V3 = <+wc,0,wc>;
#declare V4 = <-wc,0,wc>;
#declare h13 = 18; // height of legs
#declare r_spider1 = 40; // inner radius for spider legs
#declare r_spider2 = 130; // outer radius for spider legs
#declare phi_spider1 = -100*2*pi/360; // angle for first leg
#declare phi_spider2 = 50*2*pi/360; // angle for 9'th leg
#declare leg_thickness=2; // thickness of the leg
// -----------------Textures -----------------------------------------------------
#declare stone_texture= texture {
pigment{ colour rgb <0.9,0.9,0.9> }
// normal{ granite 0.6 scale 0.24 }
finish{ phong 0.8 phong_size 200 }
}
#declare white_stone_texture= texture {
pigment{ colour rgb <0.95,0.95,0.95> }
// normal{ granite 0.6 scale 0.24 }
finish{ phong 0.8 phong_size 200 }
}
#declare roof_texture= texture {
pigment{ colour rgb <0.5,0.2,0.2> }
finish{ phong 0.8 phong_size 200 }
}
#declare iron_texture= texture {
pigment{ colour rgb <0.9,0.2,0.2> }
finish{ phong 0.9 phong_size 200 }
}
// ----------------- Geometric Objects ---------------------------------------------
#macro Make_Cube(A1,A2,A3,A4,h)
#declare B1=A1+<0,h,0>;
#declare B2=A2+<0,h,0>;
#declare B3=A3+<0,h,0>;
#declare B4=A4+<0,h,0>;
union{
union {
polygon { 5, A1,B1,B2,A2,A1 texture { stone_texture } }
polygon { 5, A2,B2,B3,A3,A2 texture { stone_texture } }
polygon { 5, A3,B3,B4,A4,A3 texture { stone_texture } }
polygon { 5, A4,B4,B1,A1,A4 texture { stone_texture } }
}
polygon { 5, B1,B2,B3,B4,B1 texture { roof_texture } }
}
#end
#macro Make_Cube1(A1,A2,A3,A4,h1,h2) // all roof texture
#declare B1=A1+<0,h2,0>;
#declare B2=A2+<0,h2,0>;
#declare B3=A3+<0,h2,0>;
#declare B4=A4+<0,h2,0>;
#declare A1=A1+<0,h1,0>;
#declare A2=A2+<0,h1,0>;
#declare A3=A3+<0,h1,0>;
#declare A4=A4+<0,h1,0>;
union{
union {
polygon { 5, A1,B1,B2,A2,A1 texture { roof_texture } }
polygon { 5, A2,B2,B3,A3,A2 texture { roof_texture } }
polygon { 5, A3,B3,B4,A4,A3 texture { roof_texture } }
polygon { 5, A4,B4,B1,A1,A4 texture { roof_texture } }
}
polygon { 5, B1,B2,B3,B4,B1 texture { roof_texture } }
}
#end
#macro Make_Cube2(A1,A2,A3,A4,h) // all concrete
#declare B1=A1+<0,h,0>;
#declare B2=A2+<0,h,0>;
#declare B3=A3+<0,h,0>;
#declare B4=A4+<0,h,0>;
union{
union {
polygon { 5, A1,B1,B2,A2,A1 texture { stone_texture } }
polygon { 5, A2,B2,B3,A3,A2 texture { stone_texture } }
polygon { 5, A3,B3,B4,A4,A3 texture { stone_texture } }
polygon { 5, A4,B4,B1,A1,A4 texture { stone_texture } }
}
polygon { 5, B1,B2,B3,B4,B1 texture { stone_texture } }
}
#end
#macro Make_Prism(A1,A2,A3,A4,h) // A1, A4 are high, Prism on roof
#declare B1=A1+<0,h,0>;
#declare B2=A2+<0,1,0>;
#declare B3=A3+<0,1,0>;
#declare B4=A4+<0,h,0>;
union{
union {
polygon { 5, A1,B1,B2,A2,A1 texture { stone_texture } }
polygon { 5, A2,B2,B3,A3,A2 texture { stone_texture } }
polygon { 5, A3,B3,B4,A4,A3 texture { stone_texture } }
polygon { 5, A4,B4,B1,A1,A4 texture { stone_texture } }
}
polygon { 5, B1,B2,B3,B4,B1 texture { stone_texture } }
translate <0,h1,0>
}
#end
#macro Make_Chimney(A1,A2,A3,A4,h) // for the white chimneys on the roof
#declare B1=A1+<0,h,0>;
#declare B2=A2+<0,h,0>;
#declare B3=A3+<0,h,0>;
#declare B4=A4+<0,h,0>;
#declare r=(A1-A4).z;
union{
box {A1,B3 texture { white_stone_texture }}
cylinder {(A1+A4)/2,(B1+B4)/2,r/2 texture{ white_stone_texture} }
cylinder {(A2+A3)/2,(B2+B3)/2,r/2 texture{ white_stone_texture} }
}
#end
#macro Make_Dome(XX,r1) // Dome of telecope
difference {
sphere {XX,r1 }
box { XX+<-2*r1,-2*r1,-2*r1>, XX+<2*r1,0,2*r1> }
texture{ white_stone_texture}
}
#end
#macro Spider_Leg(P1,P2,h)
union {
cylinder { P1,(P1+P2)/2+<0,h,0>,leg_thickness }
sphere { (P1+P2)/2+<0,h,0>, leg_thickness }
cylinder { (P1+P2)/2+<0,h,0>, P2,leg_thickness}
texture{ iron_texture }
}
#end
#macro Spider_Legs(rr1,rr2,hh,number_legs,phi1,phi2)
union {
#declare leg_count=0;
#while (leg_count
hh)
#declare leg_count=leg_count+1;
#end
translate Cc
translate <0,h12,0>
}
#end
#declare Lecture_Hall = union {
polygon { 5, U1,U2,UU2,UU1,U1 texture { stone_texture } }
polygon { 5, U2,U3,UU3,UU2,U2 texture { stone_texture } }
polygon { 5, U3,U4,UU4,UU3,U3 texture { stone_texture } }
polygon { 5, U4,U5,UU5,UU4,U4 texture { stone_texture } }
polygon { 5, U5,U6,UU6,UU5,U5 texture { stone_texture } }
polygon { 5, U6,U7,UU7,UU6,U6 texture { stone_texture } }
polygon { 5, U7,U8,UU8,UU7,U7 texture { stone_texture } }
polygon { 5, U8,U9,UU9,UU8,U8 texture { stone_texture } }
polygon { 5, U9,U10,UU10,UU9,U9 texture { stone_texture } }
polygon { 5, U10,U11,UU11,UU10,U10 texture { stone_texture } }
polygon { 5, U11,U12,UU12,UU11,U11 texture { stone_texture } }
polygon {14, U1,U0,U12,U11,U10,U9,U8,U7,
U6,U5,U4,U3,U2,U1 texture {stone_texture} }
polygon {14, UU1,UU0,UU12,UU11,UU10,UU9,UU8,UU7,
UU6,UU5,UU4,UU3,UU2,UU1 texture {stone_texture} }
}
#declare Spider_Head = object {
Make_Cube2(V1,V2,V3,V4,hc)
rotate y*45
translate Cc
}
#declare Green_House =
#declare science_building = union {
Make_Cube(P1,P9,P8,P10,h1) // Main library
Make_Cube(P9,P11,P6,P5,h2) // Administration
Make_Cube(P4,P10,P7,P12,h3) // First block of stairs
Make_Cube(P13,P14,P3,P12,h4) // Main block in the back
Make_Cube(P34,P12,P3,P33,h4) // Large appendix
Make_Cube(T1,P7,P12,S1,h5) // Second block of stairs
Make_Cube(T2,P7,P12,S2,h6) // Third block of stairs
Make_Cube(T3,P7,P12,S3,h7) // Forth block of stairs
Make_Cube(T4,P7,P12,S4,h8) // Fifth block of stairs
Make_Cube(T5,P7,P12,S5,h9) // Sixth block of stairs
Make_Cube1(P11,P2,P16,P15,h4,h4+h10) // big cube with hyperbolic coolers
Make_Cube1(P17,P18,P19,P20,0,h4) // column for big cube
Make_Cube1(P35,P36,P38,P37,h4,h4+h11) // big cube on end
Make_Prism(Pr1,Pr2,Pr3,Pr4,e3) // Bigger Prism
Make_Prism(Qr1,Qr2,Qr3,Qr4,e4) // Smaller Prism
Make_Chimney(P21,P22,P23,P24,e5) // First white chimney
Make_Chimney(P25,P26,P28,P27,e6) // Second white chimney
Make_Chimney(P29,P30,P32,P31,e7) // Third white chimney
Make_Chimney(P39,P40,P42,P41,e7) // Fourth white chimney
Make_Dome(DD1,r13) // First Telescope dome
Make_Dome(DD2,r14) // Second Telescope dome
green_house(P43,P44,P44+<0,19,0>,P43+<0,19,0>,
P8,P45,P45+<0,40,0>,P8+<0,40,0>,
20,2,5,0.2)
object{ Lecture_Hall}
object{ Spider_Head}
Spider_Legs(r_spider1,r_spider2,h13,9,phi_spider1,phi_spider2)
}