Facade, Any Geometry

Page 1

FACADE,

ANY GEOMETRY



FACADE, ANY GEOMETRY “Contrast between the insdie and the outside can be a major manifestation of contradiction in architecture.” Robert Venturi

ETH Zürich Department of Architecture Institute for Technology in Architecture Chair for Computer Aided Architectural Design Prof. Ludger Hovestadt, Vera Bühlman Coordinator: Michael Hansmeyer Assistant: Li Li MAS Thesis Yunying Chiu



CONTENTS Introduction

6

Related Work

8

Subdivision Rules of Regular Polygons

10

Node Diagram of the Code

12

Any Geometry Subdivision Categories

15

Prototypes of Facade Representation

103

The Code of Any Geometry Subdivision

139

Reference

150

5


Introduction In recent years, the facades of a building have become increasingly significant due to unconventional choices of materials and the use of innovative technology. More and more the external surfaces are being perceived and designed as an integral part of the building. This skin, a protective mantle, defines not only the interior but also the adjoining exterior space (Schittich, 2002). Being the communicative interface between the building and the public, facade played a important role in architecture. From the smooth plasticity of early digital topologies to the varied articulations and modalities of the contemporary surface, the inevitable maturation of the digital project has helped to construct a more profoundly articulated surface(Ben, 2010). Further, since we can take advantage of the computational power, why do we stick to classical architecture geometries? Why not forget about grids, repetition and symmetry? The plan is no longer the generator, and the section may not tell us much. Algorithmically generated complexities become alternatives to simple ideas that can be held in a designer’s mind; the idea of a procedurally expanded genome replaces that of a traditional parti (Mitchell, 1998). The use of the computer as an exploratory formal tool and the increasing dependency of their work on computational methods, the most paradigmatic examples of the last ten years invest in computationally generated partis and diagrams. Through computation, architecture transcends itself beyond the common and predictable(Kostas, 2006). Consequently, from the assistance of algorithm and computation, designers are capable to create the things more than conventional facade. Le Corbusier introduced a vocabulary of ba6


Figure 1 Le Corbusier introduced a vocabulary of basic volumetric elements in his well-known sketch

Figure 2 Art Forms of Nature (Ernst, 1899).

sic volumetric elements in his well-known sketch (Figure 1), showing how architectural compositions can be assembled from simple volumetric solids(Le Corbusier, 1923), which are cylinder, tetrahedron, cube, sphere. Similarly, we can extract the notion of natural structure geometry from “Art Forms of Nature(Ernst, 1899)�, which includes the illustrations of the various organisms (Figure 2). A tendency toward manipulating the architectural forms and articulations from the nature and the geometry could be observed. Then, the personal style of an architect may become sensitive to new sorts of situations, learn to make use of new types of elements, discover new uses for known elements(Mitchell,1990). This research design presents a generative algorithmic approach to achieve the new representation from classic architecture facade, such as Crown Hall of Mies van Der Rohe. Using the method of boundary representation to decompose the shape of classic architecture into points, curves and surfaces. After the abstraction of architecture, it will leave the geometric framework of facade for further redecoration. The redecorated faces will relate to the interpretation of diverse geometric patterns between abstraction and representation to express a new manifesto, an innovation that has the possibility of transforming classic architecture in the way that represent the composition of geometry subdivision, which includes the shape of symmetry and the skin of any geometry.

7


Related work The early scheme of subdivision is Catmull-Clark subdivision surface (Figure 3), which uses computer graphics to create smooth surfaces by subdivision surface modeling. Catmull-Clark surfaces are defined recursively. The repeated subdivision results in smoother meshes. It can be shown that the limit surface obtained by the refinement process, which based one the aesthetic appearance of the resulting surfaces rather than on a mathematical derivation ( Catmull and Clark, 1978). Another subdivision scheme is Doo-Sabin Subdivision surface (Figure 4), which is a type of subdivision surface based on a generalization of biquadratic uniform B-splines. Doo-Sabin surfaces are defined recursively as well. During the division step, each face of quadratic form is replaced by a new face, which is connected across the old edges and across the old vertices by other new faces. In such methods, the vertices of each new face are functions only of the vertices of the corresponding old face. Each refinement iteration replaces the current mesh with a smoother, more refined mesh, following the procedure Daniel Doo and Malcolm Sabin described (Doo and Sabin, 1978). The close project is Subdivided Columns (Figure 5) by Michael Hansmeyer. In this case, it presents modifications to the Catmull Clark and Doo Sabin processes’ weighting schemes, proposes how these modified processes can be applied specifically to the generation of ornament, and demonstrates methods for specifying weights using parameters both intrinsic and extrinsic to the mesh, which was leaded to gradual, traceable changes in output by small changes in weighting values(Hansmeyer, 2010). 8

Figure 3 Catmull-Clark subdivision surface

Figure 4 Doo-Sabin surface

Figure 5 Subdivided Columns


