Polygon.cpp
上传用户:lj3531212
上传日期:2007-06-18
资源大小:346k
文件大小:20k
源码类别:

绘图程序

开发平台:

Visual C++

  1. // Polygon.cpp: implementation of the CPolygon class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "GraphSoft.h"
  6. #include "Polygon.h"
  7. #include "math.h"
  8. #include "GlobalFunction.h"
  9. #ifdef _DEBUG
  10. #undef THIS_FILE
  11. static char THIS_FILE[]=__FILE__;
  12. #define new DEBUG_NEW
  13. #endif
  14. ///////////////////////////////////
  15. IMPLEMENT_SERIAL( CPolygon, CShape, 0 )
  16. //////////////////////////////////////////////////////////////////////
  17. // Construction/Destruction
  18. //////////////////////////////////////////////////////////////////////
  19. ///////////////////////////////////////////////////////////////////////
  20. CPolygon::CPolygon():CShape()
  21. {
  22. }
  23. CPolygon::CPolygon(COLORREF color,int penWidth,float angle):CShape(color,penWidth,angle)
  24. {
  25. }
  26. CPolygon::CPolygon(CPolygon * const pPolygon):CShape(pPolygon)
  27. {
  28. int i=pPolygon->m_flArrayxTemp.GetSize();
  29. int j=0;
  30. float fx,fy;
  31. m_flArrayxTemp.RemoveAll();
  32. m_flArrayyTemp.RemoveAll();
  33. while(j++<i){
  34. fx=pPolygon->m_flArrayxTemp.GetAt(j-1);
  35. fy=pPolygon->m_flArrayyTemp.GetAt(j-1);
  36. m_flArrayxTemp.Add(fx);
  37. m_flArrayyTemp.Add(fy);
  38. }
  39. i=pPolygon->m_flArrayx.GetSize();
  40. j=0;
  41. m_flArrayx.RemoveAll();
  42. m_flArrayy.RemoveAll();
  43. while(j++<i){
  44. fx=pPolygon->m_flArrayx.GetAt(j-1);
  45. fy=pPolygon->m_flArrayy.GetAt(j-1);
  46. m_flArrayx.Add(fx);
  47. m_flArrayy.Add(fy);
  48. }
  49. }
  50. CPolygon::~CPolygon()
  51. {
  52. }
  53. ////////////////////////////////////////////////////////////////////////// 
  54. void CPolygon::Serialize( CArchive& ar)
  55. {
  56. CShape::Serialize( ar ) ;
  57. int i=0,j;
  58. if ( ar.IsLoading() ){
  59. float fx,fy;
  60. ar>>i;
  61. j=0;
  62. while(j++ < i){
  63. ar>>fx;
  64. ar>>fy;
  65. m_flArrayx.Add(fx);
  66. m_flArrayy.Add(fy);
  67. //temp
  68. m_flArrayxTemp.Add(fx);
  69. m_flArrayyTemp.Add(fy);
  70. }  
  71. } else {
  72. RefreshData(m_bModified);
  73. i=m_flArrayx.GetSize();
  74. j=0;
  75. ar<<i;
  76. while(j++ < i){
  77. ar<<((float)m_flArrayx.GetAt(j-1));
  78. ar<<((float)m_flArrayy.GetAt(j-1));
  79. }  
  80. }
  81. return ;                  
  82. }
  83. ////////////////////////////////////////////////////////////////////////
  84. void CPolygon::Draw(CDC *pDC,COLORREF color,COLORREF fillColor,int penWidth)
  85. {
  86. if(m_flArrayxTemp.GetSize()!=m_flArrayyTemp.GetSize())
  87. return;
  88. CPen pen,*poldPen;
  89. int i=m_flArrayxTemp.GetSize();
  90.     int j=0;
  91.     pen.CreatePen(PS_SOLID,1, fillColor);
  92. poldPen=pDC->SelectObject(&pen);
  93. if(m_nFillStyle==_shape_solid_fill){
  94. CPoint *ptArray=new CPoint[i];
  95. for(j=0;j<i;j++){
  96. ptArray[j].x=m_flArrayxTemp.GetAt(j);
  97. ptArray[j].y=m_flArrayyTemp.GetAt(j);
  98. }
  99. AreaFill(pDC,i,ptArray,fillColor);
  100. delete[] ptArray;
  101. }
  102.     pen.DeleteObject();
  103. pen.CreatePen(PS_SOLID,penWidth, color);  
  104. pDC->SelectObject(&pen);    
  105. j=0;
  106. pDC->MoveTo(m_flArrayxTemp.GetAt(j),m_flArrayyTemp.GetAt(j));
  107. while(++j<i){
  108. pDC->LineTo(m_flArrayxTemp.GetAt(j),m_flArrayyTemp.GetAt(j));
  109. }
  110. pDC->LineTo(m_flArrayxTemp.GetAt(0),m_flArrayyTemp.GetAt(0));
  111. if(GetDrawPointsFlag()==1){
  112. DrawPoints(pDC,color);
  113. }
  114. pDC->SelectObject(poldPen);  
  115. }
  116. ///////////////////////////////////////////
  117. void CPolygon::DrawPointsCutTo(CDC *pDC,COLORREF color,CFlRect m_rectFrom,CRect m_rectTo)
  118. {
  119. // if(!IsInRect(m_rectFrom)){
  120. // return;
  121. // }
  122. //得到移动扩缩后的关键数据
  123. CArray<float,float> flArrayx;
  124. CArray<float,float> flArrayy;;
  125. //移动
  126. int i=m_flArrayxTemp.GetSize(),j;
  127. float stepx=m_rectTo.left-m_rectFrom.left;
  128. float stepy=m_rectTo.top-m_rectFrom.top;
  129. for(j=0;j<i;j++){
  130. flArrayx.Add(m_flArrayxTemp.GetAt(j)+stepx);
  131. flArrayy.Add(m_flArrayyTemp.GetAt(j)+stepy);
  132. }
  133. //扩缩
  134. float cx,cy,flScale;
  135. cx=m_rectTo.left;
  136. cy=m_rectTo.top;  
  137. if(m_rectFrom.Width()<0.01){
  138. m_rectFrom.right=m_rectFrom.left +1;
  139. }
  140. if(m_rectFrom.Height()<0.01){
  141. m_rectFrom.bottom=m_rectFrom.top +1;
  142. }
  143. flScale=(float)m_rectTo.Width()/m_rectFrom.Width();
  144. //flScale=min((float)m_rectTo.Width()/m_rectFrom.Width(),(float)m_rectTo.Height()/m_rectFrom.Height());
  145. i=flArrayx.GetSize();
  146. for(j=0;j<i;j++){
  147. flArrayx.SetAt(j,(flArrayx.GetAt(j)-cx)*flScale+cx);
  148. flArrayy.SetAt(j,(flArrayy.GetAt(j)-cy)*flScale+cy);
  149. }
  150. CPen pen,*poldPen;
  151.     pen.CreatePen(PS_SOLID,1, color);
  152. poldPen=pDC->SelectObject(&pen);
  153. i=flArrayx.GetSize();
  154. for(j=0;j<i;j++){
  155. pDC->MoveTo(flArrayx.GetAt(j),flArrayy.GetAt(j)-1-GetPenWidth());
  156. pDC->LineTo(flArrayx.GetAt(j),flArrayy.GetAt(j)+2+GetPenWidth());
  157. pDC->MoveTo(flArrayx.GetAt(j)-1-GetPenWidth(),flArrayy.GetAt(j));
  158. pDC->LineTo(flArrayx.GetAt(j)+2+GetPenWidth(),flArrayy.GetAt(j));
  159. }
  160. pDC->SelectObject(poldPen);      
  161. return;
  162. }
  163. void CPolygon::DrawPoints(CDC *pDC,COLORREF color)
  164. {
  165. CPen pen,*poldPen;
  166.     pen.CreatePen(PS_SOLID,1, color);
  167. poldPen=pDC->SelectObject(&pen);
  168. int i=m_flArrayxTemp.GetSize();
  169. for(int j=0;j<i;j++){
  170. pDC->MoveTo(m_flArrayxTemp.GetAt(j),m_flArrayyTemp.GetAt(j)-1-GetPenWidth());
  171. pDC->LineTo(m_flArrayxTemp.GetAt(j),m_flArrayyTemp.GetAt(j)+2+GetPenWidth());
  172. pDC->MoveTo(m_flArrayxTemp.GetAt(j)-1-GetPenWidth(),m_flArrayyTemp.GetAt(j));
  173. pDC->LineTo(m_flArrayxTemp.GetAt(j)+2+GetPenWidth(),m_flArrayyTemp.GetAt(j));
  174. }
  175. pDC->SelectObject(poldPen);      
  176. return;
  177. }
  178. /////////////////
  179. void CPolygon::DrawCutToRect(CDC *pDC,COLORREF color,COLORREF fillColor,int penWidth,CFlRect m_rectFrom,CRect m_rectTo)
  180. {
  181. // if(!IsInRect(m_rectFrom)){
  182. // return;
  183. // }
  184. //得到移动扩缩后的关键数据
  185. CArray<float,float> flArrayx;
  186. CArray<float,float> flArrayy;;
  187. //移动
  188. int i=m_flArrayxTemp.GetSize(),j;
  189. float stepx=m_rectTo.left-m_rectFrom.left;
  190. float stepy=m_rectTo.top-m_rectFrom.top;
  191. for(j=0;j<i;j++){
  192. flArrayx.Add(m_flArrayxTemp.GetAt(j)+stepx);
  193. flArrayy.Add(m_flArrayyTemp.GetAt(j)+stepy);
  194. }
  195. //扩缩
  196. float cx,cy,flScale;
  197. cx=m_rectTo.left;
  198. cy=m_rectTo.top;  
  199. if(m_rectFrom.Width()<0.01){
  200. m_rectFrom.right=m_rectFrom.left +1;
  201. }
  202. if(m_rectFrom.Height()<0.01){
  203. m_rectFrom.bottom=m_rectFrom.top +1;
  204. }
  205. flScale=(float)m_rectTo.Width()/m_rectFrom.Width();
  206. //flScale=min((float)m_rectTo.Width()/m_rectFrom.Width(),(float)m_rectTo.Height()/m_rectFrom.Height());
  207. i=flArrayx.GetSize();
  208. for(j=0;j<i;j++){
  209. flArrayx.SetAt(j,(flArrayx.GetAt(j)-cx)*flScale+cx);
  210. flArrayy.SetAt(j,(flArrayy.GetAt(j)-cy)*flScale+cy);
  211. }
  212. CPen pen,*poldPen;  
  213. i=flArrayx.GetSize();
  214.     j=0;
  215.     pen.CreatePen(PS_SOLID,1, fillColor);
  216. poldPen=pDC->SelectObject(&pen);
  217. if(m_nFillStyle==_shape_solid_fill){
  218. CPoint *ptArray=new CPoint[i];
  219. for(j=0;j<i;j++){
  220. ptArray[j].x=flArrayx.GetAt(j);
  221. ptArray[j].y=flArrayy.GetAt(j);
  222. }
  223. AreaFill(pDC,i,ptArray,fillColor);
  224. delete[] ptArray;
  225. }
  226.     pen.DeleteObject();
  227. pen.CreatePen(PS_SOLID,penWidth, color);  
  228. pDC->SelectObject(&pen);    
  229. j=0;
  230. pDC->MoveTo(flArrayx.GetAt(j),flArrayy.GetAt(j));
  231. while(++j<i){
  232. pDC->LineTo(flArrayx.GetAt(j),flArrayy.GetAt(j));
  233. }
  234. pDC->LineTo(flArrayx.GetAt(0),flArrayy.GetAt(0));
  235. if(GetDrawPointsFlag()==1){
  236. DrawPointsCutTo(pDC,color,m_rectFrom,m_rectTo);
  237. }
  238. pDC->SelectObject(poldPen);
  239. // flArrayx.RemoveAll();
  240. // flArrayy.RemoveAll();
  241. }
  242. ////////////////////////////////////////////////////////////////////////////
  243. ////////////////////////////////////////////////////////////////////////////
  244. void CPolygon::RefreshData(bool bRefresh)
  245. {
  246. if(bRefresh){
  247. int i=m_flArrayxTemp.GetSize();
  248. int j=0;
  249. float fx,fy;
  250. m_flArrayx.RemoveAll();
  251. m_flArrayy.RemoveAll();
  252. while(j++<i){
  253. fx=m_flArrayxTemp.GetAt(j-1);
  254. fy=m_flArrayyTemp.GetAt(j-1);
  255. m_flArrayx.Add(fx);
  256. m_flArrayy.Add(fy);
  257. }
  258. m_bModified=FALSE;
  259. m_ptMagnifyCenterTemp=CPoint(0,0);
  260. m_flScaleTemp=1;
  261. m_ptRotateCenterTemp=CPoint(0,0);
  262. m_flAngleTemp=0;
  263. }
  264. }
  265. void CPolygon::CreatGraph(CArray<float,float>& flArrayX,CArray<float,float>& flArrayY,int nPenWidth,COLORREF color,COLORREF fillColor,SHAPE_FILLSTYLE nStyle)
  266. {
  267. //if(ptArray.GetSize()<2){
  268. // return;
  269. //}
  270. CShape::CreatGraph(flArrayX,flArrayY,nPenWidth,color,fillColor,nStyle);
  271. int i=flArrayX.GetSize();
  272. int j=0;
  273. float flx,fly;
  274. m_flArrayx.RemoveAll();
  275. m_flArrayy.RemoveAll();
  276. m_flArrayxTemp.RemoveAll();
  277. m_flArrayyTemp.RemoveAll();
  278. while(j++<i){
  279. flx=flArrayX.GetAt(j-1);
  280. fly=flArrayY.GetAt(j-1);
  281. m_flArrayx.Add(flx);
  282. m_flArrayy.Add(fly);
  283. //temp
  284. m_flArrayxTemp.Add(flx);
  285. m_flArrayyTemp.Add(fly);
  286. }
  287. }
  288. void CPolygon::CreatGraph(CArray<CPoint,CPoint>& ptArray,int nPenWidth,COLORREF color,COLORREF fillColor,SHAPE_FILLSTYLE nStyle)
  289. {
  290. //if(ptArray.GetSize()<2){
  291. // return;
  292. //}
  293. CShape::CreatGraph(ptArray,nPenWidth,color,fillColor,nStyle);
  294. int i=ptArray.GetSize();
  295. int j=0;
  296. CPoint pt;
  297. m_flArrayx.RemoveAll();
  298. m_flArrayy.RemoveAll();
  299. m_flArrayxTemp.RemoveAll();
  300. m_flArrayyTemp.RemoveAll();
  301. while(j++<i){
  302. pt=ptArray.GetAt(j-1);
  303. m_flArrayx.Add(pt.x);
  304. m_flArrayy.Add(pt.y);
  305. //temp
  306. m_flArrayxTemp.Add(pt.x);
  307. m_flArrayyTemp.Add(pt.y);
  308. //TRACE("%d---(%d,%d)n",j,pt.x,pt.y);
  309. }
  310. }
  311. void CPolygon::SetPtData(CArray<float,float>& flArrayX,CArray<float,float>& flArrayY)
  312. {
  313. m_flArrayx.Copy(flArrayX);
  314. m_flArrayxTemp.Copy(flArrayX);
  315. m_flArrayy.Copy(flArrayY);
  316. m_flArrayyTemp.Copy(flArrayY);
  317. }
  318. void CPolygon::GetPtData(CArray<float,float>& flArrayX,CArray<float,float>& flArrayY)
  319. {
  320. flArrayX.Copy(m_flArrayxTemp);
  321. flArrayY.Copy(m_flArrayyTemp);
  322. }
  323. CShape* CPolygon::GetCopy()
  324. {
  325. CShape* pGraph=new CPolygon(this);
  326. return pGraph;  
  327. }
  328. ////////////////////////////////////////////////////////////////////////////
  329. ////////////////////////////////////////////////////////////////////////////
  330. void CPolygon::Move(CDC *pDC,float stepx,float stepy)
  331. {
  332. RefreshData(m_bModified);
  333. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  334. int i=m_flArrayxTemp.GetSize();
  335. int j=0;
  336. float fx,fy;
  337. while(j++<i){
  338. fx=m_flArrayxTemp.GetAt(j-1);
  339. fy=m_flArrayyTemp.GetAt(j-1);
  340. m_flArrayx.SetAt(j-1,fx+stepx);
  341. m_flArrayy.SetAt(j-1,fy+stepy);
  342. m_flArrayxTemp.SetAt(j-1,fx+stepx);
  343. m_flArrayyTemp.SetAt(j-1,fy+stepy);
  344. }
  345. }
  346. void CPolygon::PartMove(CDC *pDC,float PrevX,float PrevY,float CurX,float CurY)
  347. {
  348. RefreshData(m_bModified);
  349.     if(m_nSelectPtNum>-1){
  350. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  351. m_flArrayxTemp.SetAt(m_nSelectPtNum,CurX);
  352. m_flArrayyTemp.SetAt(m_nSelectPtNum,CurY);
  353. m_flArrayx.SetAt(m_nSelectPtNum,CurX);
  354. m_flArrayy.SetAt(m_nSelectPtNum,CurY);
  355. // CShape::Draw(pDC);
  356.     }else if(m_nSelectLineNum>-1){
  357. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  358. float flCut1x,flCut1y,flCut2x,flCut2y;
  359. float flX1[4],flY1[4],flX2[4],flY2[4];
  360. int nptNum=m_flArrayyTemp.GetSize();
  361. flX1[0]=m_flArrayx.GetAt((nptNum+m_nSelectLineNum-1)%nptNum);
  362. flY1[0]=m_flArrayy.GetAt((nptNum+m_nSelectLineNum-1)%nptNum);
  363. flX1[1]=CurX;
  364. flY1[1]=CurY;    
  365. flX1[2] = m_flArrayx.GetAt((nptNum+m_nSelectLineNum)%nptNum);
  366. flY1[2] = m_flArrayy.GetAt((nptNum+m_nSelectLineNum)%nptNum);
  367. flX1[3] = m_flArrayx.GetAt((nptNum+m_nSelectLineNum+1)%nptNum);
  368. flY1[3] = m_flArrayy.GetAt((nptNum+m_nSelectLineNum+1)%nptNum);
  369.     flX2[0]=m_flArrayx.GetAt((nptNum+m_nSelectLineNum+2)%nptNum);
  370. flY2[0]=m_flArrayy.GetAt((nptNum+m_nSelectLineNum+2)%nptNum);
  371. flX2[1]=CurX;
  372. flY2[1]=CurY;    
  373. flX2[2] = flX1[2];
  374. flY2[2] = flY1[2];
  375. flX2[3] = flX1[3];
  376. flY2[3] = flY1[3];
  377. if(GetCutPtFrom2Line(flX1,flY1,&flCut1x,&flCut1y) && GetCutPtFrom2Line(flX2,flY2,&flCut2x,&flCut2y)){
  378. if(fabs(flCut1x-flX1[0])>0.01){
  379. m_flArrayxTemp.SetAt((nptNum+m_nSelectLineNum)%nptNum,(flX1[2]-flX1[0])*((float)CurX-flCut1x)/(flCut1x-flX1[0])+flX1[2]);
  380. if(fabs(flCut1y-flY1[0])>0.01){
  381. m_flArrayyTemp.SetAt((nptNum+m_nSelectLineNum)%nptNum,(flY1[2]-flY1[0])*((float)CurY-flCut1y)/(flCut1y-flY1[0])+flY1[2]);
  382. }
  383. if(fabs(flCut2x-flX2[0])>0.01){
  384. m_flArrayxTemp.SetAt((nptNum+m_nSelectLineNum+1)%nptNum,(flX2[3]-flX2[0])*((float)CurX-flCut2x)/(flCut2x-flX2[0])+flX2[3]);
  385. if(fabs(flCut2y-flY2[0])>0.01){
  386. m_flArrayyTemp.SetAt((nptNum+m_nSelectLineNum+1)%nptNum,(flY2[3]-flY2[0])*((float)CurY-flCut2y)/(flCut2y-flY2[0])+flY2[3]);
  387. }
  388. }
  389. // CShape::Draw(pDC);
  390. }
  391. }
  392. void CPolygon::Rotate(CDC *pDC,float CX,float CY,float flAngle)
  393. {
  394. if(m_flScaleTemp!=1){
  395. RefreshData(TRUE);
  396. }
  397. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  398. m_ptRotateCenterTemp=CPoint(CX,CY);
  399. m_flAngleTemp=flAngle;
  400. m_bModified=TRUE;
  401. int i=m_flArrayx.GetSize();
  402. int j=0;
  403. float fx,fy,fxTemp,fyTemp;
  404. while(j++<i){
  405. fx=m_flArrayx.GetAt(j-1);
  406. fy=m_flArrayy.GetAt(j-1);
  407. fxTemp=((fx-CX)*cos(flAngle)-(fy-CY)*sin(flAngle))+CX;
  408. fyTemp=((fy-CY)*cos(flAngle)+(fx-CX)*sin(flAngle))+CY;
  409. m_flArrayxTemp.SetAt(j-1,fxTemp);
  410. m_flArrayyTemp.SetAt(j-1,fyTemp);
  411. }
  412. }
  413. void CPolygon::Magnify(CDC *pDC,float CX,float CY,float flScale)
  414. {
  415. if(m_flAngleTemp!=0){
  416. RefreshData(TRUE);
  417. }
  418. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));  
  419. m_ptMagnifyCenterTemp=CPoint(CX,CY);
  420. m_flScaleTemp=flScale;
  421. m_bModified=TRUE;
  422. int i=m_flArrayx.GetSize();
  423. int j=0;
  424. float fx,fy;
  425. while(j++<i){
  426. fx=m_flArrayx.GetAt(j-1);
  427. fy=m_flArrayy.GetAt(j-1);
  428. fx=(fx-CX)*flScale+CX;
  429. fy=(fy-CY)*flScale+CY;
  430. m_flArrayxTemp.SetAt(j-1,fx);
  431. m_flArrayyTemp.SetAt(j-1,fy);
  432. }
  433. }
  434. void CPolygon::LeftToRight(CDC* pDC,CRect rect)
  435. {
  436. RefreshData(m_bModified);
  437. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  438. int i=m_flArrayx.GetSize();
  439. for(int j=0;j<i;j++){
  440. m_flArrayx.SetAt(j,rect.left/1000.0+rect.right/1000.0-m_flArrayx.GetAt(j));
  441. m_flArrayxTemp.SetAt(j,rect.left/1000.0+rect.right/1000.0-m_flArrayxTemp.GetAt(j));
  442. }
  443. //CShape::Draw(pDC);
  444. }
  445. void CPolygon::TopToBottom(CDC* pDC,CRect rect)
  446. {
  447. RefreshData(m_bModified);
  448. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  449. int i=m_flArrayx.GetSize();
  450. for(int j=0;j<i;j++){
  451. m_flArrayy.SetAt(j,rect.top/1000.0+rect.bottom/1000.0-m_flArrayy.GetAt(j));
  452. m_flArrayyTemp.SetAt(j,rect.top/1000.0+rect.bottom/1000.0-m_flArrayyTemp.GetAt(j));
  453. }
  454. //CShape::Draw(pDC);
  455. }
  456. ////////////////////////////////////////////////////////////////////////////
  457. ////////////////////////////////////////////////////////////////////////////
  458. int CPolygon::IsInRect(CRect rect)
  459. {
  460. int nRltVal=0,nTemp;
  461. int i=m_flArrayx.GetSize();
  462. int j=0;
  463. float fx1,fy1,fx2,fy2;
  464. while(++j < i){
  465. fx1=m_flArrayxTemp.GetAt(j-1);
  466. fy1=m_flArrayyTemp.GetAt(j-1);
  467. fx2=m_flArrayxTemp.GetAt(j);
  468. fy2=m_flArrayyTemp.GetAt(j);
  469. nTemp=GetLineStateToRect(fx1,fy1,fx2,fy2,rect);
  470.     nRltVal=nRltVal | nTemp;
  471. }
  472. fx1=m_flArrayxTemp.GetAt(i-1);
  473. fy1=m_flArrayyTemp.GetAt(i-1);
  474. fx2=m_flArrayxTemp.GetAt(0);
  475. fy2=m_flArrayyTemp.GetAt(0);
  476. nTemp=GetLineStateToRect(fx1,fy1,fx2,fy2,rect);
  477. nRltVal=nRltVal | nTemp;
  478. if(nRltVal==3){
  479. nRltVal=1;
  480. }else if(nRltVal==0){
  481. CPoint pt[4];
  482. pt[0].x=rect.left;
  483. pt[0].y=rect.top;
  484. pt[1].x=rect.right;
  485. pt[1].y=rect.top;
  486. pt[2].x=rect.right;
  487. pt[2].y=rect.bottom;
  488. pt[3].x=rect.left;
  489. pt[3].y=rect.bottom;
  490. if(IsPointinRegion(pt[0])&&IsPointinRegion(pt[1])&&
  491. IsPointinRegion(pt[2])&&IsPointinRegion(pt[3])&&
  492. m_nFillStyle==_shape_solid_fill){
  493. nRltVal=1;      
  494. }
  495. }
  496. return nRltVal;
  497. }
  498. CRect CPolygon::GetBoundaryRect()
  499. {
  500. if(m_flArrayxTemp.GetSize()==0){
  501. return CRect(0,0,0,0);
  502. }
  503. CRect rect(1000*m_flArrayxTemp.GetAt(0),1000*m_flArrayyTemp.GetAt(0),1000*m_flArrayxTemp.GetAt(0),1000*m_flArrayyTemp.GetAt(0));
  504. int i=m_flArrayxTemp.GetSize();
  505. int j=0;
  506. float fx,fy;
  507. while(j++<i){
  508. fx=1000*m_flArrayxTemp.GetAt(j-1);
  509. fy=1000*m_flArrayyTemp.GetAt(j-1);
  510. if(fx<rect.left){
  511. rect.left=fx;
  512. }else if(fx>rect.right){
  513. rect.right=fx;
  514. }
  515. if(fy<rect.top){
  516. rect.top=fy;
  517. }else if(fy>rect.bottom){
  518. rect.bottom=fy;
  519. }
  520. }
  521. return rect;
  522. }
  523. CPoint CPolygon::GetCenterPoint()
  524. {
  525. CRect rect=GetBoundaryRect();
  526. return rect.CenterPoint();
  527. }
  528. int CPolygon::IsPointinRegion(POINT point)
  529. {
  530. int nRltVal=0;
  531. int i=m_flArrayx.GetSize();
  532. int j=0;
  533. while(++j < i){
  534.         if(point.y>min(m_flArrayyTemp.GetAt(j-1),m_flArrayyTemp.GetAt(j))&&point.y<max(m_flArrayyTemp.GetAt(j-1),m_flArrayyTemp.GetAt(j)))
  535. {  
  536. if((m_flArrayxTemp.GetAt(j)-(m_flArrayyTemp.GetAt(j)-m_flArrayyTemp.GetAt(j-1))*
  537. ((m_flArrayyTemp.GetAt(j)-point.y)/
  538. (m_flArrayxTemp.GetAt(j)-m_flArrayxTemp.GetAt(j-1)))) >=point.x){
  539. nRltVal+=1;
  540. }
  541. }
  542. }
  543. if(point.y>min(m_flArrayyTemp.GetAt(i-1),m_flArrayyTemp.GetAt(0))&&point.y<max(m_flArrayyTemp.GetAt(i-1),m_flArrayyTemp.GetAt(0)))
  544. {  
  545. if((m_flArrayxTemp.GetAt(0)-(m_flArrayyTemp.GetAt(0)-m_flArrayyTemp.GetAt(i-1))*
  546. ((m_flArrayyTemp.GetAt(0)-point.y)/
  547. (m_flArrayxTemp.GetAt(0)-m_flArrayxTemp.GetAt(i-1)))) >=point.x){
  548. nRltVal+=1;
  549. } }
  550.     if((nRltVal%2)==1){
  551. return 1;
  552.     }
  553. return 0;
  554. }
  555. //////
  556. int CPolygon::GetPtState(float flx,float fly,float flRate){
  557. int nRltVal=0;
  558. int i=m_flArrayx.GetSize();
  559. int j=0;
  560. float x,y;
  561. float tmpx,tmpy;
  562. while(j++<i){
  563. tmpx=m_flArrayxTemp.GetAt(j-1);
  564. tmpy=m_flArrayyTemp.GetAt(j-1);
  565. if(IsPtInRect(tmpx-3*flRate,tmpy-3*flRate,tmpx+3*flRate,tmpy+3*flRate,flx,fly)){
  566. m_nSelectPtNum=j-1;
  567. m_nSelectLineNum=-1;
  568. return 1;
  569. }
  570. }
  571. //on out line
  572. j=0;
  573. while(++j<i){
  574. if(GetPtStateToBigLine(m_flArrayxTemp.GetAt(j-1),m_flArrayyTemp.GetAt(j-1),
  575. m_flArrayxTemp.GetAt(j),m_flArrayyTemp.GetAt(j),5*flRate,flx,fly)){
  576. m_nSelectPtNum=-1;
  577. m_nSelectLineNum=j-1;
  578. return 2;
  579. }
  580. }
  581. if(GetPtStateToBigLine(m_flArrayxTemp.GetAt(i-1),m_flArrayyTemp.GetAt(i-1),
  582. m_flArrayxTemp.GetAt(0),m_flArrayyTemp.GetAt(0),5*flRate,flx,fly)){
  583. m_nSelectPtNum=-1;
  584. m_nSelectLineNum=i-1;
  585. return 2;
  586. }
  587. //out
  588.     m_nSelectPtNum=-1;
  589. m_nSelectLineNum=-1;
  590. return 0;
  591. }
  592. float CPolygon::GetSelectLineRate()
  593. {
  594. if(m_nSelectLineNum==-1)
  595. return 0;
  596. int nptNum= m_flArrayxTemp.GetSize();
  597. float flx1 = m_flArrayx.GetAt((nptNum+m_nSelectLineNum)%nptNum);
  598. float fly1 = m_flArrayy.GetAt((nptNum+m_nSelectLineNum)%nptNum);
  599. float flx2 = m_flArrayx.GetAt((nptNum+m_nSelectLineNum+1)%nptNum);
  600. float fly2 = m_flArrayy.GetAt((nptNum+m_nSelectLineNum+1)%nptNum);
  601. return -GetLineRate(flx1,fly1,flx2,fly2);
  602. }
  603. //////////////////////////////////////////////////////////////////////
  604. // MODULE   :ExPort
  605. // ABSTRACT :Export to a txt file
  606. // FUNCTION :File->Export...
  607. // NOTE     :
  608. // RETURN   :
  609. // ARGUMENTS:
  610. //              I/O           TYPE      NAME       EXPLANATION
  611. //               O            FILE*    outStream    Out put File
  612. // CREATE   :  FNST)handwolf  2004-4-14
  613. // UPDATE   :  
  614. //          : 
  615. //////////////////////////////////////////////////////////////////////
  616. void CPolygon::ExPort(FILE* outStream)//增加导出txt功能时用
  617. {
  618. fprintf(outStream, " CPolygon n");
  619. CShape::ExPort(outStream);
  620. int n=m_flArrayxTemp.GetSize();
  621. int i=0;
  622. fprintf(outStream, "     %d   ",n);
  623. while(i++ < n){
  624. fprintf( outStream, " %f %f",(float)m_flArrayxTemp.GetAt(i-1),(float)m_flArrayyTemp.GetAt(i-1));
  625. }  
  626. fprintf( outStream, "n");
  627. }
  628. //////////////////////////////////////////////////////////////////////
  629. // MODULE   :ImPort
  630. // ABSTRACT :ImPort from a txt file
  631. // FUNCTION :File->ImPort...
  632. // NOTE     :
  633. // RETURN   :
  634. // ARGUMENTS:
  635. //              I/O           TYPE      NAME       EXPLANATION
  636. //               I            FILE*    inStream    in put File
  637. // CREATE   :  FNST)handwolf  2004-4-14
  638. // UPDATE   :  
  639. //          : 
  640. //////////////////////////////////////////////////////////////////////
  641. void CPolygon::ImPort(FILE* inStream)
  642. {
  643. CShape::ImPort(inStream);
  644. float fx,fy;
  645. int n;
  646. fscanf(inStream, "%d",&n);
  647. int i=0;
  648. while(i++ < n){
  649. fscanf(inStream, "%f%f",&fx,&fy);
  650. m_flArrayx.Add(fx);
  651. m_flArrayy.Add(fy);
  652. //temp
  653. m_flArrayxTemp.Add(fx);
  654. m_flArrayyTemp.Add(fy);
  655. }
  656. }
  657. CString CPolygon::GetNameString()
  658. {
  659. CString str;
  660. str.LoadString(IDS_POLYGON);
  661. return str;
  662. }
  663. //////////////////////////////////////////////////////////////////////
  664. //End of File////////////////
  665. ////////////////////////////////////////////////////////////////////////////
  666. ////////////////////////////////////////////////////////////////////////////