VoronoiDiagram을이용한Morphological …태양계 내의 행성들의 관계에 관한 그림 9...

112
工學碩士學位 請求論文 Voronoi Diagram을 이용한 Morphological Design 가능성에 대한 연구 A Study of Morphological Design Possibilities Using the Voronoi Diagram 2008年 8月 仁荷大學校 大學院 建築工學科(計劃專攻) 姜聲鋆

Transcript of VoronoiDiagram을이용한Morphological …태양계 내의 행성들의 관계에 관한 그림 9...

  • 工學碩士學位 請求論文

    Voronoi Diagram을 이용한 Morphological

    Design 가능성에 대한 연구

    A Study of Morphological Design Possibilities

    Using the Voronoi Diagram

    2008年 8月

    仁荷大學校 大學院

    建築工學科(計劃專攻)

    姜 聲 鋆

  • 工學碩士學位 請求論文

    Voronoi Diagram을 이용한 Morphological

    Design 가능성에 대한 연구

    A Study of Morphological Design Possibilities

    Using the Voronoi Diagram

    2008年 8月

    指導敎授 : 박 진 호

    이 論文을 碩士學位 論文으로 提出함

    仁荷大學校 大學院

    建築工學科(計劃專攻)

    姜 聲 鋆

  • 이 論文을 姜 聲 鋆의 碩士學位 論文으로 認定함

    2008年 8月

    主審

    副審

    委員

  • 국문요약

    보로노이 다이어그램(Voronoi Diagram)은 아주 간단한 기하학적 인식에서부터 출

    발한다. 그것은 마치 어린아이들이 장난치듯이 영역을 가르기 위해 금을 긋는 행위와

    비슷하다. 그러나 이기적인 금 긋기가 아닌 서로에 대한 배려와 양보가 보로노이 다이

    어그램 속에 있다. 왜냐하면 보로노이 다이어그램은 특성상 분포되어있는 각 점들로부

    터 가장 균등하게 배분되는 경계들의 집합을 의미하기 때문이다.

    보로노이 다이어그램은 100년 전에 등장하였지만 각광을 받기 시작한 것은 최근의

    일이다. 이는 컴퓨터의 발달과 관련이 깊다. 이제까지 인간이 미처 발견하지 못한 관념

    공간을 인간이 해낼 수 없는 컴퓨터의 계산능력과 작업능력을 통하여 공간을 발견하고

    진화시키고 있다. 이것을 통해 자연공간을 새롭게 정의하고 이해하며 응용하는데에 까

    지 이르고 있다. 상이한 분야에 내포되어 있는 보로노이 다이어그램의 개념을 포착하고

    드러냄으로써 그러한 하나의 개념의 세분화 과정과 응용이 다른 영역에서 어떻게 새로

    운 패러다임으로 제시될 수 있는 가는 매우 흥미로운 사실이다.

    보로노이 다이어그램은 자연계의 현상과 공간의 구조를 설명해줄 수 있는 매우 유용

    한 다이어그램으로 CAD, CAM 등의 파일 압축 혹은 마이크로 테크놀로지에 있어 분자

    구조의 수학적 연산 등에 응용될 뿐 아니라 이를 확장하면 프랙탈 이론처럼 가시적인

    자연현상 및 비가시적인 사회현상을 설명해주는 도구로 진화할 가능성을 충분히 갖고

    있다. 공학 분야에서는 로봇 경로 계획을 위해, 수학과 물리학에서는 패턴 분리 시스템

    과 분자 구조의 연상을 위해, 그리고 이미지 작업에서는 파일 압축방식이나 공간생성과

    시뮬레이션 프로그램 등에 응용되고 있다. 또한 보로노이 형태학은 세포의 집합구조와

    관련하여 현재 진행되고 있는 연구에서 가장 최근에 개발된 분야이다. 불확실한 조건에

    용이하게 적용할 수 있는 보로노이 알고리즘은 위성 네비게이션 동물의 서식지 추적 그

    리고 도시 계획과 같은 다양한 분야에서 활용되고 있다.

    현재 건축에서는 도시를 해석하는 방법에서부터 디자인 프로세스에 이르기까지 활용

    되고 있다. 본 논문에서는 이러한 건축디자인 방법을 체계화하여 건축에서의 보로노이

    다이어그램을 이용하여 다양한 morphological design 적용가능성에 대해서 살펴보고

    자 한다.

  • Abstract

    Voronoi diagram is started from very simple geometric thought. It's like a

    children’s play cutting a line on the ground to make own border. This is not

    just selfish cutting but make concession for everyone. Because Voronoi

    diagram is collections of border that point is distributed fairly.

    Voronoi diagram is initiated from 100 years ago, but it is attracted public

    attention recently. This fact is associated with invention of computer

    technology. It created and figured out a space which is used computer

    calculation and program that people could not recognize perception. This can

    make redefining and understanding nature. by using this, we can suggest new

    paradigm that connected other concept.

    Voronoi diagram is very useful because it can explain phenomena of nature

    and space and structure. It is used file compression and micro technology in

    CAD, CAM. It is used finding way in robot technology and associating molecule

    in physics and dividing pattern system in mathematics. Voronoi morphology is

    recently study associating an assembly of molecule. Furthermore, Voronoi

    diagram is utilized satellite navigation and chasing animal’s habitation and city

    plan because it is suitable in various situations.

    Nowadays Voronoi diagram is used from method of analyzing city to design

    process in architecture. This study will let architectural design process is

    systematic and seek for adaptable possibility of morphology design using

    Voronoi diagram in architecture.

  • 목 차

    n 국문 요약 I

    n Abstract II

    n 목차 III

    1. 서 론 1

    1.1 연구의 배경 및 목적 1

    1.2 연구의 범위 및 방법 2

    2. Voronoi Diagram 3

    2.1 정 의 4

    2.2 특 성 7

    2.3 역사적 배경 8

    2.4 다양한 과학적 적용사례 10

    2.4.1 로봇의 경로 10

    2.4.2 계산기하학 11

    2.4.3 생물학 12

    2.4.4 단백질 구조 14

    2.4.5 지도정보시스템(Map Info System) 15

    2.5 소 결 16

    3. 라이노 스크립트(Rhino Script) 17

    3.1 이차원 보로노이 다이어그램 스크립트(2D Voronoi Diagram script) 17

    3.2 삼차원 보로노이 다이어그램 스크립트(3D Voronoi Diagram script) 20

    3.3 소 결 31

    4. Morphological Design by Script 32

    4.1 포인팅(Pointing)기법을 이용한 이차원 보로노이 다이어그램의 형성과정 32

    4.1.1 점들의 분포(Points Distribution) 33

    4.1.2 이차원 보로노이 다이어그램 맵핑(2D Voronoi diagram mapping) 37

    4.1.2.1 1plate를 이용한 보로노이 다이어그램 적용 38

  • -보로노이 월(Voronoi Wall) 38

    -국립 가오슝 퍼포밍 아트센터

    (National Kaohsiung Performing Arts Center) 39

    4.1.2.2 2plate를 이용한 보로노이 다이어그램 적용 40

    -C-Wall 40

    -Plate House 42

    4.1.2.3 변형을 이용한 보로노이 다이어그램 적용 44

    -보로노이 파사드(Voronoi Facade) 44

    4.1.2.4 원을 이용한 보로노이 다이어그램 적용 46

    -보로노이 홀(Voronoi Hole) 46

    4.2 삼차원 보로노이 다이어그램(3D Voronoi diagram) 48

    4.2.1 점들의 분포(Points distribution) 48

    4.2.2 삼차원 보로노이 다이어그램 적용 50

    5. Design Experiments 52

    5.1 디자인 변수 52

    5.2 사용자가 디자인 변수로 입력할 수 있는 스크립트(Script) 53

    5.2.1 변수를 받기위한 스크립트 53

    5.2.2 변수를 통해 디자인하는 스크립트 54

    5.3 Design Output 57

    5.4 Further Design Experiments 59

    5.4.1 3D Voronoi Mass 59

    5.4.2 3D Voronoi Circle Skin 60

    5.4.3 3D Voronoi Random Pointing and Deleting 61

    5.4.1 Mass Study Experiments 62

    6. 결 론 88

    n 참고문헌 90

    n 부록 92

  • ■ 표목차

    [표1] 보로노이 다이어그램 요소 52

    [표2] 보로노이 셀 형성 방법 62

    ■ 그림목차

    [그림 1] 보로노이 다이어그램의 예 3

    [그림 2] 세 점에 대한 보로노이 다이어그램 4

    [그림 3] 보로노이 다이어그램의 수학적 정의를 표현한 그림 5

    [그림 4] 디지털화된 보로노이 다이어그램 6

    [그림 5] 보로노이 다이어그램의 생성과정 7

    [그림 6] 딜러니 삼각망(Delaunay triangulation) 8

    [그림 7] Le Monde de Mr Descartes에 나타나는 Descartes의

    태양계 내의 행성들의 관계에 관한 그림 9

    [그림 8] 다각형 사이의 Voronoi diagram 11

    [그림 9] K-means and Voronoi diagram 12

    [그림10] Cell Walls: Voronoi Model, Cell Connectivity: Delaunay 13

    [그림11] Cell Walls을 보로노이 다이어그램으로 해석한 결과 13

    [그림12] 식물의 잎차례들을 보로노이 다이어그램으로 해석한 결과 13

    [그림13] 단백질 구조 14

    [그림14] 미국 고등학교 점들에 의한 보로노이 결과 15

    [그림15] 결과물 분석 도구 15

    [그림16] 선에 의한 이차원 보로노이 다이어그램 34

    [그림17] 곡선 의한 이차원 보로노이 다이어그램 35

    [그림18] 원 의한 이차원 보로노이 다이어그램 36

    [그림19] 나선형 의한 이차원 보로노이 다이어그램 36

    [그림20] 불규칙적인 점 의한 이차원 보로노이 다이어그램 37

    [그림21] 보로노이 다이어그램 맵핑(Voronoi Diagram Mapping)의 예 38

    [그림22] 1plate의 예 : 보로노이 월(Voronoi Wall) 38

    [그림23] 가오슝 아트센터 전경 39

    [그림24] 가오슝 아트센터에 적용된 보로노이 다이어그램 39

    [그림25] 가오슝 아트센터의 보로노이 다이어그램 프로세스(process) 40

    [그림26] 2plate의 예 : C-Wall 41

    [그림27] Plate House process 43

    [그림28] Plate House max shot 43

    [그림29] Voronoi Facade process 45

  • [그림30] Voronoi Facade max shot 45

    [그림31] Voronoi Hole process 46

    [그림32] Voronoi Hole max shot 47

    [그림33] 3D Voronoi Diagram 49

    [그림34] 3D Voronoi Tower process 50

    [그림35] 3D Voronoi Tower detail 51

    [그림36] 3D Voronoi Diagram의 변수 52

    [그림37] Design result by script Ⅰ 57

    [그림38] Design result by script Ⅱ 58

    [그림39] Design result by script Ⅲ 58

    [그림40] 3D Voronoi Morphologies 58

    [그림41] 3D Voronoi Mass Example 59

    [그림42] 3D Voronoi Circle Skin Example 61

    [그림43] 3D Voronoi Random Pointing and Deleting Example 61

  • - 1 -

    1. 서 론

    1.1. 연구의 배경 및 목적

    보로노이 다이어그램은 자연계에 나타나는 현상 및 구조와 공간의 원리 및 질서를 설

    명해줄 수 있는 매우 유용한 다이어그램이다. 100년 전에 등장하였지만 잘 쓰이지 않다

    가 컴퓨터의 발달로 인해 복잡한 수학적 개념이 현실로 계산되어지는 것이 가능해지면

    서 많은 분야에 적용되고 있다. 실제로 CAD, CAM 등의 파일 압축 혹은 마이크로 테크

    놀로지에 있어 분자구조의 수학적 연산 등에 응용될 뿐 아니라 이를 확장하면 프랙탈

    이론처럼 가시적인 자연현상 및 비가시적인 사회현상을 설명해주는 도구로 진화할 가능

    성을 충분히 갖고 있다. 공학 분야에서의 로봇 경로 계획, 수학과 물리학에서의 패턴 분

    리 시스템과 분자 구조의 연상, 그리고 이미지 작업에서의 파일 압축방식이나 공간생성

    과 시뮬레이션 프로그램 등에도 응용되고 있다. 또한 보로노이 형태학은 세포의 집합구

    조와 관련하여 현재 진행되고 있는 연구에서 가장 최근에 개발된 분야이다. 불확실한

    조건에 용이하게 적용할 수 있는 보로노이 알고리즘은 위성 네이게이션 동물의 서식지

    추적 그리고 도시 계획과 같은 다양한 분야에서 활용되고 있다. 최근 보로노이 다이어

    그램은 건축 디자인 프로세스에도 적용되고 있다.

    본 연구는 다양한 분야에서의 활용만큼 건축에 적용되어질 가능성이 충분히 있다는

    가정에서 출발한다. 이 논문에서는 보로노이 다이어그램을 통한 건축디자인 방법을 체

    계화하여 건축에서의 다양한 morphological design 적용가능성에 대해서 살펴보고자

    한다. 보로노이 다이어그램을 이용하기 위해서 수학적 계산과 프로그래밍이 필요하기

    때문에 이 논문에서는 3D프로그램인 라이노(Rhino)*와 프로그래밍 스크립트를 이용한

    다. 마지막으로 프로그래밍을 통해 다양한 morphological design 가능성들을 이끌어

    내고자 하는 것이 이 연구의 목적이다.

    * 라이노(Rhino) : Max, Maya와 같은 3D 프로그램으로서 넙스(Nurbs:곡선을 통해 모델링(modeling)

    하는 방법)에 바탕을 두고 있다.

  • - 2 -

    1.2. 연구의 범위 및 방법

    본 연구의 연구 범위는 보로노이 다이어그램을 통해 건축물이라는 결과보다, 이 다이

    어그램의 디자인 방법론으로서의 가능성에 더 중점을 둔다. 이를 위해 보로노이 다이어

    그램의 이론의 특징과 기본적 원리를 설명할 것이다.

    컴퓨터에 바탕을 두고 진행하기 때문에 이를 진행하기 위한 방법으로 컴퓨터 용어에

    대한 정의와 이차원/삼차원 보로노이 다이어그램에 대해 설명하고, 보로노이 다이어그

    램을 적용하기 위한 라이노 스크립트를 설명하도록 한다. 라이노 스크립트로 나온 결과

    물은 보로노이 다이어그램이라는 디자인 방법과 컴퓨터 스크립트를 이용한 체계적인 디

    자인이 될 것이다.

    각 장중에서 먼저 2장에서는 보로노이 다이어그램이 무엇인지 그 특징은 어떠한지를

    설명하고 3장에서는 보로노이 다이어그램을 이용하기 위한 라이노스크립트를 설명한

    다. 4장에서는 2D보로노이 다이어그램과 3D보로노이 다이어그램으로 나누어 점의 분

    포에 따른 다양한 디자인 가능성을 실험 하고 5장에서는 직접 작성한 스크립트를 통하

    여 사용자가 몇 가지 변수를 입력하면 다양한 결과물을 도출하도록 하는 스크립트를 작

    성한다. 이러한 다양한 결과물을 통하여 보로노이 다이어그램을 통한 건축 디자인의 가

    능성들을 찾고자 한다.

    보로노이 다이어그램을 통한 디자인의 가능성들에 대해서 그리고 프로세스와 결과물

    이 어떻게 도출되고 이어지는지에 중점을 두어 진행된 이 연구는 보로노이 다이어그램

    을 체계화된 디자인으로 이끌어 내어 스크립트를 통한 디자인 가능성을 보여주도록 한

    다.

  • - 3 -

    2. Voronoi Diagram

    보로노이 다이어그램(Voronoi Diagram)은 Georgy Voronoi의 이름에서 유래되었

    으며 수학에서는 보로노이 모자이크(Voronoi tessellation), 보로노이 분해(Voronoi

    decomposition), 디리클레 모자이크(dirichlet tessellation : lejeune dirichlet의 이름

    을 따서)와 동일하게 불리고 있다. 보로노이 다이어그램은 특정한 물체들의 떨어져있는

    모임이나 공간에 분포된 점들의 모임에 의해 결정되어지며 영역을 구분하는 하나의 방

    법이다.1) 예를 들면, 점들의 집합을 S라고 하면 이러한 S를 위한 보로노이 다이어그램

    은 점 주변의 영역들을 균등하게 경계를 만들어 가는 것이다. 경계의 구분 방법은 S안

    에 있는 점들로부터 동일한 거리에 있는 점 p들의 집합 V(p)라고 말할 수 있다. 이것은

    두 점 사이의 선분을 긋고 중간점으로부터 수직이등분선을 긋는 것과 동일하다고 할 수

    있다. 이러한 수직이등분선을 정리하면 보로노이 다이어그램이 형성된다. 아래 [그림1]

    을 보면 점들로부터 가장 균등한 경계를 형성시키고 있는 것을 볼 수 있다.

    [그림 1] 보로노이 다이어그램의 예

    1) 위키백과 : http://en.wikipedia.org/wiki/Voronoi_diagram

  • - 4 -

    2.1. 정의

    이러한 보로노이 다이어그램은 몇 가지 방법으로 정의될 수 있으나, 본 논문에서는

    세 가지로 정의해 보겠다. 정의 내리기전에 보로노이 다이어그램에서 사용되는 용어를

    몇 가지 살펴보겠다.

    각 점들로부터 같은 거리에 있는 점들의 집합이라는 방법을 통하여 보로노이 다이어

    그램이 만들어지면 경계에 의하여 각 점마다 영역을 형성하게 된다. 이러한 영역을 보

    로노이 사이트(Voronoi Site)라고 한다. 두 개의 보로노이 사이트가 만나면 모서리를

    형성하는데 이를 보로노이 모서리(edge)라고 하며 세 개 이상의 보로노이 영역에 의해

    만들어지는 꼭짓점을 보로노이 꼭짓점(vertex)이라고 한다. 이 정의에 의하면 보로노

    이 모서리 위의 임의의 점은 그 모서리를 만든 두 사이트에 동일 거리에 있으며, 모서리

    들에 의해 만들어진 보로노이 영역 안의 모든 점들은 같은 사이트에 가장 가까운 점들

    이다. 세 개의 점이 있을 때 보로노이 다이어그램은 아래 그림과 같다. 두 점에 의해 생

    기는 보로노이 모서리는 두 점 사이의 이등분선이고 세 개의 이등분선이 만나는 점은

    외접원의 중심이 된다.2)

    [그림 2] 세 점에 대한 보로노이 다이어그램

    2) 정현주. 유견아, Finding a natural path by using a Voronoi diagram in computer games,

    자연과학논문집 제11권, 2005

  • - 5 -

    첫 번째 정의를 살펴보면 유클리디안 평면 안에서 점의 개수는 2≦n≦∞로 설정하고,

    각 점들의 이름은 p1, p2, . . . , pn이라 하면, 각 점들은 데카르트 좌표에 의한 (x11,

    x12), . . . ,(xn1, xn2) 또는 벡터 x1, . . . , xn 으로 표현된다. 각 점들 i, j∊In{1, . . .

    , n}일 때 xi≠xj 를 만족할 때 보로노이 다이어그램은 다음과 같이 정의된다.3)

    d(p, pi) = ∥x - xi∥ = √((x1-xi1)2 + (x2 - xi2)

    2)

    [그림 3] 보로노이 다이어그램의 수학적 정의를 표현한 그림4)

    이것은 두 점을 벡터로 표현하였을 때 벡터의 합성을 나타내는 것으로서 점과 점사이

    의 가까운 점들의 집합을 찾아내는 방법이다.

    두 번째로 보로노이 다이어그램은 유클리디안(Euclidean) 평면을 분할하는 일련의

    보로노이 사이트의 집합이다. P = { p 1 , p 2 , . . . , pn }는 2차원의 유클리디안 평면

    위에 존재하는 정점들의 집합으로 이를 사이트라 하고, 이들 사이트들은 평면 위에 존

    재하는 모든 정점들을 이들과 가장 가까운 사이트에 할당함으로 유클리디안 평면을 분

    할한다. 또한 그 평면에 존재하는 정점들은 보로노이 영역(region) V( p i ) 에 할당되

    면 보로노이 영역(region) V( p i )에 할당된다.5)

    V( p i ) = {x : | p i - x | ≤ | p j - x | , Vj≠i}

    3) Walter A. Shewhart and Samuel S.Wilks, Spatial Tessellations, wiley series in probability and

    statistics, 2000

    4) Walter A. Shewhart and Samuel S.Wilks, Spatial Tessellations, wiley series in probability and

    statistics, 2000

    5) 강윤식,박우찬,양성봉, 구역화를 이용한 디지털 격자지형데이터의 단순화 알고리즘, 연세대학교, 1999

  • - 6 -

    세 번째는 유클리디안 평면상에 n개의 점 { p 1 , p 2 , . . . , pn }에 대해 n개의 소

    영역(보로노이 다각형(Voronoi Polygon)이라 부름)으로 분할한 것인데 각각의 보로노

    이 다각형 V(pi)는 다음과 같이 정의된다.6)

    V(pi) = {x|x in R2 and d(x, pi) ≤ d(x, pj), j≠i}

    (단, d(x, pi)는 두 점 x와 pi사이의 유클리디안 거리)

    [그림 4] 디지털화된 보로노이 다이어그램7)

    이 를 컴퓨터를 통하여 표현하면 [그림4]와 같다. n개의 점(vertex)를 갖는 단순다

    각형(Simple polygon)P는 v0, v1, . . . , vn-1를 잇는 모서리(edge)들로 나타나게 된

    다. 식을 단순 다각형에 적용시켜 일반화하면 각각의 점들에 대한 보로노이 다이어그램

    VT(vi)는 다음과 같이 정의할 수 있다.

    VT(vi) = {x|x는 다각형(Polygon)내부의 점 and id x(vi) ≤ id(x, vi), j≠i}

    (단, id(x, vi)는 두 점 x와 vi사이의 내부거리이다)

    6) 양태천, 단순다각형의 Voronoi Tessellation을 구하는 알고리즘, 한국정보과 학회논문지, 1987

    7) Walter A. Shewhart and Samuel S.Wilks, Spatial Tessellations, wiley series in probability and

    statistics, 2000

  • - 7 -

    이들 3가지 정의의 공통적인 특징은 각 점들로부터의 거리를 통하여서 점들의 집합을

    찾아내는 것이다. 즉, 보로노이 다이어그램에서 생성되는 선들은 유클리디안 평면에 존

    재하는 정점들의 집합 중에서 설정한 점들에 대해 가장 가까운 점들에 할당한 점들의

    집합으로 유클리디안 평면을 분할함을 알 수 있다. 3장에서 설명하게 될 라이노 스크립

    트는 이러한 보로노이 다이어그램의 정의를 바탕으로 하여서 만들어지게 된다.

    2.2. 특성

    보로노이 다이어그램의 특성을 알기 위해서는 먼저 어떠한 방법으로 보로노이 다이어

    그램이 형성되어지는지 살펴보아야 한다. 보로노이 다이어그램의 생성과정을 살펴보면

    먼저 두 개의 점이 있을 때 보로노이 다이어그램을 통하여 두 점 사이에 생성되는 점들

    의 집합은 두 점을 잇는 선분의 중심점과 직교하게 생성되는 직선이 될 것이다. 또 다른

    점과도 같은 방법으로 직교하는 선분을 그리면 직교하는 선분끼리 교차하게 된다. 이

    과정을 반복하여 실행한 후 선들을 정리해가면 보로노이 다이어그램을 형성할 수 있다.

    [그림 5] 보로노이 다이어그램의 생성과정

    형성과정을 통해 알 수 있듯이 보로노이 다이어그램은 각 점들로부터 균등한 분배원

    칙을 유지하고 있다. 또한 형성과정에서 생겨나는 선들은 딜러니 삼각망(Delaunay

    triangulation)과 밀접한 관계가 있다.

    1934년 딜러니(R. Delaunay)는 보로노이 다이어그램으로부터, 그 다이어그램에 유

    일한 2차원 삼각망을 생성해 내는 조건을 증명하였다. 만약 보로노이 다이어그램내의 3

    개 영역의 외접원내에 다른 영역이 존재하지 않는다면, 그 다이어그램내의 영역들을 인

  • - 8 -

    접한 보로노이 영역의 영역들과 직선으로 연결함으로 유일한 평면 삼각망을 생성한다.

    이러한 삼각망을 딜러니 삼각망이라 하며, 이 딜러니 삼각망은 2가지의 중요한 특징을

    가지고 있다.8)

    하나는 임의의 보로노이 다이어그램에 대하여 유일한 딜러니 삼각망이

    존재하는 것이고, 다른 하나는 딜러니 삼각망 내의 삼각형들은 모두 예각 삼각형이라는

    것이다.

    [그림 6] 딜러니 삼각망(Delaunay triangulation)

    딜러니 삼각망이 생겨나는 원리를 간단히 살펴보면 원래 포인트 점들로부터 세 개의

    점을 통해 생성되는 삼각형의 외접원 안에 다른 어떠한 점이 없을 때 그 영역을 설정해

    감을 알 수 있다. 구체적으로 기존삼각형 구조에 새로운 점을 추가하면서 기존의 삼각

    형 결과를 수정하는 형식으로 진행한다. 새로운 점이 추가되면, 기존의 삼각형을 검색

    하여서 삼각형의 외접원이 이 세 점을 포함하는 경우를 다 찾으면 이들 꼭짓점의 집합

    은 하나의 다각형(polygon)을 형성한다. 내부의 변들은 모두 제거하고, 새로운 점과 다

    각형의 꼭짓점을 이어서 삼각형을 만들면 새로운 삼각형화 구조를 얻게 된다.

    2.3. 역사적 배경

    보로노이 다이어그램의 개념은 아주 오래전부터 사람들에게 생각으로 머물러 있었을

    것이다. 왜냐하면 보로노이 다이어그램은 다양한 자연 구조와 닮아 있기 때문이다. 비공

    식적인 보로노이 다이어그램의 사용은 1644년 Descartes가 시작하였다. 그는 1644년

    8) 강윤식, 구역화를 이용한 디지털 격자지형데이터의 단순화 알고리즘, 정보처리논문지, 2000

  • - 9 -

    출판된 두 권의 책 Le Monde de Mr Descartes, ou Le Trait de la Lumiere에서 보

    로노이 다이어그램을 이용하여 태양계 내의 행성들의 관계를 설명하고 있다.9) 사실 이

    시대에 이러한 다이어그램은 어떤 특별한 논의거리가 되지 못했고 사람들에게 일반적이

    지 않은 것으로 받아들여졌다. 다음 그림에서 보여주는 것은 태양계의 관계를 보로노이

    다이어그램으로 표현하였던 것으로 S가 태양, ε이 별, RQD가 행성의 괘도를 나타내고

    있다.

    [그림 7] Le Monde de Mr Descartes에 나타나는 Descartes의

    태양계 내의 행성들의 관계에 관한 그림

    그 이후 1850년 Dirichlet는 2차원과 3차원의 보로노이 다이어그램을 언급하였다.

    영국의 의사인 John Snow는 다른 우물이 아닌 감염된 넓은 길가의 우물에서 Soho 콜

    레라에 사람들이 어떻게 감염되어 죽는지를 설명하는 그림에서 보로노이 다이어그램을

    사용하였다.

    9) Walter A. Shewhart and Samuel S.Wilks, Spatial Tessellations, wiley series in probability and

    statistics, 2000

  • - 10 -

    보로노이 다이어그램은 1908년 ‘general n-dimensional case’라는 연구를 발표

    한 러시아 수학자 조지 페도세비치 보로노이(Georgy Fedoseevich Voronoi)의 이름

    을 따서 만들어졌다. 이후에 보로노이 다이어그램은 물리학이나 기상학에서 기상학자

    알프레드 에이치 티에슨(Alfred H. Thiessen)에 의해 티에슨 다각형(Thiessen

    Polygons)이라 명명되어 공간적 분포 자료를 분석하는데 사용되었다.

    이와 같이 보로노이 다이어그램은 자연 구조와 닮아 있을 뿐 아니라 공간적 가능성을

    갖고 있기 때문에 오래 전부터 다양한 분야에서 사용되었었고, 앞으로의 응용분야 또한

    다양하다.

    2.4. 다양한 과학적 적용사례

    보로노이 다이어그램은 다양한 응용분야에 적용되는 연구가 진행되고 있다. 우선 이

    논문에서는 몇 가지 적용사례에 대하여 간략히 언급하고자 한다. 왜냐하면 보로노이 다

    이어그램이 갖고 있는 가능성을 다양하게 살펴볼 수 있고 이를 통하여 보로노이 다이어

    그램의 특성을 구체적으로 파악할 수 있기 때문이다.

    적용사례를 크게 두 가지로 정리하여 설명하면 자연의 구조를 이해하고 설명하기 위

    해 보로노이 다이어그램이 적용된 생물학과 단백질 구조를 살펴볼 것이고, 공간적 적용

    이 가능한 컴퓨터게임 내에 경로 찾기와 지도 정보 시스템(Map Info System)과 계산

    기하학을 살펴볼 것이다.

    2.4.1. 로봇의 경로

    보통 보로노이 다이어그램에 의해 찾은 경로는 최대한으로 멀리하여 움직임으로서 점

    (기둥과 같이)으로 표현되는 보로노이 다이어그램을 그대로 이용할 수 있다. 점에 의한

    보로노이 다이어그램이 그림과 같이 점 쌍들의 이등분선에 의해 결정되는 것과 달리 게

    임의 경로에 사용되는 보로노이 다이어그램의 경우, 이등분선은 장애물의 기하학적 요

    소에 따라 다음 3가지 경우로 분류된다.

  • - 11 -

    1. 꼭짓점과 꼭짓점 - 직선(점과 점 사이의 이등분선)

    2. 모서리와 모서리 - 직선(선분과 선분의 이등분선)

    3. 모서리와 꼭짓점 - 포물선(선분과 점에 이르는 거리가 같은 궤적)

    [그림 8] 다각형 사이의 Voronoi diagram10)

    좌측 장애물의 꼭짓점을 기준으로 살펴보면, v와 우측 장애물 모서리 e1과의 이등분

    선은 그 사이의 이등분점을 꼭짓점으로 하는 포물선이 되며 v에서 e2의 법선방향으로

    포물선과 만나는 점부터 e1과 e2 사이의 이등분선이 두 장애물 사이의 보로노이 모서

    리가 된다. e1과 e3사이에서도 마찬가지로 Voronoi 영역을 구할 수 있다. 이러한 방법

    으로 최단거리 경로를 찾아내는데 응용될 수 있다.

    2.4.2. 계산기하학

    컴퓨터를 이용한 기하 연산을 필요로 하는 기하 문제에 관한 알고리즘을 개발하는 학

    문, 컴퓨터가 모든 자연 과학에 응용됨으로써 기본적으로 기하 연산을 필요로 하는 분

    야로는 컴퓨터 그래픽스, 이미지 처리, CAD/CAM, 지리 정보 시스템, 로보틱스, 천문

    학, 분자 생물학, 유체 역학 등이 있다. 이 분야에서 기본적인 기하 연산 도구를 개발하

    고, 새로 발견되는 문제에 대한 해결 방법을 제공한다.

    10) 정현주. 유견아, Finding a natural path by using a Voronoi diagram in computer games,

    자연과학논문집 제11권, 2005

  • - 12 -

    예를 들면 아래 [그림9]에서처럼 계산기하학을 이용한 컴퓨터 그래픽 작업으로

    K-Means 와 보로노이 다이어그램의 관계를 보여주고 있다. 공간상의 점들을 (벡터공

    간의 특징점 벡터들이 보다 일반적인 상황이 될 것이다.) 서로 가까운 점들끼리 묶어서

    몇 개의 군으로 나누는 분류기법 중에 쉬운 방법 중 하나가 K -Means이다 . 이것은

    각각의 그룹에 속하는 점들은 다른 그룹의 중심에서의 유클리디안 거리보다는 자기가

    속한 그룹의 중심까지의 유클리디안 거리(measure)가 최소가 되게 분류하는 것이다.

    보로노이 다이어그램에서도 각각의 셀의 중심에서 이웃 셀의 중심까지의 거리가 절반이

    되는 지점에서 모서리(edge)를 그어서 영역을 구별한다. 보로노이 모서리가 각 영역의

    경계를 형성한다. 아래의 그림은 평면상의 점을 다섯 개의 그룹으로 K - Means방법에

    의해서 나누고, 각각의 그룹의 중심점을 이용해서 보로노이 다이어그램을 그린 것이다.

    점들은 그 그룹의 중심에서 가우시안(Gaussian)분포를 갖도록 만든 것이다. 11)

    [그림 9] K-means and Voronoi diagram12)

    2.4.3. 생물학

    모든 자연 현상은 보이지 않는 어떤 질서와 균형으로 이루어져 있으며 모든 생물은

    유기적 구조를 가지고 자연의 법칙에 의해서 생명을 지탱한다. 생물학적 물질들은 그

    자체가 구조적으로 완전하고 기능적으로 완벽한 이상적 형태를 지니고 있으며 그것의

    조화가 자연의 아름다움을 이룰 수 있도록 배열되어 있다. 동식물의 기본구조는 세포를

    기본단위로 하는 집합체들로 이루어져있다. 아래 그림은 California Institute of

    11) http://blog.naver.com/helloktk

    12) http://blog.naver.com/helloktk

  • - 13 -

    Technology의 백먼 연구소(The Beckman Institute)에서 작업한 내용으로서 식물의

    세포단위를 분석한 내용들이다. 이 세포들은 보로노이 다이어그램을 통해 분석하여 리

    모델링하는 과정을 보여주고 있다. 이와 같이 보로노이 다이어그램은 자연의 구조와 형

    태를 잘 설명하여줄 수 있는 방법론으로서 사용된다. 보로노이 다이어그램을 응용하면

    자연의 구조를 건축에 적용할 수 있는 가능성이 많음을 알 수 있다.

    [그림10] Cell Walls: Voronoi Model, Cell Connectivity: Delaunay13)

    [그림11] Cell Walls을 보로노이 다이어그램으로 해석한 결과

    [그림12] 식물의 잎차례들을 보로노이 다이어그램으로 해석한 결과14)

    13) BruceE. Shapiro, Modeling the growing plant, Science, 2005

    (http://www.astro.rug.nl/~weygaert/tim1publication/jigsaw/shapiro_jigsaw.ppt)

    14) BruceE. Shapiro, Modeling the growing plant, Science, 2005

    (http://www.astro.rug.nl/~weygaert/tim1publication/jigsaw/shapiro_jigsaw.ppt)

  • - 14 -

    2.4.4. 단백질 구조

    삼차원 유클리디안 공간의 보로노이 다이어그램을 기본적인 계산 도구로 이용하여,

    반지름의 크기가 다양한 원자들로 구성된, 두 개 이상의 사슬로 이루어진 단백질의 상

    호작용 인터페이스를 계산할 수 있다. 또한 상호작용 인터페이스를 생물학적인 물리적

    실험을 통한 분석이 아닌 기하모델로 표현될 수 있다. 이를 위해 기하학적 측면에서의

    정확한 분석을 가능하게 해줄 요소들을 구하게 되는데 기하학적 모델링을 통해 추출된

    요소들의 정보(data)는 단백질 구조를 판별하고 구조간의 경계면 등에 대한 여러 가지

    중요한 정보들을 분석할 수 있다는 것이다. 이러한 단백질 구조를 3차원으로 분석하고

    판별해나가는데도 보로노이 다이어그램이 유용하게 활용되고 있다.

    [그림13] 단백질 구조15)

    15) 조형철, 구의 보로노이 다이어그램에 기반한 단백질의 포켓인식 및 BioCAD에서의 응용,

    한양대대학원, 2005

  • - 15 -

    2.4.5. 지도 정보 시스템(Map Info System)

    GIS를 이용하기 위한 지도 정보 시스템에서도 보로노이 다이어그램이 사용된다. 아

    래 그림은 미국의 1,307 고등학교를 점으로 인식하여 보로노이 다이어그램을 통해 결

    과물을 만들을 낸 것이다. 이 결과를 바탕으로 플로리다 고등학교들을 자세히 살펴보면

    다음 [그림14]와 같다.

    [그림14] 미국 고등학교 점들에 의한 보로노이 결과16)

    이러한 방법은 주변과 관련한 데이터의 관계를 통해 문제점을 도출하는데 유용하게

    사용된다. [그림15]를 보면 위의 결과물을 분석할 수 있는 프로그램이 나와 있다. 오른

    쪽 그림은 그 결과를 1x1 mile의 그리드로 나누어 분석한 것이다. 이는 보로노이 다이

    어그램이 건축뿐 아니라 도시 스케일(scale)에서도 적용될 수 있음을 보여주며 공간적

    관계를 설명해 줄 수 있는 방법론임을 보여준다.

    [그림15] 결과물 분석 도구17)

    16) Grant Ian Thrall, User-Friendly GIS, Geospatial solutions, 2005

  • - 16 -

    2.5. 소결

    지금까지 보로노이 다이어그램의 정의와 특성을 설명하고 그 적용분야들을 살펴보았

    다. 다양한 적용분야가 있지만 동일하게 사용되는 것은 보로노이 다이어그램의 본질적

    인 속성이다. 보로노이 다이어그램이 단순 기하학이나 자연의 모방이 아닌 다양한 형태

    변화와 구조적 질서의 내적 시스템에 관한 과학적인 도구이고, 자연에서 시작되어진 유

    기적 형태 즉 나무줄기의 모양에서 건축의 구성 원리를 발견하거나, 눈의 결정체에서

    도시의 구성 원리를, 자연의 내재적 질서에서 공간조직의 방법적 원리를 찾아내는 등의

    경우와 같이 작은 것에서부터 그 원리와 구조를 파악해 가고 있음을 알 수 있다. 살펴본

    바를 통해 보로노이 다이어그램의 원리가 다양한 건축 디자인에 적용될 수 있음을 짐작

    할 수 있다. 다음 장에서는 라이노 스크립트를 통해 보로노이 다이어그램을 프로그래밍

    언어로 구현하는 방법을 알아보고 그 디자인의 가능성에 대하여 논하도록 한다.

    17) Grant Ian Thrall, User-Friendly GIS, Geospatial solutions, 2005

  • - 17 -

    3. 라이노 스크립트(Rhino Script)

    보로노이 다이어그램을 적용하기 위해서는 먼저 라이노 스크립트(Rhino script)를

    사용하였다. 라이노 스크립트는 비주얼 베이직 스크립트(VB script)를 바탕으로 하여

    작성되어 라이노 3D 프로그램 안에서 실행 가능하도록 만들어진 프로그래밍 언어이다.

    이 프로그램을 통해 명령들을 제어하여, 다양한 3차원적 형태를 도출해낼 수 있다. 라이

    노를 사용하는 이유는 보로노이 영역들을 형성하기 위해 수학적 계산은 물론 가시화된

    결과물을 만들어 내는 데에 가장 적합한 프로그램이기 때문이다. 이번 장에서는 이차원

    /삼차원 보로노이 다이어그램을 형성하기 위한 스크립트를 설명하고자 한다.

    3.1. 이차원 보로노이 다이어그램 스크립트(2D Voronoi Diagram script)

    이차원 보로노이 다이어그램을 형성하는 기본 개념은 먼저 사용자로 하여금 점들을

    선택하게 한다. 이후 하나의 점에서 각 점들로부터 생겨나는 가장 가까운 점들의 집합

    인 선들이 생겨나게 된다. 점의 개수만큼 생겨나는 이 선들이 접하게 되는 공통부분을

    남겨두고 그 부분의 면을 형성하면 보로노이 영역을 형성하게 된다. 구체적으로 어떠한

    과정을 거치는지 아래 스크립트와 그 부연설명을 동시에 서술하였다. 기본적인 라이노

    스크립트는 잘 알려져 있는데 여기에서는 데이비드 루턴(David Rutten)이 작성한 스크

    립트를 바탕으로 하였다.

    '2D Voronoi diagram start18)

    Option Explicit //dim을 통하여 변수를 정의하겠다는 선언

    Sub VoronoiTiles() //main 스크립트의 시작

    Dim ptCloud, BBox, tileZ

    18) http://www.smedresmania.com/ (Voronoi core written by david rutten, script continued by

    thomas wingate for the use at the icehotel)

  • - 18 -

    Dim arrPt, i

    Dim crv, crvs, srf, extrCrv, tile, S, E //변수들을 정의

    ptCloud = Rhino.GetObject("Select a pointcloud...", 2, vbTrue, vbTrue)

    //포인트 점들을 선택

    If IsNull(ptCloud) Then Exit Sub //만약 점들이 선택되지 않으면 메인함수를 벗어남

    tileZ = Rhino.GetReal("Tile thickness? ", 100) //extrude할 높이를 선택하여 변수 tileZ에 대입

    If IsNull(tileZ) Then Exit Sub //만약 높이가 선택되지 않으면 메인함수를 벗어남

    BBox = Rhino.BoundingBox(ptCloud) //선택된 포인트 점들에 큰 경계를 만들어 냄

    arrPt = Rhino.PointCloudPoints(ptCloud) //포인트 클라우드를 변수 arrPt에 대입

    S = Array(0,0,0) //변수 S에 0,0,0 좌표점 대입

    extrCrv = Rhino.AddLine(S, Array(0,0,tileZ))

    //S점과 tileZ을 잇는 선분을 그려 변수extrCrv에 대입

    For i = 0 To UBound(arrPt) //반복문 : 0부터 점의 개수만큼 반복

    Rhino.EnableRedraw vbFalse //tile이 완성 될 때까지 redraw 금지

    VoronoiPolygon i, arrPt, BBox //보로노이 셀을 그리는 함수를 호출

    crv = Rhino.FirstObject //사용자에 의해 만들어진 마지막 오브젝트를 변수crv에 대입

    crvs = Rhino.ExplodeCurves(crv, vbTrue)

    //변수crv에 저장된 커브를 세그먼트단위의 라인으로 분리

    srf = Rhino.AddPlanarSrf(crvs) //변수crvs에 저장된 라인들 통해 면을 형성

    Rhino.DeleteObjects crvs //crvs 라인들 삭제

    E = Array(0,0,arrPt(i)(2))

    tile = Rhino.FirstObject

    Rhino.MoveObject tile, S, E //포인트 클라우드를 두께 값 만큼 z축으로 이동

    Rhino.EnableRedraw vbTrue //tile이 완성 될 때까지 redraw 허용

    Next //for문의 끝

    Rhino.DeleteObject extrCrv

    Rhino.command "_SelCrv"

    Rhino.command "_Delete" //면을 형성하기 위해 그렸던 변수extrCrv와 커브들을 선택하여 삭제

    End Sub

    VoronoiTiles //main 스크립트 끝

  • - 19 -

    Function VoronoiPolygon(index, datSet, BBox) //보로노이 셀을 그리는 함수의 시작

    VoronoiPolygon = Null

    Dim midPt, arrPt, vecDir(1)

    Dim ptS(2), ptE(2)

    Dim ChordLength, Border

    Dim brdLines(), i, N

    ReDim brdLines(UBound(datSet)-1) //변수들을 정의

    ChordLength = Rhino.Distance(BBox(0), BBox(2))

    //변수 BBox(0)와 BBox(2)의 거리를 변수ChordLength에 대입

    arrPt = datSet(index)

    N = 0

    For i = 0 To UBound(datSet) //0부터 변수datSet의 개수만큼 반복하는 반복문 시작

    If i index Then

    midPt = Array((datSet(i)(0) + datSet(index)(0))/2, _

    (datSet(i)(1) + datSet(index)(1))/2, _0)

    vecDir(0) = -(datSet(i)(1)-datSet(index)(1))

    vecDir(1) = datSet(i)(0)-datSet(index)(0)

    vecDir(0) = vecDir(0)/Rhino.Distance(datSet(i), datSet(index))*ChordLength

    vecDir(1) = vecDir(1)/Rhino.Distance(datSet(i), datSet(index))*ChordLength

    ptS(0) = midPt(0)+vecDir(0)

    ptS(1) = midPt(1)+vecDir(1)

    ptS(2) = 0

    ptE(0) = midPt(0)-vecDir(0)

    ptE(1) = midPt(1)-vecDir(1)

    ptE(2) = 0 //라인의 시작점과 끝점을 찾기 위한 수학식

    brdLines(N) = Rhino.AddLine(ptS, ptE)

    //위에서 계산된 변수ptS와 ptE의 값을 가지고 ptS를 시작점으로 ptE를 끝점으로 하는 선분을 그림

    N = N+1

    End If //조건문 끝

    Next //반복문 끝

    Border = Rhino.AddPolyline(Array(Array(BBox(0)(0)-10, BBox(0)(1)-10, 0), _

    Array(BBox(1)(0)+10, BBox(1)(1)-10, 0), _

    Array(BBox(2)(0)+10, BBox(2)(1)+10, 0), _

    Array(BBox(3)(0)-10, BBox(3)(1)+10, 0), _

  • - 20 -

    Array(BBox(0)(0)-10, BBox(0)(1)-10, 0)))

    //각 점을 계산하여 라이노 안에서 폴리라인을 형성

    Rhino.UnselectAllObjects //모든 오브젝트를 선택하지 않음

    Rhino.SelectObjects brdLines //오브젝트 brdLines를 선택

    Rhino.SelectObject Border //오브젝트 Border를 선택

    Rhino.Command"-_CurveBoolean _DeleteInput=Yes _CombineRegions=No " & _

    //라이노의 명령어 CurveBoolean를 사용하여 겹쳐진 영역을 기준으로 커브를 트림, 분할, 결합

    Rhino.Pt2Str(Array(datSet(index)(0),datSet(index)(1),datSet(index)(2))) & _

    " _Enter", vbFalse

    //3D 포인트로 정해진 점의 집합datSet을 변수로서 사용되도록 바꾸어주는 명령

    VoronoiPolygon = vbTrue //변수VoronoiPolygon을 참으로 설정

    End Function //보로노이 셀을 그리는 함수의 끝

    3.2. 삼차원 보로노이 다이어그램 스크립트(3D Voronoi Diagram Script)

    삼차원 보로노이 다이어그램 형성의 기본개념은 이차원과 유사하지만 좀 더 복잡하

    다. 먼저 각 점들을 선택하고 영역(boundary)을 설정한다. 하나의 점에서 각 점들로의

    직선을 긋고 그 직선의 절반에 해당하는 부분만큼 면을 사출(extrude)시킨다. 이렇게

    점의 개수만큼 생겨난 다각형(polygon)들을 공통부분만을 남겨두면서 자르는 과정

    (trim)을 갖게 된다. 이렇게 하나의 부피를 갖는 보로노이 셀(cell)이 형성되는데 각 점

    마다 이 과정을 갖게 되면 3D 보로노이 다이어그램이 완성된다. 2D 보로노이 다이어그

    램과 동일하게 구체적으로 어떠한 과정을 거치는지 아래에 스크립트와 그 부연설명을

    동시에 서술하였다.

    '3D voronoi diagram start19)

    Option Explicit // 라이노 스크립트를 정의하기 위한 부분

    Dim XX: XX = 0

    19) http://www.smedresmania.com/ (c) Gabe Smedresman, 3d Voronoi AKA Project Cell, 2005

  • - 21 -

    Dim YY: YY = 1

    Dim ZZ: ZZ = 2 // 변수를 정의

    GenerateVoronoiCells

    Sub GenerateVoronoiCells() //main 스크립트 시작

    Randomize

    Dim arrBoundingVolume

    Dim arrPoints

    Dim i,j

    Dim startTime : startTime = Now //변수를 정의

    arrBoundingVolume = Rhino.GetObjects

    ("Select a Bounding Volume",16+8,vbTrue,vbTrue)

    If IsNull(arrBoundingVolume) Then Exit Sub

    HideObjects arrBoundingVolume //보로노이 경계를 만들기 위한 영역설정

    arrPoints = Rhino.GetObjects("Select Cell Points",1,vbFalse,vbFalse)

    ShowObjects arrBoundingVolume

    If IsNull(arrPoints) Then Exit Sub //점들을 인식하기 위한 부분

    Dim strCell, strName

    Rhino.Print "Beginning cell divisions:"

    & UBound(arrPoints)+1 & " cells total."

    For i = 0 To UBound(arrPoints) //한 점에 한 셀들을 만드는 반복 과정 시작

    strCell = GenerateCell(arrPoints(i),arrPoints,arrBoundingVolume)

    //점들로부터 셀을 구하는 함수호출

    Dim value : value = Int(Rnd()*255)

    Rhino.objectColor strCell, RGB(255,255,value)

    strName = "Cell #" & i

    Rhino.objectname strCell, strName //각 셀들의 이름, 색깔 설정

    Dim strTime : strTime = GetTimeDescription(startTime,

    (i+1) * 1.0 / (UBound(arrPoints)+1) )

    Rhino.Print i+1 & " of " & UBound(arrPoints)+1 & " cells ("& Int((i+1)

  • - 22 -

    * 100 / (UBound(arrPoints)+1)) & "%) completed. " & strTime

    //셀을 만듬

    Next //반복구문 끝

    HideObjects arrPoints

    HideObjects arrBoundingVolume //원본 점들과 경계영역을 감춤

    End Sub //main 스크립트 끝

    //아래부터는 main스크립트에서 호출되는 함수들이 정의됨

    Function GenerateCell(centerPoint,arrPoints,arrBoundingVolume)

    //셀을 만들어내기 위한 함수의 시작

    Dim arrBlocks

    arrBlocks = CreateBlocks(centerPoint, arrPoints) //블럭을 만들내는 함수를 호출

    Dim strCell

    strCell = IntersectBlocks(arrBlocks,arrBoundingVolume)

    //겹쳐있는 블럭부분을 만들어내는 함수를 호출

    Dim m: For m = 0 To UBound(arrBlocks)

    If IsPolySurface(arrBlocks(m)) Then DeleteObject(arrBlocks(m))

    Next

    GenerateCell = strCell

    End Function //셀을 만들어내기 위한 함수의 끝

    Function CreateBlocks(centerPoint, arrPoints) //블럭을 만들어내는 함수 시작

    Dim arrBlocks

    ReDim arrBlocks(UBound(arrPoints))

    Dim newPlane

    Dim numBlocks : numBlocks = 0

    Dim i

    Dim midpoint, normal

    Dim greatestdiagonalspread //변수들을 정의

    greatestdiagonalspread = FindGreatestDiagonalSpread(arrPoints)

    //함수 GreatestDiagonalSpread를 호출

    Dim centercoords,pointcoords //변수 정의

  • - 23 -

    centercoords = Rhino.PointCoordinates(centerPoint)

    //center point 각각의 점을 배열에 집어넣는 과정

    For i = 0 To UBound(arrPoints) //반복문 시작 0부터 점의 개수만큼 반복

    If Not centerPoint = arrPoints(i) Then

    //center point와 원래의 점이 같지 않은경우에 아래문장 실행

    pointcoords = Rhino.PointCoordinates(arrPoints(i))

    //원래의 점을 변수pointcoords에 대입

    Dim strPlane //변수 정의

    strPlane = CreateBisectingPlane(centercoords,

    pointcoords, greatestdiagonalspread)

    //CreateBisectingPlane 함수를 호출

    If(Rhino.IsSurface(strPlane)) Then //선택된 오브젝트가 유효한 것이면 배열에 추가를 시킴

    //newPlane이 형성됨

    midpoint = VectorMidpoint(centercoords, pointcoords)

    //VectorMidpoint함수를 호출

    normal = VectorUnitize(VectorSubtract(centercoords, pointcoords))

    //VectorSubtract함수를 호출하여 VectorMidpoint함수에 적용한 값을 호출

    //strPath를 형성

    Dim strPath

    strPath = Rhino.AddLine(midpoint, VectorAdd(midpoint,

    VectorScale(normal, greatestdiagonalspread)))

    //midpoint와 midpoint로부터 확장된 점을 잇는 선을 그려 변수 strPath에 저장

    Dim strExtrusion

    strExtrusion = Rhino.ExtrudeSurface( strPlane, strPath )

    Rhino.objectColor strExtrusion, RGB(128,128,128)

    //변수를 정의하고 strPlane을 기본으로하여 strPath길이만큼 확장한 박스를 만들어 색

    깔을 R:128, G:128, B:128로 만든다

    arrBlocks(numBlocks) = strExtrusion

    numBlocks = numBlocks + 1

    If(Rhino.IsObject(strPath)) Then Rhino.DeleteObject(strPath)

    If(Rhino.IsObject(strPlane)) Then Rhino.DeleteObject(strPlane)

    End If //만약 면이면 strPlane를 삭제하고 if문 끝

    End If //만약 다른 점이라면 strPath를 삭제하고 if문 끝

    Next //반복문 끝

    ReDim Preserve arrBlocks(numBlocks-1)

  • - 24 -

    'Rhino.Print(numBlocks & " blocks created.")

    CreateBlocks = arrBlocks

    //몇 번블럭이 만들어졌다는 것을 출력하고 arrBlocks을 CreateBlocks에 대입

    End Function //블럭을 만들어내는 함수 끝

    Function CreateBisectingPlane(arrPtOne, arrPtTwo, reach)

    //나누어지는 면을 만들어내는 함수 시작

    Dim i

    Dim center //변수정의

    center = VectorMidpoint(arrPtOne, arrPtTwo)

    //VectorMidPoint함수를 호출하여 center에 대입

    Dim p : p = VectorSubtract(arrPtTwo,arrPtOne) : p = VectorUnitize(p)

    //변수 p를 정의하고 함수VectorSubtract와 함수VectorUnitize를 호출하

    여 변수arrPtOne과 변수arrPtTwo의 사이에 있는 라인을 p에 대입

    Dim up : up = Array(0,0,1) //변수 up을 정의하고 좌표 (0,0,1)의 위치를 기억

    Dim r : r = VectorCrossProduct(p,up) :

    If IsVectorZero(r) Then r = Array(0,1,0)

    //변수 r을 정의하고 VectorCrossProduct함수를 호출하여 대입, 만약 r이

    호출된 함수 IsVectorZero를 통한 값과 같다면 r은 좌표 (0,1,0)을 기억

    r = VectorUnitize(r) //함수 VectorUnitize를 호출하여 r에 대입

    Dim s : s = VectorCrossProduct(p,r) : s = VectorUnitize(s)

    //변수 s를 정의하고 함수VectorCrossProduct를 통해 p,r에

    직각으로 찍히는 점을 찾고 그 점을 s에 대입

    Dim arrCorners(3)

    arrCorners(0) = VectorAdd(center,VectorScale(s,reach))

    arrCorners(1) = VectorAdd(center,VectorScale(r,reach * -1))

    arrCorners(2) = VectorAdd(center,VectorScale(s,reach * -1))

    arrCorners(3) = VectorAdd(center,VectorScale(r,reach))

    //arrCorners배열에 4개의 점을 입력

    Dim strPlane

    strPlane = Rhino.AddSrfPt( arrCorners ) //4개의 점을 통해 면을 생성

    CreateBisectingPlane = strPlane //생성된 면 strPlane을 변수 CreateBisectingPlane에 대입

  • - 25 -

    End Function //함수 끝

    Function IntersectBlocks(arrBlocks, arrBoundingVolume)

    //겹쳐지는 블럭을 찾는 함수의 시작

    Dim i

    IntersectBlocks = Null

    i = 0

    Dim results, pendingresults

    Dim strBlock

    Dim group2 //변수들을 정의

    Do //반복문의 시작

    strBlock = arrBlocks(i)

    group2 = Array(strBlock)

    pendingresults = Rhino.BooleanIntersection(arrBoundingVolume

    ,group2,vbFalse)

    //BooleanIntersection명령을 이용하여 겹쳐있는 블럭의 겹친면만을 추출

    i = i + 1

    Loop While Not IsArray(pendingresults) //반복문의 끝

    results = pendingresults //반복문의 결과에서 나온 pendingresults를 resluts에 대입

    Dim j

    For j = i To UBound(arrBlocks) //반복문 시작

    strBlock = arrBlocks(j)

    group2 = Array(strBlock)

    pendingresults = Rhino.BooleanIntersection(results,group2)

    //BooleanIntersection명령을 이용하여 겹쳐있는 블럭의 겹친면만을 추출

    If IsArray(pendingresults) Then results = pendingresults

    Next //반복문 끝

    IntersectBlocks = results(0)

    End Function //함수 끝

    Function FindGreatestDiagonalSpread(arrPoints)//가장 멀리 떨어져있는 점을 찾는 함수 시작

    If(Not IsArray(arrPoints)) Then FindGreatestDiagonalSpread = 0

  • - 26 -

    //만약 점이 선택되지 않으면 변수FindGreatestDiagonalSpread의 값은 0

    Dim max : max = Rhino.PointCoordinates(arrPoints(0))

    Dim min : min = Rhino.PointCoordinates(arrPoints(0))

    Dim i, pt, spread //변수들을 정의

    For i = 0 To UBound(arrPoints) //가장 크고 작은 점을 찾기위한 반복문 시작

    pt = Rhino.PointCoordinates(arrPoints(i))

    If(max(XX) < pt(XX)) Then max(XX) = pt(XX)

    If(max(YY) < pt(YY)) Then max(YY) = pt(YY)

    If(max(ZZ) < pt(ZZ)) Then max(ZZ) = pt(ZZ)

    If(min(XX) > pt(XX)) Then min(XX) = pt(XX)

    If(min(YY) > pt(YY)) Then min(YY) = pt(YY)

    If(min(ZZ) > pt(ZZ)) Then min(ZZ) = pt(ZZ)

    Next //반복문 끝

    FindGreatestDiagonalSpread = VectorLength(VectorSubtract(max,min))

    //함수 VectorSubtract를 호출하여 함수VectorLength에 넣은 결과를

    변수FindGreatestDiagonalSpread에 대입

    End Function //함수 끝

    Function GetTimeDescription(startTime, fractioncomplete)

    //시작시간과 걸린시간을 알려주는 함수 시작

    Dim strDescription

    strDescription = ""

    Dim elapsedseconds : elapsedseconds = DateDiff("s",startTime,Now)

    Dim m,h,s : s = elapsedseconds

    m = Int(s/60) : s = s - m * 60

    h = Int(m/60) : m = m - h * 60 //변수들 정의

    If h = 1 Then strDescription = strDescription & " " & h & " hour"

    If h > 1 Then strDescription = strDescription & " " & h & " hours"

    If m = 1 Then strDescription = strDescription & " " & m & " minute"

    If m > 1 Then strDescription = strDescription & " " & m & " minutes"

    If s = 1 Then strDescription = strDescription & " " & s & " second"

    If s > 1 Then strDescription = strDescription & " " & s & " seconds"

    //1을 넘어갈 때 철자를 복수로 쓰기위한 조건문

    strDescription = strDescription & " elapsed:"

  • - 27 -

    Dim secondstogo : secondstogo =

    elapsedseconds / fractioncomplete * (1-fractioncomplete)

    Dim ETA : ETA = DateAdd("s",secondstogo,Now) //시간을 계산하기 위한 수학식

    If(fractioncomplete < 1) Then //계산된 시간을 문자로 출력하기 위한 조건문

    strDescription = strDescription & " should be finished at "

    & FormatDateTime(ETA,4)

    If(DatePart("d",ETA) = DatePart("d",Now)) Then

    strDescription = strDescription & " today."

    Else

    strDescription = strDescription & " in " & DateDiff("d",Now,ETA) & " day(s)."

    End If

    Else

    strDescription = strDescription & " finished " & Now & "!"

    End If

    GetTimeDescription = strDescription

    End Function //함수 끝

    //아래부터는 Public함수20)가 시작되는 부분

    Public Function VectorCreate(p1, p2)

    //3개의 점으로부터 벡터를 만들어 내기 위한 public 함수 시작

    VectorCreate = Array(p2(0) - p1(0), p2(1) - p1(1), p2(2) - p1(2))

    End Function //public 함수 끝

    Public Function VectorUnitize(v) //3개의 벡터값을 결합하기위한 public 함수시작

    VectorUnitize = Null

    Dim dist, x, y, z, x2, y2, z2 //변수 정의

    x = v(XX) : y = v(YY) : z = v(ZZ)

    x2 = x * x : y2 = y * y : z2 = z * z

    dist = x2 + y2 + z2

    If dist

  • - 28 -

    z = z / dist //각 x,y,z의 제곱의 합을 구하여 원래의 값을 나누는 수학식

    VectorUnitize = Array(x, y, z) //수학식을 거쳐 나온 결과 값을 VectorUnitize에 대입

    End Function //public 함수 끝

    Public Function VectorLength(v) //3D 벡터의 길이를 리턴하는 public 함수 시작

    VectorLength = Null

    Dim dist, x, y, z, x2, y2, z2 //변수 정의

    x = v(XX) : y = v(YY) : z = v(ZZ)

    x2 = x * x : y2 = y * y : z2 = z * z

    dist = x2 + y2 + z2 //각 좌표의 제곱의 합을 구하여 다시 제곱하는 수학식

    VectorLength = Sqr(dist) //수학식을 통해 나온 결과 값을 변수VectorLength에 대입

    End Function

    Public Function VectorDotProduct(v1, v2) //3D 벡터의 길이를 리턴하는 public 함수 시작

    VectorDotProduct = v1(XX) * v2(XX) + v1(YY) * v2(YY) + v1(ZZ) * v2(ZZ)

    //두 점의 각 좌표끼리 곱한 값들의 합을 구하여 변수VectorDotProduct에 대입

    End Function //public 함수 끝

    Public Function VectorCrossProduct(v1, v2)

    //2개의 3D벡터를 가로질러 곱한 값을 리턴하는 Public함수의 시작

    VectorCrossProduct = Null

    Dim x, y, z

    x = v1(YY) * v2(ZZ) - v1(ZZ) * v2(YY)

    y = v1(ZZ) * v2(XX) - v1(XX) * v2(ZZ)

    z = v1(XX) * v2(YY) - v1(YY) * v2(XX) //대각선으로 곱하여 빼는 계산식

    VectorCrossProduct = Array(x, y, z) //계산식에서 나온 값을 변수VectorCrossProduct에 대입

    End Function //public 함수 끝

    Public Function VectorAdd(v1, v2) //두개의 3D벡터를 더하는 public 함수의 시작

    VectorAdd = Null

    VectorAdd = Array(v1(XX) + v2(XX), v1(YY) + v2(YY), v1(ZZ) + v2(ZZ))

    //각 x,y,z축끼리 더하여 변수 VectorAdd에 대입

    End Function //public 함수 끝

    Public Function VectorSubtract(v1, v2) //두개의 3D벡터를 빼는 public 함수의 시작

    VectorSubtract = Null

    VectorSubtract = Array(v1(XX) - v2(XX), v1(YY) - v2(YY), v1(ZZ) - v2(ZZ))

  • - 29 -

    //각 x, y ,z축끼리 빼서 변수 VectorSubtract에 대입

    End Function //public 함수 끝

    Public Function VectorMultiply(v1, v2) //두개의 3D벡터를 곱하는 public 함수의 시작

    VectorMultiply = Null

    VectorMultiply = Array(v1(XX) * v2(XX), v1(YY) * v2(YY), v1(ZZ) * v2(ZZ))

    //각 x,y,z축끼리 곱하여 변수 VectorMultiply에 대입

    End Function //public 함수 끝

    Public Function VectorScale(v, d) //3D벡터의 스케일을 조절하는 public 함수의 시작

    VectorScale = Null

    VectorScale = Array(v(XX) * d, v(YY) * d, v(ZZ) * d)

    //3D벡터의 각 x,y,z값에 변수d를 곱하여 변수VectorScale에 대입

    End Function //public 함수 끝

    Public Function VectorCompare(v1, v2) //두개의 3D벡터를 비교하는 public 함수의 시작

    VectorCompare = vbFalse //변수VectorCompare는 거짓으로 정의

    If v1(XX) = v2(XX) And v1(YY) = v2(YY) And v1(ZZ) = v2(ZZ) Then

    //조건문 : 만약 x,y,z가 각각 같다면

    VectorCompare = vbTrue //변수VectorCompare는 참

    End If //조건문 끝

    End Function //public 함수 끝

    Public Function VectorNegate(v) //3D벡터의 부호를 바꾸는 public 함수의 시작

    VectorNegate = Null //변수VectorNegate는 아무것도 없는 상태

    VectorNegate = Array(-v(XX), -v(YY), -v(ZZ)) //x, y, z에 각각 ‘-’를 붙임

    End Function //public 함수 끝

    Public Function IsVectorTiny(v) //작은 벡터들을 확인하기 위한 public 함수의 시작

    IsVectorTiny = vbFalse //변수 IsVectorTiny는 거짓

    Dim tol : tol = 1.0e-12

    If (Abs(v(XX))

  • - 30 -

    IsVectorZero = vbFalse

    If (v(XX) = 0.0) And (v(YY) = 0.0) And (v(ZZ) = 0.0) Then

    IsVectorZero = vbTrue //각 x, y ,z가 0인지 확인

    End Function //public 함수 끝

    Public Function VectorMidpoint(v1, v2)

    //두개의 3D벡터의 중간값을 계산하는 public 함수의 시작

    VectorMidpoint = Null

    VectorMidpoint = Array((v1(XX) + v2(XX))/2, (v1(YY) + v2(YY))/2,(v1(ZZ) +

    v2(ZZ))/2)

    //두개의 각 x,y,z를 더하여 2로 나눈 값을 계산

    End Function //public 함수 끝

    Public Function VectorSquaredDistance(v1,v2)

    //두개의 3D벡터의 거리를 계산하는 public 함수의 시작

    VectorSquaredDistance = Null

    Dim dist, x, y, z, x2, y2, z2

    x = v1(XX) - v2(XX)

    y = v1(YY) - v2(YY)

    z = v1(ZZ) - v2(ZZ)

    x2 = x * x

    y2 = y * y

    z2 = z * z

    dist = x2 + y2 + z2

    VectorSquaredDistance = dist

    //두 벡터의 각 x, y, z를 빼고 재곱한 후에 더한 값을 변수VectorSquaredDistance에 대입

    End Function //public 함수 끝

  • - 31 -

    3.3. 소 결

    지금까지 보로노이 다이어그램의 수학적 개념으로부터 시작하여 보로노이 다이어그

    램을 적용하기 위해 라이노 스크립트를 구체적로 분석하였다.

    앞에서의 스크립트를 보면 알 수 있겠지만 라이노 스크립트에서는 오픈소스(open

    source)가 있고 오픈되지 않은 소스가 있다. 예를 들면 스크립트에 Rhino.command

    "_mesh" 는 오픈되지 않은 소스로서 사용자에 의한 수정이 불가능하다. 하지만 오픈

    된 소스의 경우에는 Rhino.ObjectColor polyline(4), lngColor 와 같은 형태로 사용

    이 가능하다. 이 명령어는 배열(array)* polyline(4)를 ingColor 색깔로 바꾸라는 명

    령이다.

    오픈되지 않은 소스의 경우에는 사용자가 어떠한 알고리즘(algorism)을 거쳐서 이

    러한 결과가 나오는지 알지 못하고 그냥 명령어를 사용하여서 결과를 만들어낸다는 것

    을 의미한다. 오픈되지 않은 소스의 경우에 사용되는 명령어 사용은 rhino.command

    를 이용하는데 이는 라이노의 인터페이스(interface)에 있는 버튼(button)을 누르는

    것과 같은 형식이다. 알고리즘을 이해하는 측면에서는 오직 라이노 스크립트만을 이용

    하여 프로그래밍하는 것이 바람직하겠지만 명령어를 실행하게 만드는 소스 알고리즘

    (source algorism)자체가 라이노 프로그램의 저작권이기 때문에 본 논문에서는 더 이

    상 언급하지 않겠다. 오픈되어있는 소스와 인터페이스에 그 명령을 알고 사용할 수 있

    음을 통하여 충분히 무엇이나 가능한 형태를 만들어 낼 수 있음은 분명하다.

    이미 외국에서는 라이노 스크립트를 통하여 디자인하는 과정이 많이 응용되고 있다.

    디자이너의 아이디어와 프로그래밍 능력을 통하여 사용자가 변수 값을 집어넣을 때마

    다 다양한 디자인 결과물이 형성되어지는 것이 가능함을 짐작할 수 있다. 이번 장에서

    의 2D와 3D 보로노이 다이어그램 스크립트는 5장에 기본이 되는 스크립트로서 이

    스크립트를 변형시켜 디자인 스터디(Design study)를 진행하도록 한다.

    *배열(array) : 프로그램 언어(C, C++, Java)등에서 하나의 변수 안에 다양한 정보를 넣기 위해 사용되는 일

    종의 주소 개념

  • - 32 -

    4. Morphological Design by Script

    4.1. 포인팅(Pointing)기법을 이용한 이차원 보로노이 다이어그램의 형성과정

    하나의 평면 안에 보로노이 다이어그램을 적용하는데 있어서는 세 가지 고려해야할

    사항 있다. 첫째로 보로노이 알고리즘을 알고 그 소스를 라이노에 적용할 수 있어야 하

    는데, 그 부분은 바로 전장에서 해결하였다. 두 번째로 점들을 찍는 방법 즉, 포인팅

    (Pointing)에 관한 것이다. 포인팅기법에 따라 디자인 방법이 달라지고, 결과물이 달라

    지기 때문이다. 세 번째로 고려해야 할 것은 포인팅에 의한 보로노이 다이어그램 형성

    이후 이를 어떻게 응용할 것인가이다.

    이번 장에서는 각 포인팅기법에 따른 보로노이 다이어그램의 형성을 체계적으로 분석

    하고, 디자인 방법론으로 적용 가능성을 알아보기로 한다.

  • - 33 -

    4.1.1. 점들의 분포(Points distribution)

    보로노이 다이어그램의 특성상 점들의 위치에 따라 보로노이 다이어그램의 결과물이

    달라지는데 이를 체계적으로 분석하기 위하여 몇 가지 조건을 설정하였다. 먼저 동일한

    점의 개수가운데 점의 분포에 따른 보로노이 다이어그램을 살펴보고자 한다. 점의 개수

    는 정방형 영역 안에 포인팅에 따른 보로노이 다이어그램의 특징이 나타나도록 기본을

    36개로 설정하였고, 어떠한 경우에는 좀 더 많은 점을 찍어 특징을 살펴보도록 하였다.

    점의 분포는 동일한 거리에 떨어져 있는 점의 상태에서 시작하여 조금씩 변화시켜가는

    선의 형태를 띠는 점의 분포에서 곡선, 원, 나선의 형태까지 변화시켜보았다. 그리고 점

    의 분포를 라이노 프로그램 안에서 무작위(random)로도 선택하게 하여서 결과물을 도

    출해 내었다. 점들이 선적인 요소들로 배치되어 있을 때 보로노이 다이어그램의 특징은

    보통 육면체의 형태로 디자인되어 벌집모양과 유사함을 알 수 있다. 곡선의 형태는 설

    정한 곡선에 점들이 위치하면서 보로노이 다이어그램 안에서도 그러한 선의 흔적이 남

    아있음을 알 수 있다. 원의 형태에서도 마찬가지로 보로노이 다이어그램에 원의 흔적이

    남아있으며 방향성을 갖고 있음을 알 수 있다. 나선형의 경우에는 그러한 흔적이 아주

    뚜렷이 들어나 중심을 향해 소용돌이 치고 있다. 무작위 선택에 의한 보로노이 다이어

    그램은 크고 작은 보로노이 영역들이 방향성 없이 분포되어 있으며 어떠한 부분은 점들

    이 조밀하고 어떤 부분은 넓은 간격을 유지하여서 점의 밀도에 따른 보로노이 다이어그

    램의 특징을 잘 보여주고 있다.

    점의 분포에 따른 보로노이 다이어그램을 그리는 것 뿐 아니라 내부에 보로노이 영역

    에 맞는 곡률을 갖는 곡선(curve)을 삽입하여 보로노이 다이어그램의 특징을 좀 더 살

    펴보고자 하였다. 곡선의 반지름에 따라 결과물이 달라지기 때문에 반지름을 3, 11로

    설정하여 두 가지 경우를 살펴보았다. 이러한 점의 분포와 내부에 곡선을 삽입하는 결

    과들을 다음에서 보여주고 있는데 이는 보로노이 다이어그램이 조건에 따라 다양한 형

    태로 나타나고 있음을 알 수 있다.

  • - 34 -

    [그림16] 선에 의한 이차원 보로노이 다이어그램

  • - 35 -

    [그림17] 곡선에 의한 이차원 보로노이 다이어그램

  • - 36 -

    [그림18] 원에 의한 이차원 보로노이 다이어그램

    [그림19] 나선형에 의한 이차원 보로노이 다이어그램

  • - 37 -

    [그림20] 불규칙적인 점에 의한 이차원 보로노이 다이어그램

    4.1.2. 이차원 보로노이 다이어그램 맵핑(2D Voronoi Diagram Mapping)

    이차원 보로노이 다이어그램을 통하여 나타나는 결과물은 일정하지는 않지만 어느 정

    도 유추가 가능한 형태라고 할 수 있다. 이러한 보로노이 다이어그램의 결과를 디자인

    에 적용 가능하도록 하기 위해 맵핑(Mapping)이라는 방법을 사용한다. 평면자체에서는

    한계가 있기 때문에 이를 삼차원으로 끌고 오는 방법으로 평면을 여러 방법으로 변형시

    킨 상태에 이차원 보로노이 다이어그램을 적용하는 것이다. 이는 어떠한 형태이든 이차

    원 보로노이 다이어그램이 적용될 수 있음을 의미한다. 이러한 결과를 바탕으로 구조를

    어떻게 형성하고 그 구조에 스킨이 어떠한 형태로 이루어지는가에 따라서 다양한 디자

    인의 가능성이 존재한다.

    그러면 어떠한 방법으로 평면을 변형시키는가에 대한 방법으로서 이차원 보로노이 다

    이어그램의 확장해 갈 수 있음을 보여주기 위해 본 논문에서는 평면1개일 때와 2개일

    때의 경우를 살펴본다. 또한 비선형적인 형태 즉, 변형(warp)된 평면에 적용할 수 있음

    을 확인하고 마지막으로 기하학형태 중 원(hole)의 경우를 살펴보도록 한다. 이는 이차

    원 보로노이 다이어그램이 어떠한 경우에도 적용됨을 보여주는 예가 될 것이다. [그림

    21]은 설명한데로 1개의 평면(1plate), 2개의 평면(2plate), 변형된 평면(warp), 원

    (hole)의 경우를 간략히 표현한 것이다.

    [그림21] Voronoi Diagram Mapping의 예

  • - 38 -

    4.1.2.1. 1plate를 이용한 보로노이 다이어그램 적용

    - 보로노이 월(Voronoi wall)

    평면자체가 보로노이 다이어그램으로 이루어져 하나의 벽을 형성할 수 있다. 먼저

    점을 디자인이 유추 가능한 형태로 찍어나간다. 이후에 라이노 스크립트를 통하여

    보로노이 다이어그램을 형성하고 내부에 곡선(curve)을 만들어 하나의 완성된 2D

    를 만들어 낸다. 좀 더 디자인을 발전시키기 위하여 보로노이 다이어그램이 형성된

    선들을 사출(extrude)하고 곡선과 연결하여 면을 형성한다. 이렇게 형성되어진 형

    태는 기능을 갖는 다양한 건축요소로 사용되어질 수 있다. [그림 22]는 보로노이 월

    의 디자인 프로세스를 보여주고 있다.

    [그림22] 1 plate의 예 : Voronoi wall

  • - 39 -

    [그림23] 가오슝 아트센터 전경

    [그림24] 가오슝아트센터의

    보로노이 다이어그램1)

    - 국립 가오슝 퍼포밍 아트센터(National Kaohsiung Performing Arts Center)

    자하 하디드(Zaha hadid)는 타이완

    에 아트센터를 디자인하는데 있어서 보

    로노이 다이어그램을 사용하였다. [그림

    24]와 같이 평면상에서 보로노이 다이

    어그램을 사용하였는데 이는 개방된 녹

    지를 연계시키고 동시에 부지 내로 대중

    의 진입을 조절하기 위하여 사용하였다.

    보로노이 알고리즘은 주어진 점 분포에

    기초하여 볼록한 영역을 가까이 묶는다.

    이 패턴은 자연에서 일어나는 많은 자기

    구성 과정과 유사하며 강한 유기적 결속

    감을 준다. 자하 하디드는 보로노이 계

    산법과 그 결과로 나온 패턴을 구성디자

    인으로 사용하여 지역의 귀한 나무, 역

    사적 건물, 대지경계의 양도를 평가함에

    있어 현재 상태를 존중하고 건물과 주변

    공원 간의 강한유대감을 만들고자 하였

    다.21)

    이것은 이 장에서 설명하고 있는

    하나의 평면상에서 보로노이 다이어그

    램이 적용되는 것과 같다.

    이 프로젝트에서 특징적인 것은 주변 컨텍스트(Context)를 위해 보로노이 다이어

    그램을 사용하였고, 이후에 디자인 결과물 또한 보로노이 다이어그램을 반영하여 파

    사드(Facade) 및 다양한 부분에서 그것이 드러나는 것이다.

    건물 자체의 전체적인 형태는 짜여진 경관에서 벗어나 상부에서 합쳐져 아래 광장

    에 그늘을 만드는 캐노피(Canopy)를 형성한다. 건물을 구성하는 보로노이 형태의

    결합체에 근거하여 넙스(Nurbs : 3D 프로그램인 Max에서 곡선을 지원하는 기능)

    표현기하학으로 이 형태를 만들어 냄으로서 보로노이 패턴은 파사드시스템의 모든

    21) 정광영, Digital diagram architecture+interior, archiworld, 2007

  • - 40 -

    요소에 표현된다. 지면부터 지붕, 통풍시스템까지의 요소들에 있는 넙스 표면의 UV

    기하학에서 추출된 구조체제를 중심으로 만들어진 구조/유리 파사드 시스템은 모두

    보로노이 다이어그램을 반영한다.22)

    [그림25] 가오슝아트센터 보로노이 다이어그램 프로세스23)

    4.1.2.2. 2plate를 이용한 보로노이 다이어그램 적용

    - C-Wall

    C-Wall은 건축설계사무소 MATSYS가 작업하였던 프로젝트의 이름으로 앞에서

    는 하나의 면으로 하나의 벽체를 형성하였지만 C-Wall은 두께를 가진 솔리드

    (Solid) 벽체에 보로노이 다이어그램을 적용시킴으로 두 개의 보로노이 면을 결합시

    킨 것과 같이 하나의 벽체가 된다. 프로세스를 살펴보면, 수많은 보로노이 프로젝트

    22) 정광영, Digital diagram architecture+interior, archiworld, 2007

    23) 정광영, Digital diagram architecture+interior, archiworld, 2007

  • - 41 -

    의 결과로 대규모 3차원 보로노이 세포구조 원형이 만들어진다. 이러한 결과를 바탕

    으로 벽체를 형성하게 된 매스 모델(mass model)에 보로노이 결과물을 적용시킨

    다. 이렇게 이루어진 C-Wall 삼차원 모델링(3D modeling)을 실제 스케일(scale)

    로 구축하였는데, C-Wall 은 얇은 종이로 만들어져 거의 무게가 나가지 않으면서도

    하중에 대한 강도가 매우 높다. 설계자는 약 500개의 단일 세포들로 구성되어있는

    벽의 양감을 표현하고 원하는 세포의 농도를 표현하기 위해 이미지를 칠하였다. 세

    포의 크기를 다양화함으로써 벽은 빛과 그림자라는 흥미로운 형태를 만들어낸다.

    [그림26] 2plate의 예 : C-Wall 24)

    24) architectural design studio : MATSYS, C-Wall project, 2006

    (http://www.materialsystems.org/?page_id=229)

  • - 42 -

    - Plate House

    이번 디자인의 제목은 Plate House라고 칭하였는데, 그 이유는 두 개의 보로노이

    다이어그램이 바닥과 슬래브를 이루어 하나의 매스로서 사용될 수 있는 가능성을 알

    아보기 위해서이다.

    Plate House의 디자인 프로세스는 지금까지와는 조금 다른 방법으로 진행되었는

    데 보로노이 다이어그램의 형성에 선적인 요소의 도입과 점의 밀도에 따른 디자인

    결과의 차이점을 알아보고자 하였다.

    먼저 [그림 27]의 첫 번째 그림처럼 일반적인 보로노이 다이어그램이 초록색 선

    으로 나타난다면 이러한 초록색 선을 크게 잡아줄 수 있는 주황색 선이 도입되어 디

    자인을 전체적으로 비례가 있도록 만들었다. 그 이후 생성된 보로노이 셀들 안에 곡

    선을 집어넣어 스킨을 형성하도록 하였는데 점의 개수대로(point=80) 스킨을 형성

    한 경우와 몇 개의 큰 영역(point=35)으로 보로노이 다이어그램을 해석하여 적용한

    경우로 나누어 보았다.

    보로노이 다이어그램을 크게 해석한 경우를 가지고 면을 형성하여 스킨을 만들었

    고, 이 두면으로 바닥과 슬래브를 만든 후에 내부에 구조를 세워 나갔다. 내부에 구

    조 또한 보로노이 다이어그램의 형태를 따르도록 하였다. 이는 전체적으로 보로노이

    다이어그램 자체가 구조가 되어 구축할 수 있는 가능성을 보여주는 것이다.

  • - 43 -

    [그림27] Plate House(2 plate) Process

    [그림28] Plate House max shot

  • - 44 -

    4.1.2.3 변형을 이용한 보로노이 다이어그램 적용

    - 보로노이 파사드(Voronoi Facade)

    이번 실험의 명칭은 보로노이 파사드라고 칭하였는데, Mapping의 방법으로서 하

    나의 이차원 보로노이 다이어그램(2D Voronoi Diagram)이 자유로운 변형을 통하

    여 건물의 입면을 감싸가는 방법이다. 앞의 1plate와 2plate의 경우에는 보로노이

    다이어그램이 삼차원으로 확장되어가긴 하였지만 이차원적 형태를 그대로 갖고 있

    었다. 이번 장에서는 좀 더 입체적으로 디자인 가능성을 알아보고자 한다.

    프로세스를 살펴보면, 처음에 포인트를 찍고 보로노이 셀을 만든 뒤 몇몇의 커브

    를 생성한다. 생성된 보로노이 다이어그램을 사출(extrude)하고 사출된 면을 변형

    시켜 건물입면을 감싼다. 지금까지는 기존의 맵핑(Mapping)방법과 동일하지만 여

    기서부터 변형의 방법으로서 사출되는 높이를 다르게 하였는데, 이를 통해 아래에서

    부터 보로노이 다이어그램이 감싸 올라가는 형태를 띠게 된다. 이것은 좀 더 입체적

    인 형태로 보로노이 다이어그램이 다양하게 적용될 수 있는 가능성을 보여주고 있

    다. [그림30]의 결과물을 보면 사출되는 높이, 변형을 통한 보로노이 파사드의 건물

    로부터 간격 등을 다양하게 함으로서 건물 입면에 입체감을 형성하고 있다.

    게다가 이러한 형태는 단순한 형태에 그치는 것이 아니라 건물의 하중을 감당하는

    구조로서 사용될 수 있으며, 하나의 보로노이 셀에 스킨이 붙는 방법에 따라 빛의 양

    을 조절하는 등의 기능적인 측면이 부가될 수 있다.

  • - 45 -

    [그림29] Voronoi Facade Process

    [그림30] Voronoi Facade max shot

  • - 46 -

    [그림31] Voronoi Hole process

    4.1.2.4. 원을 이용한 보로노이 다이어그램 적용

    - 보로노이 홀(Voronoi hole)

    마지막으로 맵핑(Mapping)을 반원통의

    형태로 디자인한다. 먼저 라이노 스크립트

    를 통하여 보로노이 다이어그램을 형성시

    킨다. 이후 3D 맥스(Max) 프로그램으로

    생성된 보로노이 다이어그램을 불러오고

    사출(extrude)시킨다. 형태를 변형하기

    위하여 FFD Box명령어를 통하여 주황색

    으로 생긴 반원통의 형태의 FFD Box를

    만든다. 사출된 보로노이 다이어그램을 이

    주황색의 형태에 적용시키면 Voronoi

    hole이 만들어 진다. 맥스 프로그램의

    FFD Box명령어는 프로그램 안에 있는

    어떠한 오브젝트를 변형시키기에 적합한

    명령어이다. 적용시키기 위해서는 FFD

    Box를 만들고 그것의 조절점(Control

    Point)을 조절하여 모양을 만든 뒤 오브

    젝트(object)를 그것에 적용하면 그러한

    모양으로 변형되게 된다. 맥스 프로그램의

    FFD Box명령어를 통하여 다양한 형태로

    보로노이 다이어그램을 여러 형태로 적용

    할 수 있음을 알 수 있다. 본 장에서는 3D

    맥스를 사용하였는데 맥스뿐만 아니라

    3D 프로그램들을 사용하여 보로노이 다

    이어그램을 적용할 수 있는 가능성은 무

    한하다.

  • - 47 -

    [그림32]를 보면 보로노이 홀의 결과물이 나와 있는데, 이것은 스킨을 붙이지 않

    은 순수한 보로노이 다이어그램 자체를 변형시킨 것으로 이 자체가 구조이면서 디자

    인이 될 수 있음을 보여주고 있다.

    [그림32] Voronoi Hole max shot

  • - 48 -

    4.2. 삼차원 보로노이 다이어그램(3D Voronoi Diagram)

    4.2.1. 점들의 분포(Points Distribution)

    이차원 보로노이 다이어그램과 마찬가지로 삼차원 보로노이 다이어그램에서 중요한

    디자인 요소 중 하나는 점이 어디에 찍히는가하는 포인팅(Pointing)이다. 이차원 보로

    노이 다이어그램에서는 직선의 경우에서 곡선의 경우 그리고 무작위로 찍히는 경우를

    살펴보았듯이 삼차원에서도 동일한 과정을 거쳐 삼차원에서의 보로노이 다이어그램 특

    징이 알아보도록 한다.

    먼저 동일한 점의 개수를 정하고 정육면체 영역(boundary)안에 포인팅에 따른 보로

    노이 다이어그램의 특징 알아보도록 하였다. 점은 정육면체 안에 균등히 들어가기 위해

    36개로 설정하였고, 나선(Spiral)으로 올라가는 포인팅의 경우에는 영역을 정육면체가

    아닌 것으로 설정하였는데 이는 점의 분포에 맞도록 적용하기 위함이다.

    [그림33]을 보면 점의 분포는 동일한 거리에 떨어져 있는 점의 상태에서 시작하여 조

    금씩 변화시켜가도록 하였다. 먼저 선의 형태를 띠는 점의 분포인 직선(Straight), 대각

    선(Diagonal), 접힌 선(Curved), 접히고 올라간 선(Curved up)을 보고, 원의 형태인

    원(Round), 나선(Spiral), 안에서부터 올라가다가 밖으로 나오면서 다시 내려가는 형

    태를 띠는 나선(Spiral)을 실험한 뒤 마지막으로 점이 랜덤(Random)인 경우까지 알아

    보았다.

    또한 삼차원 보로노이 다이어그램의 결과물들의 특징을 좀 더 잘 보여주기 위하여 보

    로노이 다이어그램의 외부 면들을 제외하고 랜더링(Rendering)한 것과 외부 면들을 이

    차원 보로노이 다이어그램과 같이 곡선(Curve)의 형태로 삽입하여 랜더링한 것을 동시

    에 보여주었다. 이러한 결과를 [그림33]에 정리하였다.

  • - 49 -

    [그림33] 3D Voronoi Diagram examples

  • - 50 -

    4.2.2. 삼차원 보로노이 다이어그램 적용

    삼차원 보로노이의 경우에는 점의 좌표가 3개로 찍히기 때문에 이차원의 경우보다 더

    욱 복잡해진 다양한 결과가 나온다. 하지만 이차원의 경우에는 평면을 삼차원으로 가지

    고 오는 방법에 따라서 다양한 결과가 나오지만 삼차원의 경우에는 공간에 이미 그 형

    태가 결정되어서 나오는 것이 다르다고 볼 수 있다. 이러한 삼차원 보로노이 다이어그

    램을 디자인 하는 방법을 가져오기 위해서는 점의 개수, 점을 찍는 범위를 먼저 사용자

    가 결정하고 그 결과로 나온 보로노이 셀을 어떻게 디자인으로 끌고 오느냐가 중요한

    변수이다. 이번 장