My approach builds on the basic subdivision theory from Michael Hansmeyer. Through adding the mathematical derivation to interplay the geometries, starting from 2D quadrilateral as initial framework, expanding it into 3-dimensional geometric shape, dividing the polygon into any geometric pattern based on the number of side and the subdivision methods here I described, it produced the sophisticated mesh consisted of diverse geometries and tiled them to reshape the facade of building. The geometry subdivision proposes the notion which is any geometry could be interplayed and weaved together through recursive subdividing procedure according to the types of geometry existed in any generation, and the composition of subdivision results with translations, rotations and reflections as symmetry operations to represent the facade of architecture.

9


Subdivion Rules of Regular Polygons T1

Q1

g =0

g =1

g =2

g =0

T2

Q2

T3

Q3

T4

Q4

T5

Q5

T6

Q6

T7

Q7

T8

Q8

T9

Q9

Q10

Q11

Q12

10

g =1

g =2


P1

O1

g =0

g =1

g =2

g =0

P2

O2

P3

O3

P4

O4

P5

O5

P6

O6

H1

O7

H2

O8

H3

O9

H4

O10

g =1

H5

H6

11


Node Diagram of the Code The following are the detailed definitions of nodes in each polygon. It demonstrates how to interplay the subdivision rules of regular polygons by using subdivision 43 as example.

T9 A

aa ab1

ca2

ab2

ca1 C

B

cc

g =0

cen bc2

g =1

bc1

bb g =2

As we can see above, the nodes of triangle are defineded as A, B and C in generation 0, and then in the generation 1, node A will be redifined as node aa, node B will be node bb, node C will be node cc . Besides it, we added node ab1, ab2, bc1, bc2, ca1 and ca2 at the sides of triangle to subdivide the shape into 6 pieces. In the generation 2, going one step further, if the shpae is still remained as triangle, then it will be subdivided from 1 to 6 pieces as generation1. Others will be subdivide the rule which they belong to.

Q12

A

B

D

C g =0

aa

ab1

ab2

bb

da2

bc1

da1

bc2

dd

ca2

ca1

cc

g =1

Following the previous subdividing notion of T9, quadrilateral as the beginning shape of geometry subdivision, it divided one quadrilateral into 4 pieces of triangles and one octagon in generation1. Then, in generation 2, triangles which quadrilateral produced will be coped with the rule of T9 and octagon will be dealt with the rule of O10.

12


P2 A

aa

E

B

ee

dd

C

D

bb

cen

cc

g =0

g =1

In generation 1, pentagon is decomposed into 5 quadrilaterals which will be further subdivided by the rule of Q12 in generation 2. Then, the subdividing method of O10 will involve to continue the subdivision. As a result, we get the pentagon again and the geometry subdividing loop continues.

O10 A

B

aa ha

H

C

D

E g =0

cc

cen

gg

c1 dd

e1

fg F

bc

a1

hh g1

G

bb

ff

de ee

g =1

Here we got the octagon which quadrilateral produced and proceeded it for subdivision. Consequently, after adding 4 nodes at the sides of octagon and 4 nodes inside the octagon, octagon will be subdivide into 4 quadrilaterals and 4 pentagons. Then, methods of Q12 and P2 will involve again to make the loop of subdivision.

13



Any Geometry Subdivision Categories The categories are the result of the transformations from geometry subdivision, which is based on several intergrations of distinct recursive subdividng processes of regular polygons which are triangle, quadrilateral, pentagon, hexagon and oxagon. The process starts with the initial shape of geometry. Other schemes of subdividing geometries are further applied on the polygons which the second generation produced. Every geometry will refer to the repeated definition of subdivision according to the number of sides which each generation created. After proceeding a number of generations, the complexity of polygon was increased and the polygon was generated from one to many. Until now, the maximum generation we operated is subdivision 42 in generation 9, which has 47104 points, 32768 curves and 11776 faces from the geometry.

15


16

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 1 This subdivision is developed by the intergration of T1 and Q1.

T1

Q1

17


18

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 2 This subdivision is developed by the intergration of T2 and Q1.

T2

Q1

19


20

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 3 This subdivision is developed by Q2.

Q2

21


22

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 4 This subdivision is developed by the intergration of T2 and Q1.

T2

Q1

23


24

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 5 This subdivision is developed by the intergration of T2 and Q4.

T2

Q4

25


26

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 6 This subdivision is developed by T2.

T2

27


28

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 7 This subdivision is developed by the intergration of T3 and Q5.

T3

Q5

29


30

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 8 This subdivision is developed by the intergration of T4 and Q5.

T4

Q5

31


32

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 9 This subdivision is developed by the intergration of T5 and Q5.

T5

Q5

33


34

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 10 This subdivision is developed by the intergration of T5 and Q3.

T5

Q3

35


36

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 11 This subdivision is developed by the intergration of T5 and Q3.

T5

Q3

37


38

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 12 This subdivision is developed by the intergration of T2 and Q6.

T2

Q6

39


40

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 13 This subdivision is developed by the intergration of T6 and Q6.

T6

Q6

41


42

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 14 This subdivision is developed by the intergration of T3 and Q6.

T3

Q6

43


generation 1

generation 4

generation 2

generation 5

generation 3

44


Subdivision 15 This subdivision is developed by the intergration of Q7 and P1.

Q7

P1

45


generation 1

generation 4

generation 2

generation 5

generation 3

46


Subdivision 16 This subdivision is developed by the intergration of Q7 and P2.

