기본 콘텐츠로 건너뛰기

라벨이 OrientedRangeBox인 게시물 표시

[S3D] OrientedRangeBox Intersects 함수 오류

 S3D에서 두 객체가 연결되어 있는지 여부를 확인하기 위해 객체의 OrientedRangeBox를 구한 뒤 Intersects 함수를 사용하였습니다. S3D API에서 제공하는 Intersects 함수의 설명은 아래와 같습니다. // // 요약: // Determines whether two oriented boxes intersect or not. // // 매개 변수: // oRangeBox2: // OrientedRangeBox object. // // 반환 값: // RangeBoxIntersectionType = 0: inside, 1: outside, 2: overlapping. // // 예외: // T:System.ArgumentNullException: // oRangeBox2 cannot be null. public RangeBoxIntersectionType Intersects ( OrientedRangeBox oRangeBox2 ) ; 대상인 OrientedRangeBox가 내부(0), 외부(1) 그리고 겹쳐지는지(2) 리턴합니다. 작업을 끝마친 뒤 결과를 확인하는데 결과가 이상한 부분을 확인하였습니다. Intersects 함수에서 사선으로 기다란 볼륨에 붉게 마크친 부분의 영역이 Outside라고 리턴하는 것이었습니다. ISO 뷰 실제 코드는 아래와 같습니다. OrientedRangeBox source = new OrientedRangeBox ( new Position ( 1487.1449000000002 , 1333.987 , 18.389 ) , new Vector ( 0 , 10.021999999999952 , 0 ) , new Vector ( 198.35219999999984 , 0 , 0 ) , new Vector ( 0 , 0 , 5.2151600000000045 ) ) ;   OrientedRangeBox...

[S3D] Structure 부재의 OrientedRangeBox 구하기

 앞서 CableWay, CableTray의 OrientedRangeBox를 구했습니다. 이번에는 Structure 부재의 OrientedRangeBox를 구하도록 하겠습니다. Structure 부재에는 Column, Beam, Girder, Brace가 있습니다. 선택한 부재의 BussinessObject의 CutLength 속성은 부재의 길이, $Origin$은 부재의 시작점을 의미합니다. 그리고 XAxis, YAxis, ZAxis는 부재가 놓인 방향을 의미합니니다. XAxis는 길이 방향, YAxis는 너비 방향, ZAxis는 깊이 방향을 의미합니다. BussinessObject가 가지고 있는 CrossSection 속성에는 부재 단면의 정보가 있습니다. CrossSection은 다시 부재의 Width, Depth와 Cardinal Point 정보를 가지고 있습니다. Cardinal Point는 아래와 같이 정의됩니다. Cardinal Point가 지정하는 위치가 $Origin$의 위치가 됩니다. OrientedRangeBox를 정의하기 위해서는 $Origin\prime,\text{ }\overrightarrow{Width},\text{  }\overrightarrow{Depth},\text{ }\overrightarrow{Direction}$ 정보가 필요합니다. $$\begin{eqnarray} \overrightarrow{Direction} &=&\overrightarrow{XAxis}*CutLength \\ \overrightarrow{Width}&=&\overrightarrow{YAxis}*Width \\ \overrightarrow{Depth}&=&\overrightarrow{ZAxis}*Depth \end{eqnarray}$$ 이 됩니다. 방향 벡터는 모두 정해졌으니 $Origin\prime$만 구하면 됩니다. OrientedRangeBox의 $Origin\prime$은 부재의 $Ori...

