|
어짜피, 원이라는 자체가 점의 조합이니,
Curve를 잘개 쪼개서 Line으로 표현하는 것도 방법일듯 합니다.
참고적으로 3D 게임에서 잘 쓰이는 기법중에, B-Spline 과, Catt-Mull
(이건 철자가 맞는지 확실히는 모르겠습니다) 이라는 것이 있습니다.
B-Spline은, 정해진 점을 꼭 지나진 않지만, 보기 좋도록 Arc 을 그려
준다는 것과, Catt-Mull 곡선은 정해준 점을 꼭 지나치도록 선을
곡선으로 이쁘게 그려준다는 것이 있습니다.
점 4개를 정해주면, 선을 그리고, 새로운 Arc 중심점이 나타나면
그쪽으로 이어주면 부드럽게 이어져서 그려주게 됩니다.
또한, 단순 2D 라면, 점 3개를 기준으로 잡고, 그 점 3개를 지나는 해의
3차곡선의 집합을 그려주면, Arc로 표현될 수 있을 것 같습니다.
cuperido
최범호 님이 쓰신 글 :
: 유영인님 감사합니다. 일단 관련 자료를 좀 더 검토해 봐야 할 것 같습니다.
:
: GDI 를 통한 Arc 표현시 생각보다 Line 이 깔끔하지 않더군요. 그래서 자문을 구해보니
:
: Curve 를 잘개 쪼개서 Line 으로 표현하고 해당 형상은 Struct 에 저장해 놓는게 좋다고 하더군요.
:
: 아무튼 답변 주셔서 감사합니다.
:
:
: 유영인 Cuperido 님이 쓰신 글 :
: : "무수히 많은.." 이 정확히 몇개를 지칭하는지 몰라 약간 애매하네요. ^^;
: : 왠만큼 많은 선, 원, 점 들이라면 TPaintBox로도 가능합니다.
: : Graphic32는 써보지 않아서 잘 모르겠지만, 하드웨어 가속을 받지 않는
: : 이상 TPaintBox와 비슷한 성능을 가질 것 같네요.
: :
: : 하드웨어 가속을 받으시려면, OpenGL 이나 DirectX를 사용하시는 것도
: : 좋으시겠습니다.
: :
: : Dimemsion check 는 뭔지 모르겠고요, Zoom up & down (돋보기) 에 관한
: : 예제를 아래 함께 첨부해 드립니다.
: :
: :
: : cuperido
: :
: :
: : //---------------------------------------------------------------------------
: :
: : #include <vcl.h>
: : #pragma hdrstop
: :
: : #include "Unit_Magnifying.h"
: : #include "Unit_Main.h"
: : #include "Unit_Task.h"
: : //---------------------------------------------------------------------------
: : #pragma package(smart_init)
: : #pragma resource "*.dfm"
: :
: : TMagnifying *Magnifying;
: :
: : //---------------------------------------------------------------------------
: :
: : __fastcall TMagnifying::TMagnifying(TComponent* Owner) : TForm(Owner)
: : {
: : }
: :
: : //---------------------------------------------------------------------------
: :
: : void __fastcall TMagnifying::FormCreate(TObject *Sender)
: : {
: :
: : // Bitmap 생성
: : MAGNIFYING = new Graphics::TBitmap();
: : ZOOMVALUE = 2;
: :
: : CURSOR_GAB_X = DEFAULT_CURSOR_GAB_X;
: : CURSOR_GAB_Y = DEFAULT_CURSOR_GAB_Y;
: :
: : DoubleBuffered = true;
: :
: : SetWindowSize();
: :
: : }
: :
: : //---------------------------------------------------------------------------
: :
: : void __fastcall TMagnifying::SetWindowSize()
: : {
: :
: : MAGNIFYING->Width = _imMagnifying->Width / ZOOMVALUE;
: : MAGNIFYING->Height = _imMagnifying->Height / ZOOMVALUE;
: :
: : }
: :
: : //---------------------------------------------------------------------------
: :
: : void __fastcall TMagnifying::FormDestroy(TObject *Sender)
: : {
: :
: : delete MAGNIFYING;
: :
: : }
: :
: : //---------------------------------------------------------------------------
: :
: : void __fastcall TMagnifying::_tiTickTimer(TObject *Sender)
: : {
: :
: : tagPOINT tpPosition;
: : HWND itDC;
: : int itSourceX, itSourceY, itWinX, itWinY, itWindowPosition;
: : int itSwapSpace; // 좌표가 바뀌면 연산을 한번 더 함
: : int itMagnifyX, itMagnifyY;
: : TCursor tcCursor;
: :
: :
: : GetCursorPos(&tpPosition);
: :
: : if(PREVIOUS_X != tpPosition.x || PREVIOUS_Y != tpPosition.y) {
: : PREVIOUS_X = tpPosition.x;
: : PREVIOUS_Y = tpPosition.y;
: :
: :
: :
: : itWinX = PREVIOUS_X + MAGNIFYING_INTERVAL;
: : itWinY = PREVIOUS_Y + MAGNIFYING_INTERVAL;
: : itSwapSpace = 0;
: :
: : if(itWinX + Magnifying->Width > Screen->Width)
: : itWinX = PREVIOUS_X - Magnifying->Width - MAGNIFYING_INTERVAL;
: : if(itWinY + Magnifying->Height + Task->Height + 10 > Screen->Height) {
: : itWinY = PREVIOUS_Y - Magnifying->Height - MAGNIFYING_INTERVAL;
: : // 윈도우가 더이상 내려가지 않게 하는 위치에서, 윈도우 위치가 마우스
: : // 커서 위치로 인하여 바뀌게 되면, 연산을 바뀐 위치만큼 더 해주어야 한다
: : itSwapSpace = MAGNIFYING->Height;
: : }
: :
: :
: : if(itWinX < MAGNIFYING->Width) itWinX = MAGNIFYING->Width;
: : if(itWinY < MAGNIFYING->Height) itWinY = MAGNIFYING->Height;
: : if(itWinY > Screen->Height - Task->Height - Magnifying->Height - itSwapSpace)
: : itWinY = Screen->Height - Task->Height - Magnifying->Height - itSwapSpace;
: :
: : Magnifying->Left = itWinX;
: : Magnifying->Top = itWinY;
: :
: :
: : // 화면을 캡쳐한 후 Zoom 시킴
: : itSourceX = PREVIOUS_X - (_imMagnifying->Width / 2 / ZOOMVALUE);
: : itSourceY = PREVIOUS_Y - (_imMagnifying->Height / 2 / ZOOMVALUE);
: :
: : if(itSourceX < 0) itSourceX = 0;
: : if(itSourceY < 0) itSourceY = 0;
: : if(itSourceX + MAGNIFYING->Width > Screen->Width) itSourceX = Screen->Width - MAGNIFYING->Width;
: : if(itSourceY + MAGNIFYING->Height > Screen->Height) itSourceY = Screen->Height - MAGNIFYING->Height;
: :
: :
: : itMagnifyX = ((PREVIOUS_X - itSourceX) * ZOOMVALUE) + _imMagnifying->Left;
: : itMagnifyY = ((PREVIOUS_Y - itSourceY) * ZOOMVALUE) + _imMagnifying->Top;
: :
: : itDC = GetDC(0);
: : BitBlt(MAGNIFYING->Canvas->Handle, 0, 0,
: : MAGNIFYING->Width, MAGNIFYING->Height, itDC,
: : itSourceX, itSourceY,
: : SRCCOPY);
: : ReleaseDC(0, itDC);
: :
: : _imMagnifying->Picture->Bitmap->Assign(MAGNIFYING);
: :
: :
: : _imMagnifying->Picture->Bitmap->Canvas->Draw(
: : (itMagnifyX / ZOOMVALUE - 15) + CURSOR_GAB_X,
: : (itMagnifyY / ZOOMVALUE - 15) + CURSOR_GAB_Y,
: : _imCursor->Picture->Graphic
: : );
: :
: : }
: :
: : }
: :
: : //---------------------------------------------------------------------------
: :
: :
: : 최범호 님이 쓰신 글 :
: : : 무수히 많은 Point, Line, Curve Data 를 Panel 을 통해 그리고 싶습니다.
: : :
: : : OpenGL, GDI+, Graphic32 이런 컴포넌트(?) 를 이용하여서 표현하고 싶은데
: : :
: : : 이중에서 가장 적합한 것은 무엇일까요. ? 2D 전용이기 때문에 GDI+, Graphic32 가
: : :
: : : 더 적합할 것 같은데 너무 망막하기만 하네요.
: : :
: : : 단순히 Drawing 하는것 외에 Dimemsion check 와 Zoom up & down 도 구현해야 되는데..
: : :
: : : 어디 적합한 Sample 같은 건 없나요?
|