Q7

P2

47


generation 1

generation 4

generation 2

generation 5

generation 3

48


Subdivision 17 This subdivision is developed by the intergration of Q8, P2 and H1.

Q8

P2

H1

49


generation 1

generation 4

generation 2

generation 5

generation 3

50


Subdivision 18 This subdivision is developed by the intergration of Q8, P3 and H1.

Q8

P3

H1

51


52

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 19 This subdivision is developed by the intergration of Q8, P3 and H2.

Q8

P3

H2

53


generation 1

generation 4

generation 2

generation 5

generation 3

54


Subdivision 20 This subdivision is developed by Q9.

Q9

55


generation 1

generation 4

generation 2

generation 5

generation 3

56


Subdivision 21 This subdivision is developed by Q9.

Q9

57


generation 1

generation 4

generation 2

generation 5

generation 3

58


Subdivision 22 This subdivision is developed by Q9.

Q9

59


generation 1

generation 4

generation 2

generation 5

generation 3

60


Subdivision 23 This subdivision is developed by the intergration of Q7 and P4.

Q7

P4

61


generation 1

generation 4

generation 2

generation 5

generation 3

62


Subdivision 24 This subdivision is developed by Q10. From subdivision 24 to 26, they are all based on the rule of Q10 and perform the individual pattern according to the different position of dividing points. Q10

63


generation 1

generation 4

generation 2

generation 5

generation 3

64


Subdivision 25 This subdivision is developed by Q10.

Q10

65


generation 1

generation 4

generation 2

generation 5

generation 3

66


Subdivision 26 This subdivision is developed by Q10.

Q10

67


generation 1

generation 4

generation 2

generation 5

generation 3

68


Subdivision 27 This subdivision is developed by the intergration of Q11, P4 and O1.

Q11

P4

O1

69


70

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 28 This subdivision is developed by the intergration of Q11, P5 and O1.

Q11

P5

O1

71


72

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 29 This subdivision is developed by the intergration of Q11, P2 and O2.

Q11

P2

O2

73


74

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 30 This subdivision is developed by the intergration of Q11, P3 and O2.

Q11

P3

O2

75


76

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 31 This subdivision is developed by the intergration of T2, Q11, P6 and O3.

T2

Q11

P6

O3

77


78

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 32 This subdivision is developed by the intergration of T2, Q12 and O3.

T2

Q12

O3

79


80

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 33 This subdivision is developed by the intergration of T3, Q12, P3 and O2.

T3

Q12

P3

O2

81


82

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 34 This subdivision is developed by the intergration of T7, Q12 and O4.

T7

Q12

O4

83


84

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 35 This subdivision is developed by the intergration of T8, Q12 and O5.

T8

Q12

O5

85


86

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 36 This subdivision is developed by the intergration of T6, Q12 and O6.

T6

Q12

O6

87


88

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 37 This subdivision is developed by the intergration of T6, Q12 and O7.

T6

Q12

O7

89


90

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 38 This subdivision is developed by the intergration of T8, Q12 and O8.

T8

Q12

O8

91


92

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 39 This subdivision is developed by the intergration of T6, Q12 and O9.

T6

Q12

O9

93


94

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 40 This subdivision is developed by the intergration of T9, Q12 and O9.

T9

Q12

O9

95


96

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 41 This subdivision is developed by the intergration of T7, Q12 and O1.

T7

Q12

O1

97


98

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 42 This subdivision is developed by the intergration of T1, Q12, P2 and O10.

T1

Q12

P2

O10

99


100

generation 1

generation 4

generation 2

generation 5

generation 3

generation 6


Subdivision 43 This subdivision is developed by the intergration of T9, Q12, P2 and O10.

T9

Q12

P2

O10

101



Prototypes of Facade Representation Based on the significant architecture of 20th centry Modernist movement, Crown Hall, this paper redesigns the facade by geometry subdivision. Through simplifying the facade, 4 sides of quadrilaterals will be the beginning shape of geometry subdivision, which we define it as generation 0. After the manipulation of the code, we pass the geometry through generation 0 to 6, then pick and choose the result in different generations, tiling them in a gradual transition. Here we present 5 sets of prototypes as the representations of Crown Hall.

103


Original Framework Abstracting the basic shape from Crown Hall, it left four sides of quadriaterals from the facade, as the initial framework to proceed the subdivision.


S. R. Crown Hall, IIT, Chicago USA, 1950 - 56 Designed by Mies Van der Rohe

105


Original Framework One panel as one unit, which could be replaced anytime.


107


Prototype 1 This combination consists of subdivision 6 in generation 4 and subdivision 8 in generation 5.

108


109


Prototype 1 night view


111


Prototype 1 night view


113


Prototype 2

This combination consists of subdivision 10 in generation 4, 5 and 6.

114


115


Prototype 2 night view


117


Prototype 2 night view


119


Prototype 3 This combination consists of subdivision 36 in generation 3, 4, 5 and 6.

120


121


Prototype 3 night view


123


Prototype 3 night view


125


Prototype 4 This combination consists of subdivision 22 in generation 2, subdivision 30 in generation 5, subdivision 35 in generation 5, subdivision 36 in generation 5 and subdivision 41 in generation 6.