[S3D] CableWay, CableTray의 OrientedRangeBox 구하기

 S3D의 객체에는 RangeBox라는 객체의 크기를 가지는 속성이 있습니다. RangeBox는 글로벌 좌표계에서 Min, Max 좌표를 가지고 있습니다. 객체가 $X$축,$Y$축 또는 $Z$축에 놓여있을 때는 RangeBox와 실제 크기가 일치하겠지만, 그 외의 경우에는 RangeBox의 크기가 실제 크기보다 큽니다. 따라서 모든 경우에 객체 크기에 정확히 일치하는 크기를 구할때 RangeBox는 부적합합니다. 심지어 $X$축,$Y$축 또는 $Z$축에 놓여있을 때에도 RangeBox가 실제 크기보다 조금 더 큽니다. 모든 경우에 객체의 실제 크기와 같은 RangeBox를 구하기 위해서는 OrientedRangeBox를 구해야 합니다. 왜 S3D에서 객체의 속성으로 OrientedRangeBox를 제공하지 않는지 모르겠습니다. OrientedRangeBox는 아래와 같은 구조를 가지고 있습니다. Cable Way/Cable Tray 객체는 Start, End, 코너의 8개점, Length, Width, Depth 정보를 가지있습니다. 8개의 코너 점은 실제 형상보다 큰 지점을 가리키고 있고 Start, End는 실제 형상의 단면의 중점입니다. 코너의 8개의 점들은 객체를 이루는 두 단면의 4개씩의 점들로 이루어진다고 생각합니다. 제가 디자인했다면 이렇게 했을겁니다. 아무도 뒤죽박죽 점들의 순서를 정하지 않았을겁니다. 그렇지 않다면 제 손에 장을 지지겠습니다. 이제 이 8개의 점들로 객체의 Width, Depth 벡터를 구하면 OrientedRangeBox의 3 벡터를 결정할 수 있습니다.  $\overrightarrow{P_1-P_0}$과 $\overrightarrow{P_3-P_0}$ 중에서 객체의 $\overrightarrow{Width},\overrightarrow{Depth}$를 선택해야 합니다. 객체의 Width ,Depth 크기를 알고 있으니 $\overrightarrow{P_1-P_0}$와 $\overrightarrow{P_3-P_...

[S3D] 프로젝트 분투기

 발등에 불이 떨어졌습니다. 현재 진행 중인 2월 중간 보고에 고객사 부사장님이 참석한다고 합니다. 이미 2개의 프로젝트가 절뚝거리며 진행하고 있기 때문에 지금 프로젝트는 제대로 해야합니다. 네트워크 망 구성과 최단 거리 찾기(Dijkstra 기반) 알고리즘에 대한 코드를 정리한 후에 김** 차장과 결과를 확인하기로 했습니다. 이렇게 From, To Cable Way를 선택한 후에 버튼을 눌러 결과가 나오기를 기다렸습니다. 1분가량의 시간이 흘렀습니다. 드디어 프로그램에서 From에서 To로 가는 4,128개의 경로를 찾았습니다. 우리가 생각하지도 못한 길을 찾다니 하고 감탄하고 있을때가 아닙니다. 무려 4,128개의 경로라니요, 눈으로 보기에는 고작 대여섯개의 경로만 보이는데 말입니다. 우리의 예측과 실제 결과가 다를때에는 그 원인을 찾아야 합니다. 고단하고 손가락 아프고 눈이 시린 디버깅의 시작입니다. 반드시 4,128개 경로들의 차이점을 찾아야 합니다. 어... Cable Way를 구성하는 Feature의 RangeBox가 실제 형상보다 크게 잡히는 것을 확인했습니다. 실제 형상과 동일한 RangeBox를 예상하고 있었는데 우리의 예상이 빗나갔습니다. RangeBox 우리의 잘못이 아닙니다. 지랄맞은 S3D입니다. Insulation, Maintenance, Operation Aspect 때문일까봐 켜보고 다시 확인해봤지만 결과는 변함이 없습니다. 밤은 늦었지만 어쩔수 없이 김** 차장에게 전화해 물어봤지만 뾰족한 방안은 없습니다. 모든 주어진 데이타와 대학교 1학년때까지 쌓은 수학적 지식을 총동원하여(사실 중학교때까지의 지식만으로도 충분했습니다.) 형상에 딱 맞는 RangeBox(실제는 OrientedRangeBox)를 구했습니다. Cable Way Feature 형상에 딱 맞는 OrientedRangeBox 구하는 방법은 다음 글에서 이야기하도록 하겠습니다. 밤 9시가 넘어가고 있습니다. 집중력이 떨어지고 있습니다. 나이들어 야근은 무리라는 걸...