C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[41537] Re:Re:CAD 프로그램처럼 Line 이나 Arc 를 그리고 싶은데.. 조언부탁드립니다.
최범호 [choi105] 972 읽음    2005-08-19 09:40
유영인님 감사합니다. 일단 관련 자료를 좀 더 검토해 봐야 할 것 같습니다.

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 같은 건 없나요?

+ -

관련 글 리스트
41477 CAD 프로그램처럼 Line 이나 Arc 를 그리고 싶은데.. 조언부탁드립니다. 최범호 961 2005/08/16
41480     Re:CAD 프로그램처럼 Line 이나 Arc 를 그리고 싶은데.. 조언부탁드립니다. 유영인 Cuperido 1089 2005/08/16
41537         Re:Re:CAD 프로그램처럼 Line 이나 Arc 를 그리고 싶은데.. 조언부탁드립니다. 최범호 972 2005/08/19
41538             Re:Re:Re:CAD 프로그램처럼 Line 이나 Arc 를 그리고 싶은데.. 조언부탁드립니다. 유영인 Cuperido 1118 2005/08/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.