Microsoft PowerPoint - 04-Lines.pptx

Similar documents
Microsoft PowerPoint - 09-Object Oriented Programming-3.pptx

Microsoft PowerPoint - 03-Points.pptx

Microsoft PowerPoint - 06-Pointer and Memory.pptx

Microsoft PowerPoint - 07-Data Manipulation.pptx

Microsoft PowerPoint - 12-Custom Classes.pptx

Microsoft PowerPoint - 06-Body Data Class.pptx

Microsoft PowerPoint - 02-GUI Basics.pptx

Chapter #01 Subject

PowerPoint Template

Microsoft PowerPoint D View Class.pptx

Structure and Interpretation of Computer Programs: Assignment 3 Seung-Hoon Na October 4, George (아래 3개의 문제에 대한 구현이 모두 포함된 george.rkt파일을 제출하시오.

PowerPoint 프레젠테이션

Microsoft PowerPoint - 02-Class Review.pptx

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

K&R2 Reference Manual 번역본

Javascript

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

KNK_C_05_Pointers_Arrays_structures_summary_v02

鍮뚮┰硫붾돱??李⑤낯

01-OOPConcepts(2).PDF

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

170

006- 5¿ùc03ÖÁ¾T300çÃâ

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

그래픽 프로그래밍

02장.배열과 클래스

var answer = confirm(" 확인이나취소를누르세요."); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write(" 확인을눌렀습니다."); else { document.write(" 취소를눌렀습니다.");

C 언어 프로그래밊 과제 풀이

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

1장. 유닉스 시스템 프로그래밍 개요

금오공대 컴퓨터공학전공 강의자료

untitled

게임 기획서 표준양식 연구보고서

Week3

C 프로그래밊 개요

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

PowerPoint 프레젠테이션

UI TASK & KEY EVENT

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

C++-¿Ïº®Çؼ³10Àå

쉽게 풀어쓴 C 프로그래밍

untitled

Microsoft PowerPoint - ch07 - 포인터 pm0415

쉽게 풀어쓴 C 프로그래밍

C++ Programming

슬라이드 1

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

HTML5

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - chap12-고급기능.pptx

Microsoft PowerPoint - chap10-함수의활용.pptx

PowerPoint 프레젠테이션

히스토그램구하기 사전준비 : 히스토그램을저장할메모리가필요함 필요한메모리개수 à 전체영상의픽셀은그값이 0 ~ 255이므로 256 개의메모리필요함 영상을구성하는픽셀의개수는매우크므로메모리형식은 unsigned long으로해야함 ( unsigned 란 +/- 를고려하지않는다는

chap8.PDF

chap10.PDF

04-sa01-91.hwp

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint 다변수 방정식과 함수(1).ppt

Microsoft PowerPoint - 05-chap03-ArrayAndPointer.ppt

윈도우시스템프로그래밍

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

슬라이드 1

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

슬라이드 1

1

8. 클래스 D는클래스 A, 클래스 B, 클래스 C로부터상속받아맊들고싶다. 아래빈칸을채우시오. ( 대소문자주의하시오 ) class D { ; Student s; 11. 다음프로그램의실행결과는? 9. 다음프로그램의실행결과는? class A{ A(){cout << " 생성

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

PowerPoint Presentation

HTML5

untitled

03_queue

PowerPoint Template

PowerPoint Presentation

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

ThisJava ..

UI TASK & KEY EVENT

윈도우시스템프로그래밍

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

PowerPoint Template


PowerPoint 프레젠테이션

슬라이드 1

歯Lecture2.PDF

C# Programming Guide - Types

Microsoft PowerPoint - additional01.ppt [호환 모드]

PowerSHAPE 따라하기 Calculate 버튼을 클릭한다. Close 버튼을 눌러 미러 릴리프 페이지를 닫는다. D 화면을 보기 위하여 F 키를 누른다. - 모델이 다음과 같이 보이게 될 것이다. 열매 만들기 Shape Editor를 이용하여 열매를 만들어 보도록

09-interface.key

Microsoft PowerPoint - Chapter 6.ppt

PowerPoint 프레젠테이션

확률 및 분포

별지제 호서식 연구결과보고서 과제명 소속소방산업기술연구소연구책임자권성필 연구기간 연구목표 연구배경

11장 포인터

歯처리.PDF

Transcription:

Development of Fashion CAD System 4. Lines Sungmin Kim SEOUL NATIONAL UNIVERSITY Lines Topics Line 정의 및 화면 표시 여러 개의 점을 선택해서 선을 정의 연결된 여러 개의 직선 또는 하나의 곡선을 정의 곡선의 표시 Bezier Curve 사용하기 각종 요소의 표시하기/숨기기 사용자와의 상호작용 마우스를 써서 선과 점을 동시에 선택하기 선의 속성 설정하기 굵기, 색상, 모양 등 선과 점을 선택해서 새로운 점을 만들기 2

Line Definition 선정의하기 여러개의점을선택해서선을만들기 ChildForm 에다음메뉴를추가 연결된직선 (Polyline) 또는 Bezier Curve 를정의 3 선정의하기 Bezier Curve 역사 1962 년프랑스르노자동차의 Piere Bezier 가발표 오래전부터알려진 Bernstein polynomial 을곡선제도에응용 장점 계산이간단하여구현이쉽다 단점 곡선이조정점을지나지않음 조정점을하나만변경해도전체곡선의형상이변화됨 Line Definition 4

Line Definition 선정의하기 변수선언 TChildForm.h 에 Line 을정의하는데필요한변수를정의한다 int ptpoint PointNum; Point[1000]; int LineNum; // 선의갯수 int LinePointNum[100]; // 선의점갯수 (2, 3, 4, ) int LinePoint[100][100]; // 점의번호 5 Line Definition 선정의하기 변수선언 Struct 를써서다시정의하기 struct ptline int PointNum; int Point[4]; ; int ptline LineNum; Line[100]; TChildForm.cpp 에서변수값초기화 fastcall TChildForm::TChildForm(TComponent* Owner,AnsiString C) : TForm(Owner) PointNum=0; LineNum=0; 6

Line Definition 선정의하기 Polyline 메뉴핸들러작성 void fastcall TChildForm::Polyline1Click(TObject *Sender) if (SelPointNum<2) Application->MessageBox("Select more than two points","caution",mb_iconexclamation MB_OK); return; for(i=0;i<selpointnum-1;i++) Line[LineNum].PointNum=2; Line[LineNum].Point[0]=SelPoint[i]; Line[LineNum].Point[1]=SelPoint[i+1]; LineNum++; 7 Line Definition 선정의하기 Bezier Curve 메뉴핸들러작성 void fastcall TChildForm::BezierCurve1Click(TObject *Sender) if (SelPointNum!=4) Application->MessageBox("Select four points","caution",mb_iconexclamation MB_OK); return; Line[LineNum].PointNum=4; for(i=0;i<4;i++) Line[LineNum].Point[i]=SelPoint[i]; LineNum++; 8

Line Drawing 선표시하기 ChildForm 의 OnPaint 이벤트핸들러수정 직선그리기 void fastcall TChildForm::FormPaint(TObject *Sender) for(i=0;i<pointnum;i++) P=Screen(Point[i].x,Point[i].y); Canvas->Ellipse(P.x-3,P.y-3,P.x+3,P.y+3); for(i=0;i<linenum;i++) if (Line[i].PointNum==2) // straight line P=Screen(Point[Line[i].Point[0]].x,Point[Line[i].Point[0]].y); Canvas->MoveTo(P.x,P.y); P=Screen(Point[Line[i].Point[1]].x,Point[Line[i].Point[1]].y); Canvas->LineTo(P.x,P.y); else Canvas->Pen->Color=clRed; 9 Line Drawing 선표시하기 ChildForm 의 OnPaint 이벤트핸들러수정 곡선그리기 Hull 도함께표시 else TPoint pt[4]; int j; Canvas->Pen->Color=clLime; for(j=0;j<4;j++) P=Screen(Point[Line[i].Point[j]].x,Point[Line[i].Point[j]].y); pt[j].x=(int)p.x; pt[j].y=(int)p.y; if (!j) Canvas->MoveTo(P.x,P.y); else Canvas->LineTo(P.x,P.y); Canvas->Pen->Color=clBlack; Canvas->PolyBezier(pt,3); 10

Line Drawing 선표시하기 결과비교 Polyline Bezier Curve 11 Line Drawing 선표시하기 각종요소의보이기 / 숨기기 ChildForm 에다음메뉴를추가하고변수정의를추가 TChildForm.h int ViewPoint,ViewHull TChildForm.cpp ViewPoint=ViewHull=1; 12

Line Drawing 선표시하기 각종요소의보이기 / 숨기기 Toggle 메뉴의이벤트핸들러작성 void fastcall TChildForm::TogglePoint1Click(TObject *Sender) ViewPoint=1-ViewPoint; void fastcall TChildForm::ToggleHull1Click(TObject *Sender) ViewHull=1-ViewHull; 13 Line Drawing 선표시하기 각종요소의보이기 / 숨기기 OnPaint 이벤트핸들러수정 if (ViewPoint==1) for(i=0;i<pointnum;i++) P=Screen(Point[i].x,Point[i].y); Canvas->Ellipse(P.x-3,P.y-3,P.x+3,P.y+3); for(i=0;i<linenum;i++) if (Line[i].PointNum==2) // straight line else for(j=0;j<4;j++) if (ViewHull==1) if (!j) Canvas->MoveTo(P.x,P.y); else Canvas->LineTo(P.x,P.y); 14

Issue 점과선을섞어서선택할수있어야함 클릭한위치에서가까운개체를선택 선택한점 / 선목록을일관되게관리 Struct를써서 selection 을재정의 struct ptselection int Type; // 0 point, 1 line int Num; ; int ptselection SelNum; Sel[100]; 15 점선택관련소스수정 SelPoint 로되어있는부분을일단수정한다 fastcall TChildForm::TChildForm(TComponent* Owner,AnsiString C) : TForm(Owner) SelNum=0; void fastcall TChildForm::FormPaint(TObject *Sender) for(i=0;i<selnum;i++) if (Sel[i].Type==0) P=Screen(Point[Sel[i].Num].x,Point[Sel[i].Num].y); Canvas->Ellipse(P.x-5,P.y-5,P.x+5,P.y+5); 16

점선택관련소스수정 void fastcall TChildForm::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) if (!DragStart) if (Shift.Contains(ssCtrl)) int p=findpoint(x,y); if (!Shift.Contains(ssShift)) SelNum=0; if (p!=-1) Sel[SelNum].Type=0; Sel[SelNum].Num=p; SelNum++;. 17 점선택관련소스수정 void fastcall TChildForm::MovePoint1Click(TObject *Sender) if (SelNum==0) return; PointXYDialog->ShowModal(); if (PointXYDialog->Result==1) float x=pointxydialog->x->text.todouble(); float y=pointxydialog->y->text.todouble(); for(i=0;i<selnum;i++) if (Sel[i].Type==0) Point[PointNum].x=Point[Sel[i].Num].x+x; Point[PointNum].y=Point[Sel[i].Num].y+y; PointNum++; 18

점선택관련소스수정 void fastcall TChildForm::AddDividePoint1Click(TObject *Sender) if (SelNum!=2 Sel[0].Type!=0 Sel[1].Type!=0) Application->MessageBox("Select two points","caution",mb_iconexclamation MB_OK); return; DividePointDialog->ShowModal(); if (DividePointDialog->Result) float m=dividepointdialog->m->text.todouble(); float n=dividepointdialog->n->text.todouble(); Point[PointNum].x=(m*Point[Sel[1].Num].x+n*Point[Sel[0].Num].x)/(m+n); Point[PointNum].y=(m*Point[Sel[1].Num].y+n*Point[Sel[0].Num].y)/(m+n); PointNum++; 19 점선택관련소스수정 void fastcall TChildForm::Polyline1Click(TObject *Sender) for(i=0;i<selnum;i++) if (Sel[i].Type!=0) Application->MessageBox("Select points only","caution",mb_iconexclamation MB_OK); return; if (SelNum<2) Application->MessageBox("Select more than two points","caution",mb_iconexclamation MB_OK); return; for(i=0;i<selnum-1;i++) Line[LineNum].PointNum=2; Line[LineNum].Point[0]=Sel[i].Num; Line[LineNum].Point[1]=Sel[i+1].Num; LineNum++; 20

점선택관련소스수정 void fastcall TChildForm::BezierCurve1Click(TObject *Sender) for(i=0;i<selnum;i++) if (Sel[i].Type!=0) Application->MessageBox("Select points only","caution",mb_iconexclamation MB_OK); return; if (SelNum!=4) Application->MessageBox("Select four points","caution",mb_iconexclamation MB_OK); return; Line[LineNum].PointNum=4; for(i=0;i<4;i++) Line[LineNum].Point[i]=Sel[i].Num; LineNum++; 21 Mouse 클릭시점과선을구분 점과선중더가까이있는개체를선택하도록 Mouse click event handler 를수정 void fastcall TChildForm::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) if (!DragStart) if (Shift.Contains(ssCtrl)) int o=findobject(x,y); if (!Shift.Contains(ssShift)) SelNum=0; if (o!=-1) Sel[SelNum].Type=ObjectType; Sel[SelNum].Num=o; SelNum++; else TChildForm.h 수정 int fastcall FindObject(int x,int y); int ObjectType; 22

Mouse 클릭시점과선을구분 FindObject 함수를구현 가까운거리에점이있다면그걸선택한다 int fastcall TChildForm::FindObject(int x,int y) int i,mino=-1; float d,mind=10; // find point : for(i=0;i<pointnum;i++) ptpoint P=Screen(Point[i].x,Point[i].y); d=sqrt((p.x-x)*(p.x-x)+(p.y-y)*(p.y-y)); if (d<mind) MinD=d; MinO=i; ObjectType=0; if (MinD<5) return MinO; // find line : 23 선을선택하는방법 클릭한지점에서가장가까운선을찾는다 직선의경우수선의발을찾는것으로가능 Bezier 의경우약간복잡하므로일단 Hull 을기준으로사용 Hull 까지의최단거리가곡선까지의거리 선분까지의최단거리를비교 ( 실제로는양끝점까지의거리와수선의발까지의거리중가장짧은것 ) 24

선을선택하는방법 선까지의거리를고려해서가장가까운객체를선택하도록수정 가까운거리에점이없는경우가장가까운선을찾는다 // find line : MinD=10; for(i=0;i<linenum;i++) d=distancetoline(i,x,y); if (d<mind) MinD=d; MinO=i; ObjectType=1; return MinO; 25 선을선택하는방법 직선과곡선의경우에따라다른방법으로결정 결국 DistanceToSegment 함수로귀결 float fastcall TChildForm::DistanceToLine(int l,int x,int y) if (Line[l].PointNum==2) // straight line return DistanceToSegment(x,y,Point[Line[l].Point[0]],Point[Line[l].Point[1]]); else // Bezier curve float d,mind=10000; for(i=0;i<line[l].pointnum-1;i++) d=distancetosegment(x,y,point[line[l].point[i]],point[line[l].point[i+1]]); if (d<mind) MinD=d; return MinD; 26

선을선택하는방법 한점에서선분까지의최단거리구하기 float fastcall TChildForm::DistanceToSegment(int x,int y,ptpoint a,ptpoint b) float MinD,d,m; a=screen(a.x,a.y); b=screen(b.x,b.y); MinD=sqrt((a.x-x)*(a.x-x)+(a.y-y)*(a.y-y)); d=sqrt((b.x-x)*(b.x-x)+(b.y-y)*(b.y-y)); if (d<mind) MinD=d; if (a.x==b.x) d=fabs(x-a.x); (a.x, a.y) else m=(a.y-b.y)/(a.x-b.x); (x, y) d=fabs(m*x-y+a.y-m*a.x)/sqrt(m*m+1); d if (d<mind) MinD=d; return MinD; (b.x, b.y) b. y a. y m =, y a. y = m( x a. x) b. x a. x mx y + a. y m a. x = 0 mx y + a. y m a. x d = m 2 + 1 27 선그리는부분의함수화 반복되는코드를없애는것이프로그래밍의핵심 for(i=0;i<linenum;i++) DrawLine(i,clBlack,1); Canvas->Pen->Color=clRed; Canvas->Brush->Style=bsClear; for(i=0;i<selnum;i++) if (Sel[i].Type==0) P=Screen(Point[Sel[i].Num].x,Point[Sel[i].Num].y); Canvas->Ellipse(P.x-5,P.y-5,P.x+5,P.y+5); if (Sel[i].Type==1) DrawLine(Sel[i].Num,clRed,0); Canvas->Brush->Style=bsSolid; 28

선그리기함수구현 void fastcall TChildForm::DrawLine(int l,tcolor C,int hull) ptpoint P; TColor OC=Canvas->Pen->Color; if (Line[l].PointNum==2) Canvas->Pen->Color=C; P=Screen(Point[Line[l].Point[0]].x,Point[Line[l].Point[0]].y); Canvas->MoveTo(P.x,P.y); P=Screen(Point[Line[l].Point[1]].x,Point[Line[l].Point[1]].y); Canvas->LineTo(P.x,P.y); else TPoint pt[4]; Canvas->Pen->Color=clLime; for(i=0;i<4;i++) P=Screen(Point[Line[l].Point[i]].x,Point[Line[l].Point[i]].y); pt[i].x=(int)p.x; pt[i].y=(int)p.y; if (ViewHull==1 && hull) if (!i) Canvas->MoveTo(P.x,P.y); else Canvas->LineTo(P.x,P.y); Canvas->Pen->Color=C; Canvas->PolyBezier(pt,3); Canvas->Pen->Color=OC; 29 선속성설정 선의여러가지성질을바꾸기 색상, 굵기, 형태등 Line 메뉴를추가 속성설정대화상자를추가» TLinePropertyDialog.cpp 로저장 SHAPE : TShape MouseDown event handler COLOR : TColorDialog STYLE : TComboBox Items : Solid Dot Dash Dash Dot Dash Dot Dot 30

선속성설정 Event Handler 설정 SHAPE 를마우스로클릭한경우색상을바꿀수있음 void fastcall TLinePropertyDialog::SHAPEMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) if (COLOR->Execute()) SHAPE->Brush->Color=COLOR->Color; Ok, Cancel 버튼의 event handler 도작성 void fastcall TLinePropertyDialog::Button1Click(TObject *Sender) Result=1; Close(); void fastcall TLinePropertyDialog::Button2Click(TObject *Sender) Result=0; Close(); 31 선속성설정 ptline 구조체수정 struct ptline TColor Color; int Thickness,Style; int PointNum; int Point[4]; ; Line 의기본속성설정 void fastcall TChildForm::Polyline1Click(TObject *Sender) for(i=0;i<selnum-1;i++) Line[LineNum].Color=clBlack; Line[LineNum].Thickness=1; Line[LineNum].Style=0; Line[LineNum].PointNum=2;.. void fastcall TChildForm::BezierCurve1Click(TObject *Sender) Line[LineNum].Color=clBlack; Line[LineNum].Thickness=1; Line[LineNum].Style=0; Line[LineNum].PointNum=4; 32

선속성설정 Edit Property 메뉴핸들러작성 void fastcall TChildForm::EditProperty1Click(TObject *Sender) if (!SelNum) return; LinePropertyDialog->ShowModal(); if (LinePropertyDialog->Result) for(i=0;i<selnum;i++) if (Sel[i].Type==1) Line[Sel[i].Num].Color=LinePropertyDialog->SHAPE->Brush->Color; Line[Sel[i].Num].Thickness=LinePropertyDialog->THICKNESS->Text.ToInt(); Line[Sel[i].Num].Style=LinePropertyDialog->STYLE->ItemIndex; 33 선속성설정 선그리기함수수정 void fastcall TChildForm::DrawLine(int l,tcolor C,int hull) ptpoint P; TColor OC=Canvas->Pen->Color; // 원래색상 / 굵기 / 스타일을백업 int OT=Canvas->Pen->Width; int OS=Canvas->Pen->Style; if (Line[l].Type==0) Canvas->Pen->Color=C; Canvas->Pen->Width=Line[l].Thickness; Canvas->Pen->Style=Line[l].Style;. else TPoint pt[4]; Canvas->Pen->Color=clLime; // Hull 그리기위한설정 Canvas->Pen->Width=1; Canvas->Pen->Style=psSolid; Canvas->Pen->Color=C; Canvas->Pen->Width=Line[l].Thickness; Canvas->Pen->Style=Line[l].Style; Canvas->PolyBezier(pt,3); Canvas->Pen->Color=OC; // 원래대로돌리기 Canvas->Pen->Width=OT; Canvas->Pen->Style=OS; 34

More Points 새로운점의생성 점과선을이용한새로운점의선택 여러개의점과하나의선을선택 선을중심으로선택한점과대칭인점들을생성 메뉴를추가 35 More Points 새로운점의생성 메뉴핸들러의작성 맨처음에선을선택해야함 MirrorPoint 함수로귀결 void fastcall TChildForm::AddMirrorPoints1Click(TObject *Sender) if (SelNum<2) return; if (Sel[0].Type!=1 Line[Sel[0].Num].PointNum!=2) Application->MessageBox("Select a line first","caution",mb_iconexclamation); ptpoint a=point[line[sel[0].num].point[0]]; ptpoint b=point[line[sel[0].num].point[1]]; for(i=1;i<selnum;i++) Point[PointNum]=MirrorPoint(a,b,Point[Sel[i].Num]); PointNum++; 36

More Points 새로운점의생성 MirrorPoint 함수의작성 ptpoint fastcall TChildForm::MirrorPoint(ptPoint a,ptpoint b,ptpoint c) float m,n,p,q; ptpoint d,r; if (a.x==b.x) d.x=2*a.x-c.x; d.y=c.y; else if (a.y==b.y) d.x=c.x; d.y=2*b.y-c.y; (c.x, c.y) else return d; m=(a.y-b.y)/(a.x-b.x); n=a.y-m*a.x; p=-1/m; q=c.y-p*c.x; r.x=(n-q)/(p-m); r.y=m*r.x+n; d.x=2*r.x-c.x; d.y=2*r.y-c.y; y=px+q (a.x, a.y) (r.x, r.y) (d.x, d.y) (b.x, b.y) y=mx+n p r. x + q = m r. x + n n q r. x =, r. y = mx + n p m b. y a. y m =, n = a. y m a. x b. x a. x 1 p =, q = c. y p c. x m d. x = 2 r. x c. x d. y = 2 r. y c. y 37