기본 콘텐츠로 건너뛰기

12월, 2010의 게시물 표시

선분과 직선과의 거리

선분(S-E)와 점 P와의 거리를 구해보도록 합시다. 우선 두개의 벡터를 구할수 있습니다. $$ \begin{aligned} V_1 &= \overrightarrow{P-S} \\ V_2 &= \overrightarrow{E-S} \\ \vec{V_1}\cdot\vec{V_2} &= |\vec{V_2}||\vec{V_1}|cos(\theta) =|\vec{V_2}||\vec{V_2}|U \\ U &= \frac{\vec{V_1}\cdot\vec{V_2}}{|\vec{V_2}||\vec{V_2}|} \end{aligned} $$ 위 식을 통해서 U값을 구할수 있습니다. 일단 U를 구했으면, U를 통하여 $V_2$와 수직을 이루는 벡터 $\overrightarrow{P-C}$의 C 값을 구할 수 있습니다. $$ C = S + U*\overrightarrow{E-S} $$ 마지막으로 C를 구했으니 $C-P$간의 거리가 선분과 점의 거리가 됩니다. double CIsLine2d::DistanceTo(const CIsPoint2d &pt) const { const double mag = Length(); if(0.f != mag) { double u = ((pt.x() - m_start.x())*(m_end.x() - m_start.x()) + (pt.y() - m_start.y())*(m_end.y() - m_start.y())) / (mag*mag); double xp= m_start.x() + u*(m_end.x() - m_start.x()); double yp= m_start.y() + u*(m_end.y() - m_start.y()); const double dx = xp - pt.x(); const double dy = yp - pt.y(); return sqr

How to pick object?

앞에서는 영역을 잡아서 object를 선택하는 것에 대해서 알아 봤는데, 이번에는 click하여 object를 선택하는 것에 대해서 알아보겠습니다. 아래와 같이 Select함수를 사용하게 되는데요 1 Standard_EXPORT AIS_StatusOfPick Select( const  Standard_Boolean updateviewer  =  Standard_True) ; cs 인자로 click한 좌표를 넘겨주지 않습니다. 그럼 어떻게 object를 선택할까요?(좌표없이 말이죠...) 이 함수는 highlight된 object를 선택하는 함수입니다. 따라서 이 Select 함수를 호출하기 전에 선택할 object가 highlight되어있어야 합니다. highlight는 마우스가 움직일때 MoveTo 함수를 통해서 쉽게 할수가 있습니다. 그림을 보시면 마우스 커서 밑의 원이 highlight된것을 볼수가 있습니다. 형상들을 선택한 후 color dialog에서 변경할 색상을 선택한 후에 선택한 형상의 색상을 변경합니다. 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 Quantity_Color CSFColor ; COLORREF MSColor ;        m_hAISContext - > Select(); m_hAISContext - > InitSelected(); if  (m_hAISContext - > MoreSelected()) {     m_hAISContext - > InitCurrent();     Handle_AIS_InteractiveObject Current  =  m_hAISContext - > Current() ;      if  ( Current - > HasColor () )     {        CSFC

선택한 형상의 색상 변경하기

영역으로 형상을 선택하고 선택한 형상의 색상을 변경하는 방법을 알아보도록 하겠습니다. 간단히 그림과 코드로 살펴보겠습니다. 형상들을 선택한 후 color dialog에서 변경할 색상을 선택한 후에 선택한 형상의 색상을 변경합니다. void CLibMesh2dTestCaseDoc :: InputEvent ( const Standard_Integer cXmin , const Standard_Integer cYmin , const Standard_Integer cXmax , const Standard_Integer cYmax , const Handle ( V3d_View ) & aView ) { Quantity_Color CSFColor ; COLORREF MSColor ; m_hAISContext - > Select ( cXmin , cYmin , cXmax , cYmax , aView ) ; m_hAISContext - > InitSelected ( ) ; if ( m_hAISContext - > MoreSelected ( ) ) { m_hAISContext - > InitCurrent ( ) ; Handle_AIS_InteractiveObject Current = m_hAISContext - > Current ( ) ; if ( Current - > HasColor ( ) ) { CSFColor = m_hAISContext - > Color ( Current ) ; MSColor = RGB ( CSFColor . Red ( ) * 255 . , CSFColor . Green ( ) * 255 . , CSFColor . Blue ( ) * 255 . ) ; } else { MSColor

Radio Button 동기화

이번에 라디오 버튼 동기화에 대해서 알아보도록 하겠습니다. 아래 그림과 같이 두 개의 라디오 버튼을 생성한 후에 라디오 버튼을 그룹으로 묶어 준다면 List Id를 동일하게 주어야 합니다. 그리고 각각 그 값들을 0에서 부터 설정해 주면 됩니다. 두 개의 라디오 버튼의 List Id는 동일하게 설정했구요, Value는 다르게 설정했습니다. 아래의 Arg 값이 뭘 의미하는지는 잘 모르겠어요^^

Colorbar 표현하기

일반적으로 contour를 표현하는 프로그램을 보면 오른쪽 상단에 레벨별로 색상을 표현한 colorbar를 볼수가 있습니다. 이를 한번 구현해 보았습니다. 일단 Layer를 하나 만들고 그 위에 colorbar를 표기하도록 하였습니다. 신경쓰였던 부분은 윈도우의 크기가 변경될때 어떻게 colorbar의 크기를 일정하게 유지하는냐 하는 것이었습니다. 이렇게 해서 제가 원하는 colorbar를 표현하는데 성공했습니다.!!! 코드는 아래에... 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 glPushAttrib (GL_LIST_BIT);  charbuf[ 20 ]  =  { '\0' ,};  Quantity_Color color( 1. 0 ,  1. 0 ,  0. 0 , Quantity_TOC_RGB);  aToppestLayer - > SetColor(color);    //! pixel 단위의 colorbar의 min,max를 구한다. double  minx  =  right  -  (right  -  left) * 70 / w;  double  maxx  =  right  -  (right  -  left) * 50 / w;  double  maxy  =  top  -  (top  -  bottom) * 20 / h;  double  miny  =  top  -  (top  -  bottom) * 300 / h;    const  doubledStep  =  (maxy  -  miny)  /   7. 0 ;  for (inti  =   0 ;i  <   7 ; + + i)  {      glBegin( GL_QUADS );      glNormal3f(  0. f,  0. f,  1. f);      glColor3f(          ( float )(( 255 -  i *

Gradient Background 표현하기

OpenCASCADE 6.5.0이상에서는 단 한줄의 코드로 Gradient Background color를 설정할 수 있습니다. 관련 링크 --------------------------------------------------------------------------------- 원문은 아래에서 확인하실 수 있습니다. http://sondra.egloos.com/5446008 MFC를 사용한다면 OnSize Mehtod에 원문의 코드를 넣으면 됩니다. 원문에 있는 코드를 사용해보니 윈도우의 크기가 변경될 때마다 gradient 색상이 조금씩 차이가 나는걸 발견하였습니다. 그 이유를 수소문해보니(?) 윈도우의 크기에 따라 opengl의 직교 좌표계의 범위를 OCC가 계산하여 설정하는 것을 알았습니다. 즉 우리가 layer에서 SetOrtho 함수를 사용하여 좌표계의 범위를 주어도 OCC에서 그댈 사용하지 않고 다시 계산하여 최종적으로 그 값을 사용하는 것입니다. 다행히 OCC에서 소스를 제공하니 소스에서 좌표계를 계산하는 루틴을 알수가 있습니다. 그 값을 적용하여 gradient를 그려주면 윈도우의 크기가 변경될때 마다 색상 차이가 나는 것을 방지할 수 있습니다.  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 if (aBackgroundLayer.IsNull())  {      Standard_Boolean aSizeDependant  =  Standard_True;  //each window to have particular mapped layer?     aBackgroundLayer  =  newVisual3d_Layer(m_hView - > Viewer() - > Viewer(),      Aspect_TOL_UNDERLAY, aSi

주요 배치파일 작성 명령어

dusttin's Notes | dusttin http://dusttin.blog.me/10715315 배치파일 작성 명령어 9인방 배 치 파일은 파일 안에 기록되어 있는 명령의 순서대로 실행됩니다.가장 대표적인 것이 부팅에 이용되며, 컴퓨터의 루트 디렉토리에 위치하고 있는 Autoexec.bat 파일입니다. 그런데 만약 배치 파일의 실행의 순서를 순차적이 아닌멀티부팅용 Autoexec.bat 처럼 사용자 마음대로 정하고 싶다면 배치파일에 제공되는배치명령어의 용도를 알고 있어야 합니다. 1. CALL 현재 실행중인 배치 파일을 종료하지 않고 필요한 다른 배치파일을 호출하여 실행한 다음 원래의 배치파일로 다시 돌아오려고 할 때 사용됩니다. ◇ 사용법 : Call [drive:]\[경로]\<배치파일명>[.BAT] ◇ 예 : Call c:\bats\sample.bat 어떤 배치 파일을 실행하는 도중에 경로 C:\bats 에 있는 sample.bat 파일을 실행한 다음 다시 원래의 배치파일로 돌아옵니다. 2. CHOICE 배치 프로그램 내에서 사용자의 선택을 묻기 위해 사용됩니다. 배치 파일 제작자가 설정한 물음을 출력하면서 지정된 키 입력을 기다립니다. 이 명령은 배치파일 내에서만 사용 가능합니다. ◇ 사용법 :choice [/C[:]문자열][/N][/S][/T[:]기본키,대기시간][메세지] ◇ 옵션 - /C[:]문자열 : 사용자가 선택할 수 있는 키목록을 [] 괄호 내에 ', ' 로 구분하여 출력하고 /C 스위치를 사용하지 않으면 기본적으로 YN이 사용됩니다. - /N : 프롬프트를 출력하지 않도록 합니다. - /S : 사용자의 입력에서 소문자, 대문자를 구분하도록 합니다. - /T[:]기