이 글은 같이 일하는 동료의 이해를 돕기 위해 작성하였습니다.
주어진 직육면체(PipeWay)를 $N$등분 하였을때 각 Cell을 나타내는 자료구조를 만들어 보도록 하겠습니다.
Cell은 4개의 Section으로 이루어져 있습니다. Section의 순서에 주의하세요.
앞 Cell의 3번째 Section을 현재 Cell의 첫번째 Cell로 사용합니다.
그리고 Section은 4개의 정점으로 이루어지고 Section을 공유하는 Cell의 정보를 가지고 있습니다.
이런 형식의 자료를 만들때 자료의 중첩을 피하는 것이 중요합니다.
Cell과 Cell 사이에 하나의 Section을 만들어 공유하는 것이 좋습니다.
PipeWay가 $N$개의 Cell들로 이루어져 있다면 총 $(N + 1)*4$개의 정점이 존재합니다.
그리고 Section 구성하는 정점의 순서를 아래와 같이 구성합니다.
그러면 Cell($K$번째)을 구성하는 Section과 정점의 구성은 아래와 같이 됩니다.
이제 코드로 Cell정보를 만들어 보도록 하겠습니다.
- class Section:
- def __init__(pt1, pt2, pt3, pt4):
- self._pts = []
- self._pts.append(pt1)
- self._pts.append(pt2)
- self._pts.append(pt3)
- self._pts.append(pt4)
- self._ref_cells = []
- def add_ref(self, cell):
- """공유 cell을 추가한다"""
- self._ref_cells.append(cell)
- class Cell:
- def __init__(section1, section2, section3, section4): # 생성자
- self._sections = []
- self._sections.append(section1)
- self._sections.append(section2)
- self._sections.append(section3)
- self._sections.append(section4)
- # 공유 Cell 정보를 설정
- section1.add_ref(self)
- section2.add_ref(self)
- section3.add_ref(self)
- section4.add_ref(self)
- self._adjacent_cells = []
- @property
- def sections(self):
- return self._sections
- def add_adjacent(self, cell):
- """인접한 cell을 추가한다"""
- self._adjacent_cells.append(cell)
- class PipeWay:
- def __init__(self):
- self._cells = []
- def build(self):
- pts = []
- # (N+1)*4개의 정점을 구합니다.
- for k in range(N):
- if k == 0:
- section1 = Section(pts[k*4], pts[k*4 + 1], pts[k*4 + 2] , pts[k*4 + 3])
- else:
- section1 = self._cells[k-1].sections[3] # 공유할 section을 이전 cell에서 가져옴
- section2 = Section(pts[k*4], pts[(k+1)*4], pts[(k+1)*4 + 3] , pts[k*4 + 3])
- section3 = Section(pts[(k+1)*4], pts[(k+1)*4 + 1], pts[(k+1)*4 + 2] , pts[(k+1)*4 + 3])
- section4 = Section(pts[(k+1)*4 + 1], pts[k*4 + 1], pts[k*4 + 2] , pts[(k+1)*4 + 2])
- cell = Cell(section1, section2, section3, section4)
- self._cells.append(cell)
- # 인접한 cell 정보 설정
- if k > 0:
- self._cells[k-1].add_adjacent(self._cells[k])
- self._cells[k].add_adjacent(self._cells[k-1])
- @property
- def cells(self):
- return self._cells
댓글
댓글 쓰기