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

绘图程序

开发平台:

Visual C++

  1. // ModelCurve3Param.cpp: implementation of the CModelCurve3Param class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "GraphSoft.h"
  6. #include "ModelCurve3Param.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( CModelCurve3Param, CShape, 0 )
  16. //////////////////////////////////////////////////////////////////////
  17. // Construction/Destruction
  18. //////////////////////////////////////////////////////////////////////
  19. ///////////////////////////////////////////////////////////////////////
  20. CModelCurve3Param::CModelCurve3Param():CShape()
  21. {
  22. }
  23. CModelCurve3Param::CModelCurve3Param(COLORREF color,int penWidth,float angle):CShape(color,penWidth,angle)
  24. {
  25. }
  26. CModelCurve3Param::CModelCurve3Param(CModelCurve3Param * const pModelCurve3Param):CShape(pModelCurve3Param)
  27. {
  28. int i=pModelCurve3Param->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=pModelCurve3Param->m_flArrayxTemp.GetAt(j-1);
  35. fy=pModelCurve3Param->m_flArrayyTemp.GetAt(j-1);
  36. m_flArrayxTemp.Add(fx);
  37. m_flArrayyTemp.Add(fy);
  38. }
  39. i=pModelCurve3Param->m_flArrayx.GetSize();
  40. j=0;
  41. m_flArrayx.RemoveAll();
  42. m_flArrayy.RemoveAll();
  43. while(j++<i){
  44. fx=pModelCurve3Param->m_flArrayx.GetAt(j-1);
  45. fy=pModelCurve3Param->m_flArrayy.GetAt(j-1);
  46. m_flArrayx.Add(fx);
  47. m_flArrayy.Add(fy);
  48. }
  49. }
  50. CModelCurve3Param::~CModelCurve3Param()
  51. {
  52. }
  53. ////////////////////////////////////////////////////////////////////////// 
  54. void CModelCurve3Param::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 CModelCurve3Param::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. SanCiCanShu(pDC,1,1,m_flArrayxTemp,m_flArrayyTemp);
  90. if(GetDrawPointsFlag()==1){
  91. DrawPoints(pDC,color);
  92. }
  93. pDC->SelectObject(poldPen);  
  94. }
  95. ///////////////////////////////////////////
  96. void CModelCurve3Param::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 CModelCurve3Param::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 CModelCurve3Param::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. SanCiCanShu(pDC,1,1,flArrayx,flArrayy);
  219. if(GetDrawPointsFlag()==1){
  220. DrawPointsCutTo(pDC,color,m_rectFrom,m_rectTo);
  221. }
  222. pDC->SelectObject(poldPen);
  223. }
  224. //
  225. int CModelCurve3Param::SanCiCanShu(CDC *pDC,float b1,float bn,CArray<float,float>& flArrayx,CArray<float,float>& flArrayy)
  226. {
  227. if(flArrayx.GetSize()!=flArrayy.GetSize())
  228. return 0;
  229. CArray<float,float> x,y,alfa,alfay,batax,batay,L,Ly;  
  230. int i,t,m;
  231. float k,a11,a21,a31,a41,b11,b21,b31,b41,t1,t2,t3,x0,x1,y0,y1,flTemp;
  232. int n=flArrayx.GetSize();
  233. if(n<2) return 0;  
  234. for(i=0;i<n;i++)
  235. {
  236. flTemp=flArrayx.GetAt(i);
  237. x.Add(flTemp);
  238. flTemp=flArrayy.GetAt(i);
  239. y.Add(flTemp);
  240. alfa.Add(0);
  241. alfay.Add(0);
  242. batax.Add(0);
  243. batay.Add(0);
  244. L.Add(0);
  245. Ly.Add(0);
  246. }
  247. for(i=1;i<n;i++)
  248. {
  249. flTemp=sqrt(pow(x.GetAt(i)-x.GetAt(i-1),2)+pow(y.GetAt(i)-y.GetAt(i-1),2));
  250. if(fabs(flTemp)<1){//如果=0,会抛出异常------除零异常
  251. flTemp=1;
  252. }
  253. L.SetAt(i,flTemp);  
  254. }  
  255. for(i=1;i<n-1;i++)
  256. {
  257. alfa.SetAt(i,L.GetAt(i+1)/(L.GetAt(i)+L.GetAt(i+1)));
  258. batay.SetAt(i,6*((y.GetAt(i+1)-y.GetAt(i))/L.GetAt(i+1)-(y.GetAt(i)-y.GetAt(i-1))/L.GetAt(i))/(L.GetAt(i)+L.GetAt(i+1)));
  259. batax.SetAt(i,6*((x.GetAt(i+1)-x.GetAt(i))/L.GetAt(i+1)-(x.GetAt(i)-x.GetAt(i-1))/L.GetAt(i))/(L.GetAt(i)+L.GetAt(i+1)));
  260.    //TRACE("batay= %f,batax=%f,alfa=%fn",batay.GetAt(i),batax.GetAt(i),alfa.GetAt(i));
  261. }
  262. batax.SetAt(0,6*((x.GetAt(1)-x.GetAt(0))/L.GetAt(1)-b1)/L.GetAt(1));
  263. batax.SetAt(n-1,6*(bn-(x.GetAt(n-1)-x.GetAt(n-2))/L.GetAt(n-1))/L.GetAt(n-1));
  264. batay.SetAt(0,6*((y.GetAt(1)-y.GetAt(0))/L.GetAt(1)-b1)/L.GetAt(1));
  265. batay.SetAt(n-1,6*(bn-(y.GetAt(n-1)-y.GetAt(n-2))/L.GetAt(n-1))/L.GetAt(n-1));;
  266. alfa.SetAt(n-1,0);
  267. alfa.SetAt(0,1);
  268. batax.SetAt(0,batax.GetAt(0)/2);
  269. batay.SetAt(0,batay.GetAt(0)/2);
  270. k=2;//追赶法
  271. for(m=0;m<n-1;m++)
  272. alfa.SetAt(m,alfa.GetAt(m)/k);
  273. k=2-(1-alfa.GetAt(m+1))*alfa.GetAt(m);
  274. batax.SetAt(m+1,(batax.GetAt(m+1)-(1-alfa.GetAt(m+1))*batax.GetAt(m))/k);
  275. batay.SetAt(m+1,(batay.GetAt(m+1)-(1-alfa.GetAt(m+1))*batay.GetAt(m))/k);
  276. }
  277. for(m=n-2;m>=0;m--)
  278. {
  279. batax.SetAt(m,batax.GetAt(m)-batax.GetAt(m+1)*alfa.GetAt(m));
  280. batay.SetAt(m,batay.GetAt(m)-batay.GetAt(m+1)*alfa.GetAt(m));
  281. }  
  282. for(i=0;i<n-1;i++)
  283. {
  284. alfa.SetAt(i,(x.GetAt(i+1)-x.GetAt(i))/L.GetAt(i+1)-L.GetAt(i+1)*(batax.GetAt(i)/3+batax.GetAt(i+1)/6));
  285. alfay.SetAt(i,(y.GetAt(i+1)-y.GetAt(i))/L.GetAt(i+1)-L.GetAt(i+1)*(batay.GetAt(i)/3+batay.GetAt(i+1)/6));
  286. L.SetAt(i,(batax.GetAt(i+1)-batax.GetAt(i))/(6*L.GetAt(i+1)));
  287. Ly.SetAt(i,(batay.GetAt(i+1)-batay.GetAt(i))/(6*L.GetAt(i+1)));
  288. batax.SetAt(i,batax.GetAt(i)/2);
  289. batay.SetAt(i,batay.GetAt(i)/2);
  290. }
  291. for(i=0;i<n-1;i++)
  292. {
  293. a11=x.GetAt(i);
  294. a21=alfa.GetAt(i);
  295. a31=batax.GetAt(i);
  296. a41=L.GetAt(i);
  297. b11=y.GetAt(i);
  298. b21=alfay.GetAt(i);
  299. b31=batay.GetAt(i);
  300. b41=Ly.GetAt(i);
  301. x0=x.GetAt(i);
  302. y0=y.GetAt(i);
  303. //TRACE("x0=%f,y0=%fn",x0,y0);
  304. k=2;//递增步调
  305. t1=0;
  306. m=sqrt(pow((x.GetAt(i+1)-x.GetAt(i)),2)+pow((y.GetAt(i+1)-y.GetAt(i)),2))/k;
  307. for(t=0;t<=m;t++)
  308. {   
  309. t1+=k;
  310. t2=t1*t1;
  311. t3=t1*t2;
  312. x1=a11+a21*t1+a31*t2+a41*t3;
  313. y1=b11+b21*t1+b31*t2+b41*t3;
  314. pDC->MoveTo(x0,y0);
  315. pDC->LineTo(x1,y1);
  316. x0=x1;
  317. y0=y1;
  318. //TRACE("a11= %f,a21=%f,a31=%f,a41y1=%fn",a11,a21,a31,a41);
  319. }
  320. }  
  321. return 1;
  322. }
  323. ////////////////////////////////////////////////////////////////////////////
  324. ////////////////////////////////////////////////////////////////////////////
  325. void CModelCurve3Param::RefreshData(bool bRefresh)
  326. {
  327. if(bRefresh){
  328. int i=m_flArrayxTemp.GetSize();
  329. int j=0;
  330. float fx,fy;
  331. m_flArrayx.RemoveAll();
  332. m_flArrayy.RemoveAll();
  333. while(j++<i){
  334. fx=m_flArrayxTemp.GetAt(j-1);
  335. fy=m_flArrayyTemp.GetAt(j-1);
  336. m_flArrayx.Add(fx);
  337. m_flArrayy.Add(fy);
  338. }
  339. m_bModified=FALSE;
  340. m_ptMagnifyCenterTemp=CPoint(0,0);
  341. m_flScaleTemp=1;
  342. m_ptRotateCenterTemp=CPoint(0,0);
  343. m_flAngleTemp=0;
  344. }
  345. }
  346. void CModelCurve3Param::CreatGraph(CArray<float,float>& flArrayX,CArray<float,float>& flArrayY,int nPenWidth,COLORREF color,COLORREF fillColor,SHAPE_FILLSTYLE nStyle)
  347. {
  348. //if(ptArray.GetSize()<2){
  349. // return;
  350. //}
  351. CShape::CreatGraph(flArrayX,flArrayY,nPenWidth,color,fillColor,nStyle);
  352. int i=flArrayX.GetSize();
  353. int j=0;
  354. float flx,fly;
  355. m_flArrayx.RemoveAll();
  356. m_flArrayy.RemoveAll();
  357. m_flArrayxTemp.RemoveAll();
  358. m_flArrayyTemp.RemoveAll();
  359. while(j++<i){
  360. flx=flArrayX.GetAt(j-1);
  361. fly=flArrayY.GetAt(j-1);
  362. m_flArrayx.Add(flx);
  363. m_flArrayy.Add(fly);
  364. //temp
  365. m_flArrayxTemp.Add(flx);
  366. m_flArrayyTemp.Add(fly);
  367. }
  368. }
  369. void CModelCurve3Param::CreatGraph(CArray<CPoint,CPoint>& ptArray,int nPenWidth,COLORREF color,COLORREF fillColor,SHAPE_FILLSTYLE nStyle)
  370. {
  371. //if(ptArray.GetSize()<2){
  372. // return;
  373. //}
  374. CShape::CreatGraph(ptArray,nPenWidth,color,fillColor,nStyle);
  375. int i=ptArray.GetSize();
  376. int j=0;
  377. CPoint pt;
  378. m_flArrayx.RemoveAll();
  379. m_flArrayy.RemoveAll();
  380. m_flArrayxTemp.RemoveAll();
  381. m_flArrayyTemp.RemoveAll();
  382. while(j++<i){
  383. pt=ptArray.GetAt(j-1);
  384. m_flArrayx.Add(pt.x);
  385. m_flArrayy.Add(pt.y);
  386. //temp
  387. m_flArrayxTemp.Add(pt.x);
  388. m_flArrayyTemp.Add(pt.y);
  389. }
  390. }
  391. void CModelCurve3Param::SetPtData(CArray<float,float>& flArrayX,CArray<float,float>& flArrayY)
  392. {
  393. m_flArrayx.Copy(flArrayX);
  394. m_flArrayxTemp.Copy(flArrayX);
  395. m_flArrayy.Copy(flArrayY);
  396. m_flArrayyTemp.Copy(flArrayY);
  397. }
  398. void CModelCurve3Param::GetPtData(CArray<float,float>& flArrayX,CArray<float,float>& flArrayY)
  399. {
  400. flArrayX.Copy(m_flArrayxTemp);
  401. flArrayY.Copy(m_flArrayyTemp);
  402. }
  403. CShape* CModelCurve3Param::GetCopy()
  404. {
  405. CShape* pGraph=new CModelCurve3Param(this);
  406. return pGraph;  
  407. }
  408. ////////////////////////////////////////////////////////////////////////////
  409. ////////////////////////////////////////////////////////////////////////////
  410. void CModelCurve3Param::Move(CDC *pDC,float stepx,float stepy)
  411. {
  412. RefreshData(m_bModified);
  413. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  414. int i=m_flArrayxTemp.GetSize();
  415. int j=0;
  416. float fx,fy;
  417. while(j++<i){
  418. fx=m_flArrayxTemp.GetAt(j-1);
  419. fy=m_flArrayyTemp.GetAt(j-1);
  420. m_flArrayx.SetAt(j-1,fx+stepx);
  421. m_flArrayy.SetAt(j-1,fy+stepy);
  422. m_flArrayxTemp.SetAt(j-1,fx+stepx);
  423. m_flArrayyTemp.SetAt(j-1,fy+stepy);
  424. }
  425. }
  426. void CModelCurve3Param::PartMove(CDC *pDC,float PrevX,float PrevY,float CurX,float CurY)
  427. {
  428. RefreshData(m_bModified);
  429.     if(m_nSelectPtNum>-1){
  430. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  431. m_flArrayxTemp.SetAt(m_nSelectPtNum,CurX);
  432. m_flArrayyTemp.SetAt(m_nSelectPtNum,CurY);
  433. m_flArrayx.SetAt(m_nSelectPtNum,CurX);
  434. m_flArrayy.SetAt(m_nSelectPtNum,CurY);
  435. //CShape::Draw(pDC);
  436.     }
  437. }
  438. void CModelCurve3Param::Rotate(CDC *pDC,float CX,float CY,float flAngle)
  439. {
  440. if(m_flScaleTemp!=1){
  441. RefreshData(TRUE);
  442. }
  443. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  444. m_ptRotateCenterTemp=CPoint(CX,CY);
  445. m_flAngleTemp=flAngle;
  446. m_bModified=TRUE;
  447. int i=m_flArrayx.GetSize();
  448. int j=0;
  449. float fx,fy,fxTemp,fyTemp;
  450. while(j++<i){
  451. fx=m_flArrayx.GetAt(j-1);
  452. fy=m_flArrayy.GetAt(j-1);
  453. fxTemp=((fx-CX)*cos(flAngle)-(fy-CY)*sin(flAngle))+CX;
  454. fyTemp=((fy-CY)*cos(flAngle)+(fx-CX)*sin(flAngle))+CY;
  455. m_flArrayxTemp.SetAt(j-1,fxTemp);
  456. m_flArrayyTemp.SetAt(j-1,fyTemp);
  457. }
  458. }
  459. void CModelCurve3Param::Magnify(CDC *pDC,float CX ,float CY,float flScale)
  460. {
  461. if(m_flAngleTemp!=0){
  462. RefreshData(TRUE);
  463. }
  464. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  465. m_ptMagnifyCenterTemp=CPoint(CX,CY);
  466. m_flScaleTemp=flScale;
  467. m_bModified=TRUE;
  468. int i=m_flArrayx.GetSize();
  469. int j=0;
  470. float fx,fy;
  471. while(j++<i){
  472. fx=m_flArrayx.GetAt(j-1);
  473. fy=m_flArrayy.GetAt(j-1);
  474. fx=(fx-CX)*flScale+CX;
  475. fy=(fy-CY)*flScale+CY;
  476. m_flArrayxTemp.SetAt(j-1,fx);
  477. m_flArrayyTemp.SetAt(j-1,fy);
  478. }
  479. }
  480. ////////////////////
  481. void CModelCurve3Param::LeftToRight(CDC* pDC,CRect rect)
  482. {
  483. RefreshData(m_bModified);
  484. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  485. int i=m_flArrayx.GetSize();
  486. for(int j=0;j<i;j++){
  487. m_flArrayx.SetAt(j,rect.left/1000.0+rect.right/1000.0-m_flArrayx.GetAt(j));
  488. m_flArrayxTemp.SetAt(j,rect.left/1000.0+rect.right/1000.0-m_flArrayxTemp.GetAt(j));
  489. }
  490. // CShape::Draw(pDC);
  491. }
  492. void CModelCurve3Param::TopToBottom(CDC* pDC,CRect rect)
  493. {
  494. RefreshData(m_bModified);
  495. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  496. int i=m_flArrayx.GetSize();
  497. for(int j=0;j<i;j++){
  498. m_flArrayy.SetAt(j,rect.top/1000.0+rect.bottom/1000.0-m_flArrayy.GetAt(j));
  499. m_flArrayyTemp.SetAt(j,rect.top/1000.0+rect.bottom/1000.0-m_flArrayyTemp.GetAt(j));
  500. }
  501. // CShape::Draw(pDC);
  502. }
  503. ////////////////////////////////////////////////////////////////////////////
  504. ////////////////////////////////////////////////////////////////////////////
  505. int CModelCurve3Param::IsInRect(CRect rect)
  506. {
  507. int nRltVal=0,nTemp;
  508. int i=m_flArrayx.GetSize();
  509. int j=0;
  510. float fx1,fy1,fx2,fy2;
  511. while(++j < i){
  512. fx1=m_flArrayxTemp.GetAt(j-1);
  513. fy1=m_flArrayyTemp.GetAt(j-1);
  514. fx2=m_flArrayxTemp.GetAt(j);
  515. fy2=m_flArrayyTemp.GetAt(j);
  516. nTemp=GetLineStateToRect(fx1,fy1,fx2,fy2,rect);
  517.    nRltVal=nRltVal | nTemp;
  518. }
  519. if(nRltVal==3){
  520. nRltVal=1;
  521. }
  522. return nRltVal;
  523. }
  524. CRect CModelCurve3Param::GetBoundaryRect()
  525. {
  526. if(m_flArrayxTemp.GetSize()==0){
  527. return CRect(0,0,0,0);
  528. }
  529. CRect rect(1000*m_flArrayxTemp.GetAt(0),1000*m_flArrayyTemp.GetAt(0),1000*m_flArrayxTemp.GetAt(0),1000*m_flArrayyTemp.GetAt(0));
  530. int i=m_flArrayxTemp.GetSize();
  531. int j=0;
  532. float fx,fy;
  533. while(j++<i){
  534. fx=1000*m_flArrayxTemp.GetAt(j-1);
  535. fy=1000*m_flArrayyTemp.GetAt(j-1);
  536. if(fx<rect.left){
  537. rect.left=fx;
  538. }else if(fx>rect.right){
  539. rect.right=fx;
  540. }
  541. if(fy<rect.top){
  542. rect.top=fy;
  543. }else if(fy>rect.bottom){
  544. rect.bottom=fy;
  545. }
  546. }
  547. return rect;
  548. }
  549. CPoint CModelCurve3Param::GetCenterPoint()
  550. {
  551. CRect rect=GetBoundaryRect();
  552. return rect.CenterPoint();
  553. }
  554. int CModelCurve3Param::IsPointinRegion(POINT point)
  555. {
  556. int nRltVal=0;
  557. int i=m_flArrayx.GetSize();
  558. int j=0;
  559. CPoint pt1,pt2;
  560. CRect rect;
  561. while(++j < i){
  562. pt1.x=m_flArrayxTemp.GetAt(j-1);
  563. pt1.y=m_flArrayyTemp.GetAt(j-1);
  564. pt2.x=m_flArrayxTemp.GetAt(j);
  565. pt2.y=m_flArrayyTemp.GetAt(j);
  566. rect=GetRectFromPoint(pt1,pt2);
  567. if(rect.PtInRect(point)){
  568. nRltVal|=1;
  569. break;
  570. }
  571. }
  572. return nRltVal;
  573. }
  574. //////
  575. int CModelCurve3Param::GetPtState(float flx,float fly,float flRate)
  576. {
  577. int nRltVal=0;
  578. int i=m_flArrayx.GetSize();
  579. int j=0;
  580. CRect rect;
  581. float tmpx,tmpy;
  582. while(j++<i){
  583. tmpx=m_flArrayxTemp.GetAt(j-1);
  584. tmpy=m_flArrayyTemp.GetAt(j-1);
  585. if(IsPtInRect(tmpx-3*flRate,tmpy-3*flRate,tmpx+3*flRate,tmpy+3*flRate,flx,fly)){
  586. nRltVal|=1;
  587. m_nSelectPtNum=j-1;
  588. m_nSelectLineNum=-1;
  589. break;
  590. }
  591. }
  592. if(nRltVal==0){
  593.         m_nSelectPtNum=-1;
  594. m_nSelectLineNum=-1;
  595. }
  596. return nRltVal;
  597. }
  598. //////////////////////////////////////////////////////////////////////
  599. // MODULE   :ExPort
  600. // ABSTRACT :Export to a txt file
  601. // FUNCTION :File->Export...
  602. // NOTE     :
  603. // RETURN   :
  604. // ARGUMENTS:
  605. //              I/O           TYPE      NAME       EXPLANATION
  606. //               O            FILE*    outStream    Out put File
  607. // CREATE   :  FNST)handwolf  2004-4-14
  608. // UPDATE   :  
  609. //          : 
  610. //////////////////////////////////////////////////////////////////////
  611. void CModelCurve3Param::ExPort(FILE* outStream)//增加导出txt功能时用
  612. {
  613. fprintf(outStream, " CModelCurve3Param n");
  614. CShape::ExPort(outStream);
  615. int n=m_flArrayxTemp.GetSize();
  616. int i=0;
  617. fprintf(outStream, "     %d   ",n);
  618. while(i++ < n){
  619. fprintf( outStream, " %f %f",(float)m_flArrayxTemp.GetAt(i-1),(float)m_flArrayyTemp.GetAt(i-1));
  620. }  
  621. fprintf( outStream, "n");
  622. }
  623. //////////////////////////////////////////////////////////////////////
  624. // MODULE   :ImPort
  625. // ABSTRACT :ImPort from a txt file
  626. // FUNCTION :File->ImPort...
  627. // NOTE     :
  628. // RETURN   :
  629. // ARGUMENTS:
  630. //              I/O           TYPE      NAME       EXPLANATION
  631. //               I            FILE*    inStream    in put File
  632. // CREATE   :  FNST)handwolf  2004-4-14
  633. // UPDATE   :  
  634. //          : 
  635. //////////////////////////////////////////////////////////////////////
  636. void CModelCurve3Param::ImPort(FILE* inStream)
  637. {
  638. CShape::ImPort(inStream);
  639. float fx,fy;
  640. int n;
  641. fscanf(inStream, "%d",&n);
  642. int i=0;
  643. while(i++ < n){
  644. fscanf(inStream, "%f%f",&fx,&fy);
  645. m_flArrayx.Add(fx);
  646. m_flArrayy.Add(fy);
  647. //temp
  648. m_flArrayxTemp.Add(fx);
  649. m_flArrayyTemp.Add(fy);
  650. }
  651. }
  652. CString CModelCurve3Param::GetNameString()
  653. {
  654. CString str;
  655. str.LoadString(IDS_MODELCURVE3PARAM);
  656. return str;
  657. }
  658. //////////////////////////////////////////////////////////////////////
  659. //End of File////////////////
  660. ////////////////////////////////////////////////////////////////////////////
  661. ///////////////////////////////////////////////