기본 콘텐츠로 건너뛰기

10월, 2006의 게시물 표시

[공유] simple polygon 만들기

helloktk의 블로그 | 드라곤 원문 https://blog.naver.com/helloktk/80028346861 기하 알고리즘을 특히 폴리곤알고리즘을 테스트하기 위해서는 폴리곤 데이터를 만들어야 한다. 여기서 2차원의 점들을 이용하여 간단히 simple polygon을 만드는 방법을 살펴본다. 단순폴리곤을 만들기 위해서는 점들을 정렬을 해야한다. 각각의 점들을 X축에 프로젝션을 시키면 x축에 대해서 정렬이 된다(같은 x값인경우에는 의 크기대로 정렬). 따라서 x값으로 정렬된 점들을 쭉 이어나가면 하나늬 폴리라인(poly-line)을 만들 수 있다. 그러나 원하는 폴리곤은 아니다. 이를 해결하기위해서는 점들을 직선으로 두부분으로 나누고, 직선의 윗부분은 x값이 큰순서대로 정렬을 하고, 아래 부분은 x값이 작은 순서대로 정열을 하면 폴리라인이 아닌 폴리곤을 얻을 수 있다. 직선은 어떻게 잡을까? 이것은 가장작은 x값을 갖는 점과 가장 큰 x값을 같는 점을 잇는 직선을 생각하면 편리하다. int CCW(CPoint A, CPoint B, CPoint C) { C -= B; //점B에서 C로 향하는 선분의 왼편인가, 아니면 오른편인가; A -= B; return C.x*A.y-C.y*A.x; } int comp(const void*A, const void *B) {//x->y의 크기순서대로 정렬용; int a=((POINT *)A)->x - ((POINT *)B)->x ; if(a>0) return 1 ; else if(a<0) return -1; a=((POINT *)A)->y - ((POINT *)B)->y ; if(a>0) return 1; else if(a<0) return -1; return 0; } void MakeSimplePolygon(POINT P[], i

곡선의 변형

곡선의 변형 B-spline곡선의 변형은 아래의 조작으로 가능하다. ● 매듭 벡터의 변경 ● basis함수의 차수 변경 ● 제어점의 위치 변경 ● 중복된 제어점 사용 ● 중복된 매듭 값 사용 우리는 basis함수의 값을 계산해내는 과정을 알아보았다. 인자로 넘겨준 $u$가 속하는 매듭 구간도 구했고 거기서부터 차수를 $0$에서부터 $p$까지 증가시키면서 basis함수도 구했다. 제어점의 이동 제어점의 이동은 B-spline곡선의 모양을 변형하는 한 방법이 된다. 제어점 $P_k$을 이동시키면 B-spline곡선 $C(u)$중 매듭 구간 $[U_k,U_{k+1})$에 속하는 부분만 변형이 된다. (나머지 구간에서의 B-spline곡선은 0이 되기 때문에 이동에 의한 변형은 생기지 않는다.) 조금 더 자세히 살펴보자면 제어점이 이동되어지는 벡터의 방향으로 곡선이 변형이 된다. $P_k$가 새로운 위치 $P_{k+v}$로 이동되었다면, 이 된다. 기존의 곡선에서 $N_k,p(u)v$만큼 이동된다는 것을 알 수 있다. 하지만 여기서 $u$가 매듭 구간 $[U_k,U_{k+1})$에 속하지 않는다면 곡선의 변형은 없을 것이다.

UI 만들기

PDMS에서는 UI를 만드는데 별도의 툴을 제공하지 않습니다. 그래서 수고스럽지만 일일이 손으로 코딩을 해가며 작성을 해야만 합니다. 다음 버전에는 UI 작성 툴이 제공하기를 기대해 봅니다. 1. *.pmlfrm 이라는 파일로 UI 작성 setup form !!test path down para .parPIPENOMDIA text 'Pipe Size: ($NOM_DIA_UNITS$)' option .optPIPENOMDIA '' width 10 para .parSPPTYPE text 'Support Type : VT1' option .optSPPTYPE '' width 10 para .parE text 'Item No. : A/B/C' option .optE '' width 10 para .parL text 'Length Code : A/B/C/D/E/F/G/H/J/K/L/M/N' option .optL '' width 10 para .parB text 'Length Code "B": A/B/C' option .optB '' width 10 exit 2. pml rehash all 3. pml reload form !!이름     -> UI를 메모리에 올리는 작업     -> 파일 내용이 수정될때 마다 이 작업을 해주어야 합니다. 4. show !!이름

숫자의 포멧 변환

이가을에 동유.. | 롤롤 http://blog.naver.com/lollol1246/100010946141 1000000 -> 1,000,000식으로 변환해주는 함수 GetNumberFormat The GetNumberFormat function formats a number string as a number string customized for a specified locale. int GetNumberFormat( LCID Locale, // locale for which string is to be formatted DWORD dwFlags, // bit flag that controls the function's operation LPCTSTR lpValue, // pointer to input number string CONST NUMBERFMT *lpFormat, // pointer to a formatting information structure LPTSTR lpNumberStr, // pointer to output buffer int cchNumber // size of output buffer ); static NUMBERFMT nFmt = { 0, 0, 3, ",", ".", 0 }; CString CMainFrame::GetNumberFormatFileSize(int nFileSize) { TCHAR szVal[32]; TCHAR szOut[32]; CString strReturn = _T(""); wsprintf ( szVal,"%d",nFileSize/1000 ); GetNumberFormat ( NULL, NULL, szVal, &n

3D 모델링 상의 한 점과 2D 도면(뷰)과의 상호 변환

 우선 3D 모델링 상의 한 점에서 2D 도면(뷰)으로의 변환을 살펴봅시다.  일반적으로 3D 모델링을 바라보는 방향에 따라서 TOP , BOTTOM , LEFT , RIGHT , FRONT , BACK 이렇게 6개의 뷰를 생성할 수 있습니다. 아래는 각각의 뷰 변환행렬입니다. $$\begin{eqnarray}\text{Bottom View} &=&  \begin{bmatrix}1&0&0\\0&-1&0\\0&0&1\end{bmatrix} \\ \text{Top View} &=&  \begin{bmatrix}1&0&0\\0&1&0\\0&0&1\end{bmatrix} \\ \text{Right View} &=&  \begin{bmatrix}1&0&0\\0&0&1\\1&0&0\end{bmatrix} \\ \text{Left View} &=&  \begin{bmatrix}0&-1&0\\0&0&1\\-1&0&0\end{bmatrix} \end{eqnarray}$$ 그리고 3D 모델링에 스케일과 회전을 적용한 후에 3D 모델의 중점을 도면의 중점에 맞추면 도면으로의 변환이 완성됩니다. 변환할 점에서 모델의 중점을 뺀다.(모델의 중점을 (0 , 0 , 0)좌표로 두는 효과) $tmp=pt-\text{model center pt}$ 뷰 변환 행렬을 통해 2D로 변환시킨다. $tmp^\text{'}= \begin{bmatrix}a_{11}&a_{12}&a_{13}\\a_{21}&a_{22}&a_{23}\\a_{31}&a_{32}&a_{33}\end{bmatrix}*tmp$ 변환된 2D 좌표를 뷰 회전 각도로 회전시킨다. $tmp^\text{'&