126


127


Prototype 4 night view


129


Prototype 4 night view


131


Prototype 5 This combination consists of subdivision 12 in generation 4, subdivision 14 in generation 4, subdivision 33 in generation 5, subdivision 42 in generation 5 and subdivision 43 in generation 4.

132


133


Prototype 5 night view


135


Prototype 5 night view


137



The Code of Any Geometry Subdivision Here we present one of the codes of geometry subdivision, Subdivision 43, which manipulated recursive subdividing methods of triangle, quadriateral, pentagon and octagon. On the basis of the main code of class Subdivision 43, we called the classes of Node and Face to be involved for definding the nodes and faces of polygons.

139


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 140

Class of Subdivision 43

package subdivision43; import java.util.*; import processing.dxf.*; import processing.core.PApplet; public class subdivision43 extends PApplet { boolean exportDXF = false; boolean record; boolean updateForm = true; ArrayList<Node> allNodes; ArrayList<Face> allFaces; Face faceinstance; Node nodeinstance; float minArea, minPerimeter, minJaggedness; float maxArea, maxPerimeter, maxJaggedness; int level = 0; float w1 = 0.66f; float w2 = 0.33f; float w3 = 0.5f; boolean mouseDragging; boolean mouseRelease; float mxi, myi; float rx, rxt, ry, ryt, rya, sc = 500f, sct, mxt, myt, tx, txt, ty, tyt; float fovt, fovi; void initialize() { allNodes = null; allFaces = null; allNodes = new ArrayList<Node>(); allFaces = new ArrayList<Face>(); Node n1 = new Node(-.5f, -.5f, 0, 0, this); Node n2 = new Node(.5f, -.5f, 0, 0, this); Node n3 = new Node(.5f, .5f, 0, 0, this); Node n4 = new Node(-.5f, .5f, 0, 0, this); Face f = new Face(n1, n2, n3, n4, 0, this); } public void setup() { size(900, 900, P3D); background(255); } public void draw() { lights(); background(255); translate(width / 2f, height / 2f); translate(tx + txt, -(ty + tyt), 0); scale(sc + sct, sc + sct, sc + sct); rotateX(-(rx + rxt) * PI / 180f); rotateY(-(ry + ryt) * PI / 180f); updateForm = true; if (updateForm == true) { initialize(); for (int c = 0; c < level; c++) { subdivide(c); } }

// rotate the coordinate system

// load the form // subdivide the form


63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124

if (record) {beginRaw(DXF, “T10_Oct7tri2_##.dxf”);} drawSelectedFaces(level); if (record) { endRaw(); record = false; println(“finished recording”); } } public void keyPressed() { if (key == ‘0’) {level = 0;} if (key == ‘1’) {level = 1;} if (key == ‘2’) {level = 2;} if (key == ‘3’) {level = 3;} if (key == ‘4’) {level = 4;} if (key == ‘5’) {level = 5;} if (key == ‘6’) {level = 6;} if (key == ‘7’) {level = 7;} if (key == ‘8’) {level = 8;} if (key == ‘9’) {level = 9;} updateForm = true; if (key == ‘s’ || key == ‘S’) {record = true;} }

// start to record the result

// stop to record the result

// Press s to save the file

public void mousePressed() { mxi = mouseX; myi = mouseY; redraw(); } public void mouseDragged() { mouseDragging = true; mouseRelease = false; endraw(); if (mouseButton == RIGHT) { if (!keyPressed) { sct = (mouseX - mxi + myi - mouseY) * 2; sct = max(50 - sc, sct); } } if (mouseButton == CENTER) { txt = (mouseX - mxi); tyt = (mouseY - myi); } if (mouseButton == LEFT) { ryt = -(mouseX - mxi); rxt = -(mouseY - myi); } } public void mouseReleased() { mouseDragging = false; mouseRelease = true; redraw(); rx = rx + rxt; rxt = 0; ry = ry + ryt; ryt = 0; tx = tx + txt; txt = 0; ty = ty + tyt; 141


125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 142

tyt = 0; sc = sc + sct; sct = 0; sc = max(50, sc); } void drawAllFaces() { for (int c = 0; c < allFaces.size(); c++) { Face f = (Face) allFaces.get(c); f.display(); } } void drawAllNodes() { for (int c = 0; c < allNodes.size(); c++) { Node n = (Node) allNodes.get(c); n.display(); } } void drawSelectedFaces(int g) { for (int c = 0; c < allFaces.size(); c++) { Face f = (Face) allFaces.get(c); if (f.g == g) { f.display(); } } }

// drawing faces

void subdivide(int g) { randomSeed(1); int numberOfOldFaces = allFaces.size(); for (int h = 0; h < numberOfOldFaces; h++) { // go through the list of all faces Face f = (Face) allFaces.get(h); // load faces from the arraylist if (f.g == g) { if (f.myNodes.size() == 4) { // the subdividing rule of Quadriateral Node nA = (Node) f.myNodes.get(0); Node nB = (Node) f.myNodes.get(1); Node nC = (Node) f.myNodes.get(2); Node nD = (Node) f.myNodes.get(3); Node aa = new Node(nA.x, nA.y, nA.z, nA.g + 1, this); Node bb = new Node(nB.x, nB.y, nB.z, nB.g + 1, this); Node cc = new Node(nC.x, nC.y, nC.z, nC.g + 1, this); Node dd = new Node(nD.x, nD.y, nD.z, nD.g + 1, this); Node ab1 = new Node(w1 * nA.x + (1 - w1) * nB.x, w1 * nA.y+ (1 - w1) * nB.y, w1 * nA.z + (1 - w1) *nB.z+shift,g + 1, this); // point between A and B Node ab2 = new Node(w2 * nA.x + (1 - w2) * nB.x, w2 * nA.y+ (1 - w2) * nB.y, w2 * nA.z + (1 - w2) *nB.z+shift,g + 1, this); // point between A and B Node bc1 = new Node(w1 * nB.x + (1 - w1) * nC.x, w1 * nB.y+ (1 - w1) * nC.y, w1 * nB.z + (1 - w1) *nC.z+shift,g + 1, this); // point between B and C Node bc2 = new Node(w2 * nB.x + (1 - w2) * nC.x, w2 * nB.y+ (1 - w2) * nC.y, w2 * nB.z + (1 - w2) *nC.z+shift,g + 1, this); // point between B and C Node cd1 = new Node(w1 * nC.x + (1 - w1) * nD.x, w1 * nC.y+ (1 - w1) * nD.y, w1 * nC.z + (1 - w1) *nD.z+shift,g + 1, this); // point between C and D Node cd2 = new Node(w2 * nC.x + (1 - w2) * nD.x, w2 * nC.y+ (1 - w2) * nD.y, w2 * nC.z + (1 - w2) * nD.z+shift,g + 1, this); // point between C and D Node da1 = new Node(w1 * nD.x + (1 - w1) * nA.x, w1 * nD.y+ (1 - w1) * nA.y, w1 * nD.z + (1 - w1) * nA.z+shift,g + 1, this); // point between D and A Node da2 = new Node(w2 * nD.x + (1 - w2) * nA.x, w2 * nD.y+ (1 - w2) * nA.y, w2 * nD.z + (1 - w2) * nA.z+shift,g + 1, this); // point between D and A


187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248

Face fNew1 = new Face(aa, ab1,da2, g + 1, this); Face fNew2 = new Face(bb, bc1,ab2, g + 1, this); Face fNew3 = new Face(cc, cd1,bc2, g + 1, this); Face fNew4 = new Face(dd, da1,cd2, g + 1, this); Face fNew5 = new Face(ab1,ab2,bc1,bc2,cd1,cd2,da1,da2, g + 1, this); } else if (f.myNodes.size() == 3) { Node nA = (Node) f.myNodes.get(0); Node nB = (Node) f.myNodes.get(1); Node nC = (Node) f.myNodes.get(2);

// the subdividing rule of Triangle

float w1 = .66f; float w2 = .33f; float shift = dist(nA.x, nA.y, 0, 0) / 10.0f; Node aa = new Node(nA.x, nA.y, nA.z, nA.g + 1, this); Node bb = new Node(nB.x, nB.y, nB.z, nB.g + 1, this); Node cc = new Node(nC.x, nC.y, nC.z, nC.g + 1, this); Node ab1 = new Node(w1 * nA.x + (1 - w1) * nB.x, w1 * nA.y+ (1 - w1) * nB.y, w1 * nA.z + (1 - w1) * nB.z+shift,g + 1, this); // point between A and B Node ab2 = new Node(w2 * nA.x + (1 - w2) * nB.x, w2 * nA.y+ (1 - w2) * nB.y, w2 * nA.z + (1 - w2) * nB.z+shift, g + 1, this); // point between A and B Node bc1 = new Node(w1 * nB.x + (1 - w1) * nC.x, w1 * nB.y+ (1 - w1) * nC.y, w1 * nB.z + (1 - w1) * nC.z+shift,g + 1, this); // point between B and C Node bc2 = new Node(w2 * nB.x + (1 - w2) * nC.x, w2 * nB.y+ (1 - w2) * nC.y, w2 * nB.z + (1 - w2) * nC.z+shift, g + 1, this); // point between B and C Node ca1 = new Node(w1 * nC.x + (1 - w1) * nA.x, w1 * nC.y+ (1 - w1) * nA.y, w1 * nC.z + (1 - w1) * nA.z+shift, g + 1, this); // point between C and A Node ca2 = new Node(w2 * nC.x + (1 - w2) * nA.x, w2 * nC.y+ (1 - w2) * nA.y, w2 * nC.z + (1 - w2) * nA.z+shift, g + 1, this); // point between C and A Node cen = new Node((nA.x + nB.x + nC.x) / 3,(nA.y + nB.y + nC.y) / 3, (nA.z + nB.z + nC.z) / 3+ shift, g + 2, this); // center of Triangle Face fNew1 = new Face(aa, ab1, cen, ca2, g + 1, this); Face fNew2 = new Face(bb, bc1, cen, ab2, g + 1, this); Face fNew3 = new Face(cc, ca1, cen, bc2, g + 1, this); Face fNew4 = new Face(ab1, ab2, cen, g + 1, this); Face fNew5 = new Face(bc1, bc2, cen, g + 1, this); Face fNew6 = new Face(ca1, ca2, cen, g + 1, this); } else if (f.myNodes.size() == 5) { // the subdividing rule of Pentagon Node nA = (Node) f.myNodes.get(0); Node nB = (Node) f.myNodes.get(1); Node nC = (Node) f.myNodes.get(2); Node nD = (Node) f.myNodes.get(3); Node nE = (Node) f.myNodes.get(4); float w1 = .5f; float w2 = .75; float shift = dist(nA.x,nA.y,0,0)/10.0f; Node aa = new Node (nA.x,nA.y,nA.z,nA.g+1,this); Node bb = new Node (nB.x,nB.y,nB.z,nB.g+1,this); Node cc = new Node (nC.x,nC.y,nC.z,nC.g+1,this); Node dd = new Node (nD.x,nD.y,nD.z,nD.g+1,this); Node ee = new Node (nE.x,nE.y,nE.z,nE.g+1,this); Node cen = new Node ((nA.x+nB.x+nC.x+nD.x+nE.x)/5,(nA.y+nB.y+nC.y+nD.y+nE.y)/5,(nA.z+nB. z+nC.z+nD.z+nE.z)/5+ shift,g+1,this); //center of Pentagon Face fNew1 = new Face (aa,bb,cen,g+1,this); Face fNew2 = new Face (bb,cc,cen,g+1,this); Face fNew3 = new Face (cc,dd,cen,g+1,this); 143


249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 144

Face fNew4 = new Face (dd,ee,cen,g+1,this); Face fNew5 = new Face (ee,aa,cen,g+1,this); } else if (f.myNodes.size() == 8) { // the subdividing rule of Octagon Node nA = (Node) f.myNodes.get(0); Node nB = (Node) f.myNodes.get(1); Node nC = (Node) f.myNodes.get(2); Node nD = (Node) f.myNodes.get(3); Node nE = (Node) f.myNodes.get(4); Node nF = (Node) f.myNodes.get(5); Node nG = (Node) f.myNodes.get(6); Node nH = (Node) f.myNodes.get(7); float w1 = .5f; float shift = dist(nA.x, nA.y, 0, 0) / 10.0f; Node aa = new Node(nA.x, nA.y, nA.z, nA.g + 1, this); Node bb = new Node(nB.x, nB.y, nB.z, nB.g + 1, this); Node cc = new Node(nC.x, nC.y, nC.z, nC.g + 1, this); Node dd = new Node(nD.x, nD.y, nD.z, nD.g + 1, this); Node ee = new Node(nE.x, nE.y, nE.z, nE.g + 1, this); Node ff = new Node(nF.x, nF.y, nF.z, nF.g + 1, this); Node gg = new Node(nG.x, nG.y, nG.z, nG.g + 1, this); Node hh = new Node(nH.x, nH.y, nH.z, nH.g + 1, this); Node ab = new Node(w1 * nA.x + (1 - w1) * nB.x, w1 * nA.y+ (1 - w1) * nB.y, w1 * nA.z + (1 - w1) * nB.z+shift,g + 1, this); // point between A and B Node bc = new Node(w1 * nB.x + (1 - w1) * nC.x, w1 * nB.y+ (1 - w1) * nC.y, w1 * nB.z + (1 - w1) * nC.z+shift,g + 1, this); // point between B and C Node cd = new Node(w1 * nC.x + (1 - w1) * nD.x, w1 * nC.y+ (1 - w1) * nD.y, w1 * nC.z + (1 - w1) * nD.z+shift,g + 1, this); // point between C and D Node de = new Node(w1 * nD.x + (1 - w1) * nE.x, w1 * nD.y+ (1 - w1) * nE.y, w1 * nD.z + (1 - w1) * nE.z+shift,g + 1, this); // point between D and E Node ef = new Node(w1 * nE.x + (1 - w1) * nF.x, w1 * nE.y+ (1 - w1) * nF.y, w1 * nE.z + (1 - w1) * nF.z+shift,g + 1, this); // point between E and F Node fg = new Node(w1 * nF.x + (1 - w1) * nG.x, w1 * nF.y+ (1 - w1) * nG.y, w1 * nF.z + (1 - w1) * nG.z+shift,g + 1, this); // point between F and G Node gh = new Node(w1 * nG.x + (1 - w1) * nH.x, w1 * nG.y+ (1 - w1) * nH.y, w1 * nG.z + (1 - w1) * nH.z+shift,g + 1, this); // point between G and H Node ha = new Node(w1 * nH.x + (1 - w1) * nA.x, w1 * nH.y+ (1 - w1) * nA.y, w1 * nH.z + (1 - w1) * nA.z+shift,g + 1, this); // point between H and A Node cen = new Node((nA.x+nB.x+nC.x+nD.x+nE.x+nF.x+nG.x+nH.x)/8,(nA.y+nB.y+nC.y+nD. y+nE.y+nF.y+nG.y+nH.y)/8,(nA.z+nB.z+nC.z+nD.z+nE.z+nF.z+nG.z+nH.z)/8+shift,g+1,this); //center of octagon Node a1 = new Node((ab.x+cen.x)/2f, (ab.y+cen.y)/2f, (ab.z+cen.z)/2f+shift,g+1, this); //point between ab and center Node c1 = new Node((cd.x+cen.x)/2f, (cd.y+cen.y)/2f, (cd.z+cen.z)/2f+shift,g+1, this); //point between cd and center Node e1 = new Node((ef.x+cen.x)/2f, (ef.y+cen.y)/2f, (ef.z+cen.z)/2f+shift,g+1, this); //point between ef and center Node g1 = new Node((gh.x+cen.x)/2f, (gh.y+cen.y)/2f, (gh.z+cen.z)/2f+shift,g+1, this); //point between gh and center Face fNew1 = new Face(aa, bb, bc, a1, ha, g + 1, this); Face fNew2 = new Face(bc, c1, cen, a1, g + 1, this); Face fNew3 = new Face(cc, dd, de, c1, bc, g + 1, this); Face fNew4 = new Face(de, e1, cen, c1, g + 1, this); Face fNew5 = new Face(ee, ff, fg, e1, de, g + 1, this); Face fNew6 = new Face(fg, g1, cen, e1, g + 1, this); Face fNew7 = new Face(gg, hh, ha, g1, fg, g + 1, this); Face fNew8 = new Face(ha, a1, cen, g1, g + 1, this); } }


311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341

} updateForm = false; } void getMinMaxValues(int g) { minArea = 100000; minPerimeter = 100000; minJaggedness = 100000; maxArea = -100000; maxPerimeter = -100000; maxJaggedness = -100000; int numberOfOldFaces = allFaces.size(); for (int h = 0; h < numberOfOldFaces; h++) { Face f = (Face) allFaces.get(h); // load faces from the arraylist if (f.g == g) { float area = f.getArea(); float perimeter = f.getPerimeter(); float jaggedness = f.getJaggedness(); minArea = min(minArea, area); maxArea = max(maxArea, area); minPerimeter = min(minPerimeter, perimeter); maxPerimeter = max(maxPerimeter, perimeter); minJaggedness = min(minJaggedness, jaggedness); maxJaggedness = max(maxJaggedness, jaggedness); } } } }

145


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 146

package subdivision43; public class Node { subdivision43 pa; float x, y, z; int g; Node(float xx, float yy, float zz, int gg, subdivision43 p){ this.x = xx; this.y = yy; this.z = zz; this.g = gg; pa=p; p.allNodes.add(this);} public void display(){ pa.fill(255, 0, 0); pa.ellipse(x, y, 5, 5); } }

Class of Node


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62

package subdivision43;

Class of Face

import java.util.ArrayList; import processing.core.*; public class Face { subdivision43 pa; ArrayList<Node> myNodes = new ArrayList<Node>(); int g; boolean stop = false; // add new Face into allFaces of subdivision43 Face(Node n1, Node n2, Node n3, int g, subdivision43 p){ myNodes.add(n1); // face of Triangle myNodes.add(n2); myNodes.add(n3); this.g = g; pa = p; pa.allFaces.add(this); } Face(Node n1, Node n2, Node n3, Node n4,int g, subdivision43 p){ myNodes.add(n1); // face of Quadriateral myNodes.add(n2); myNodes.add(n3); myNodes.add(n4); this.g = g; pa = p; pa.allFaces.add(this); } Face(Node n1, Node n2, Node n3, Node n4, Node n5, int g, subdivision43 p){ myNodes.add(n1); // face of Pentagon myNodes.add(n2); myNodes.add(n3); myNodes.add(n4); myNodes.add(n5); this.g = g; pa = p; pa.allFaces.add(this); } Face(Node n1, Node n2, Node n3, Node n4, Node n5,Node n6, Node n7, Node n8, int g, subdivision43 p){ // face of Octagon myNodes.add(n1); myNodes.add(n2); myNodes.add(n3); myNodes.add(n4); myNodes.add(n5); myNodes.add(n6); myNodes.add(n7); myNodes.add(n8); this.g = g; pa = p; pa.allFaces.add(this); } public void display(){ pa.stroke(0, 30); pa.strokeWeight(1.5f); pa.fill(127,100); pa.beginShape(); for(int c = 0; c < myNodes.size(); c++){ 147


63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 148

Node n = myNodes.get(c); pa.vertex (n.x, n.y, n.z); } pa.endShape(pa.CLOSE); } float getArea(){ float area = 0; if (myNodes.size() == 3){ //counting the area of Triangle Node n1 = myNodes.get(0); Node n2 = myNodes.get(1); Node n3 = myNodes.get(2); area = triangleArea(n1.x,n1.y,n1.z,n2.x,n2.y,n2.z,n3.x,n3.y,n3.z); } if (myNodes.size() == 4){ //counting the area of Quadriateral Node n1 = myNodes.get(0); Node n2 = myNodes.get(1); Node n3 = myNodes.get(2); Node n4 = myNodes.get(3); area = triangleArea(n1.x,n1.y,n1.z,n2.x,n2.y,n2.z,n3.x,n3.y,n3.z)+triangleArea(n3.x,n3.y,n3.z,n4.x,n4 .y,n4.z,n1.x,n1.y,n1.z); } if (myNodes.size() == 5){ //counting the area of Pentagon Node n1 = (Node) myNodes.get(0); Node n2 = (Node) myNodes.get(1); Node n3 = (Node) myNodes.get(2); Node n4 = (Node) myNodes.get(3); Node n5 = (Node) myNodes.get(4); area = triangleArea(n1.x,n1.y,n1.z,n2.x,n2.y,n2.z,n3.x,n3.y,n3.z)+triangleArea(n3.x,n3.y,n3.z,n5.x,n5. y,n5.z,n1.x,n1.y,n1.z)+triangleArea(n3.x,n3.y,n3.z,n4.x,n4.y,n4.z,n5.x,n5.y,n5.z); } if (myNodes.size() == 8){ //counting the area of Octagon Node n1 = (Node) myNodes.get(0); Node n2 = (Node) myNodes.get(1); Node n3 = (Node) myNodes.get(2); Node n4 = (Node) myNodes.get(3); Node n5 = (Node) myNodes.get(4); Node n6 = (Node) myNodes.get(5); Node n7 = (Node) myNodes.get(6); Node n8 = (Node) myNodes.get(7); area = triangleArea(n1.x,n1.y,n1.z,n2.x,n2.y,n2.z,n3.x,n3.y,n3.z)+triangleArea(n1.x,n1.y,n1.z,n3.x,n3. y,n3.z,n4.x,n4.y,n4.z)+triangleArea(n1.x,n1.y,n1.z,n4.x,n4.y,n4.z,n5.x,n5.y,n5.z)+triangleArea(n1.x,n1 .y,n1.z,n5.x,n5.y,n5.z,n6.x,n6.y,n6.z)+triangleArea(n1.x,n1.y,n1.z,n6.x,n6.y,n6.z,n7.x,n7.y,n7.z)+trian gleArea(n1.x,n1.y,n1.z,n7.x,n7.y,n7.z,n8.x,n8.y,n8.z); } return area; } float getPerimeter(){ float perimeter = 0; for (int c = 0; c < myNodes.size(); c++){ Node n1 = (Node) myNodes.get(c); int cplus = c+1; if (cplus == myNodes.size()){cplus = 0;} Node n2 = (Node) myNodes.get(cplus); perimeter = perimeter + pa.dist(n1.x,n1.y,n1.z,n2.x,n2.y,n2.z); } return perimeter; } float getJaggedness(){


125 126 127 128 129 130 131 132 133 134 135 136 137 138 139

return getPerimeter()/getArea(); } float triangleArea(float xa, float ya, float za, float xb, float yb, float zb, float xc, float yc, float zc) {return .5f*PApplet.sqrt(pa.pow(determinant(xa,xb,xc,ya,yb,yc,1,1,1),2)+pa.pow(determinant(ya,yb, yc,za,zb,zc,1,1,1),2)+pa.pow(determinant(za,zb,zc,xa,xb,xc,1,1,1),2)); } float determinant(float a,float b,float c, float d,float e,float f, float g, float h, float i){return (a*e*i-a*f*hb*d*i+b*f*g+c*d*h-c*e*g); } }

149


References -

Ben, P., 2010, The Articulate surface: Ornament and Technology in Contemporary Architecture, p.7-17, Birkhäuser Press.

-

Catmull, E. and Clark, J., 1978, Recursively generated B-spline surfaces on arbitrary topological meshes, Computer-Aided Design, 10(6) pp. 350355.

-

Doo, D. and Sabin M., 1978, A subdivision algorithm for smoothing down irregularly shaped polyhedrons, Proceedings on Interactive Techniques in Computer Aided Design, pp. 157-165.

-

Doo, D. and Sabin M., 1978, Behavior of recursive division surfaces near extraordinary points, Computer-Aided Design, 10(6) pp. 356- 360.

-

Ernst, H., 1899, Art Forms of Nature.

-

Kostas, T., 2006, Algorithmic Architecture, Architectural Press.

-

Le Corbusier, 1923, Towards a New Architecture, Trans. Frederick Etchells. London, The Architectural Press.

-

Mitchell, W. J., 1990, The Logic of Architecture: Design, Computation and Cognition, The MIT Press.

-

Mitchell, W. J., 1998, “Antitectonics: The Poetics of Virtuality.” In The Virtual Dimension: Architecture, Representation, and Crash Culture, ed. John

-

Beckmann, p.205-217. New York: Princeton Architectural Press.

-

Moussavi, F., 2009, “The Function of Form.“, Actar and Harvard University Graduate School of Design.

-

Pearson, M., 2011, “Generative Art”, Manning Publications.

-

Schittich, C. (ed.)2002, In Detail: Building Skins, Birkhäuser Press.

-

Hansmeyer, M., 2010, From Mesh to Ornament: Subdivision as a generative system, eCAADe: Generative and Parametric Design, September 1518, 2010, Zürich, Switzerland. pp. 285-293.

150


Author Yunying Chiu blacka43@arch.nctu.edu.tw ETH Z端rich CAAD Department HPZ Floor F Schafmattstr. 32 8093 Zurich Switzerland

151



All rights reserved Š of Yunying Chiu, 2012


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.