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

绘图程序

开发平台:

Visual C++

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