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

绘图程序

开发平台:

Visual C++

  1. #include "GlobalFunction.h"
  2. #include "stdafx.h"
  3. #include "math.h"
  4. #include "GraphDefines.h"
  5. /////////////////////////////////////////////////////////
  6. CRect GetRectFromPoint(CPoint pt1,CPoint pt2)
  7. {
  8. CRect rect;
  9. rect.left=(pt1.x<=pt2.x?pt1.x:pt2.x);
  10. rect.right=(pt1.x<=pt2.x?pt2.x:pt1.x);
  11. rect.top=(pt1.y<=pt2.y?pt1.y:pt2.y);
  12. rect.bottom=(pt1.y<=pt2.y?pt2.y:pt1.y);
  13. //TRACE("%d,%d|%d,%dn",rect.left,rect.right,rect.top,rect.bottom);
  14. return rect;
  15. }
  16. ///////////////////////////////////////////////////////////
  17. //function      GetAngleFromPoints(...)
  18. //
  19. //            ptCenter
  20. //            ----/--------------------------|ptStart
  21. //               /flRlt
  22. //              /
  23. //               
  24. //                
  25. //                 
  26. //                   
  27. //                   |ptEnd
  28. //
  29. //////////////////////////////////////////////////////////////
  30. float GetAngleFromPoints(CPoint ptCenter,CPoint ptStart,CPoint ptEnd)
  31. {
  32. float flRlt,flAtanA,flAtanB;
  33. if(ptStart.x==ptCenter.x){
  34. if(ptStart.x>ptCenter.x){
  35. flAtanA=PI/2;
  36. }else if(ptStart.x<ptCenter.x){
  37. flAtanA=-PI/2;
  38. }else{
  39. flAtanA=0;
  40. }
  41. }else if(ptEnd.x==ptCenter.x){
  42. if(ptEnd.x>ptCenter.x){
  43. flAtanB=PI/2;
  44. }else if(ptEnd.x<ptCenter.x){
  45. flAtanB=-PI/2;
  46. }else{
  47. flAtanB=0;
  48. }
  49. }else{
  50. flAtanA=atan((ptStart.y-ptCenter.y)/(ptStart.x-ptCenter.x));
  51. flAtanB=atan((ptEnd.y-ptCenter.y)/(ptEnd.x-ptCenter.x));
  52. if(ptStart.y-ptCenter.y>0&&ptStart.x-ptCenter.x<0){
  53. flAtanA+=PI;
  54. }
  55. if(ptStart.y-ptCenter.y<=0&&ptStart.x-ptCenter.x<0){
  56. flAtanA+=PI;
  57. }
  58. if(ptEnd.y-ptCenter.y>0&&ptEnd.x-ptCenter.x<0){
  59. flAtanB+=PI;
  60. }
  61. if(ptEnd.y-ptCenter.y<=0&&ptEnd.x-ptCenter.x<0){
  62. flAtanB+=PI;
  63. }
  64. }
  65. flRlt=flAtanB-flAtanA;
  66. TRACE("%fn",flRlt);
  67. return flRlt;
  68. }
  69. float GetAngleFromPoints(float x2,float y2,float x1,float y1,float x3,float y3)
  70. {
  71. float flRlt,flAtanA,flAtanB;
  72. if(x1==x2){
  73. if(x1>x2){
  74. flAtanA=PI/2;
  75. }else if(x1<x2){
  76. flAtanA=-PI/2;
  77. }else{
  78. flAtanA=0;
  79. }
  80. }else if(x3==x2){
  81. if(x3>x2){
  82. flAtanB=PI/2;
  83. }else if(x3<x2){
  84. flAtanB=-PI/2;
  85. }else{
  86. flAtanB=0;
  87. }
  88. }else{
  89. flAtanA=atan((y1-y2)/(x1-x2));
  90. flAtanB=atan((y3-y2)/(x3-x2));
  91. if(y1-y2>0&&x1-x2<0){
  92. flAtanA+=PI;
  93. }
  94. if(y1-y2<=0&&x1-x2<0){
  95. flAtanA+=PI;
  96. }
  97. if(y3-y2>0&&x3-x2<0){
  98. flAtanB+=PI;
  99. }
  100. if(y3-y2<=0&&x3-x2<0){
  101. flAtanB+=PI;
  102. }
  103. }
  104. flRlt=flAtanB-flAtanA;
  105. TRACE("%fn",flRlt);
  106. return flRlt;
  107. }
  108. ///////////////////////////////////////////////////////////////////////
  109. float GetDistance(CPoint ptStart, CPoint ptEnd)
  110. {
  111. float flRlt;
  112. flRlt=(ptStart.x-ptEnd.x)*(ptStart.x-ptEnd.x)+(ptStart.y-ptEnd.y)*(ptStart.y-ptEnd.y);
  113. flRlt=sqrt(flRlt);
  114. return flRlt;
  115. }
  116. float GetDistance(float flStartx,float flStarty,float flEndx,float flEndy)
  117. {
  118. float flRlt;
  119. flRlt=(flStartx-flEndx)*(flStartx-flEndx)+(flStarty-flEndy)*(flStarty-flEndy);
  120. flRlt=sqrt(flRlt);
  121. return flRlt;
  122. }
  123. ///////////////////////////////////////////////////////////////////////
  124. //////////////////////////////////////////////////////
  125. //function-----GetPointStateToRect
  126. //return value  rtval
  127. //reval = 0------------in
  128. //reval & 1 != 0-------left
  129. //reval & 2 != 0-------right
  130. //reval & 4 != 0-------top
  131. //reval & 8 != 0-------bottom
  132. //////////////////////////////////////////////////////
  133. int GetPointStateToRect(float x,float y,CRect rectRes)
  134. {
  135.     int val=0;
  136. if(x<rectRes.left) val=1;
  137. else if(x>rectRes.right) val=2;
  138. if(y<rectRes.top) val=val+4;
  139. else if(y>rectRes.bottom) val=val+8;
  140. return val;
  141. }
  142. //////////////////////////////////////////////////////
  143. /////////////////////////////////////////////
  144. //function------GetLineStateToRect
  145. //return value
  146. //0----------out
  147. //1----------cut
  148. //2----------in
  149. /////////////////////////////////////////////
  150. ////////
  151. int GetLineStateToRect(float flStartx,float flStarty,float flEndx,float flEndy,CRect rect)
  152. {
  153. int nRtVal=0;
  154. int nPtStartState,nPtEndState;     
  155. nPtStartState = GetPointStateToRect(flStartx,flStarty, rect);
  156. nPtEndState = GetPointStateToRect(flEndx,flEndy,rect);
  157.     if(nPtStartState == 0 && nPtEndState == 0){//in
  158. nRtVal=2;
  159.     }
  160. else if(nPtStartState == 0 || nPtEndState == 0){//cut
  161. nRtVal=1;
  162.     }
  163. else if((nPtStartState & nPtEndState) != 0){ //out 
  164. nRtVal=0;
  165. }else{
  166. //中点对分法
  167. int nTemp;
  168. float Startx,Starty,Endx,Endy,Tempx,Tempy;
  169. Startx=flStartx;
  170. Starty=flStarty;
  171. Endx=flEndx;
  172. Endy=flEndy;
  173. Tempx=(flStartx+flEndx)/2;
  174. Tempy=(flStarty+flEndy)/2;
  175. nTemp=GetPointStateToRect(Tempx,Tempy,rect);        
  176. while(1){
  177. if(nTemp == 0){
  178. nRtVal=1;
  179. break;
  180. }
  181. if(nTemp&nPtStartState){
  182. Startx=Tempx;
  183. Starty=Tempy;
  184. nPtStartState=nTemp;
  185. Tempx=(Startx+Endx)/2;
  186. Tempy=(Starty+Endy)/2;
  187. nTemp=GetPointStateToRect(Tempx,Tempy,rect);
  188. }
  189. if(nTemp&nPtEndState){
  190.                 Endx=Tempx;
  191. Endy=Tempy;
  192. nPtEndState=nTemp;
  193. Tempx=(Startx+Endx)/2;
  194. Tempy=(Starty+Endy)/2;
  195. nTemp=GetPointStateToRect(Tempx,Tempy,rect);
  196. }
  197. if(abs(Startx-Endx)<1 && abs(Starty-Endy)<1){
  198. nRtVal=0;
  199. break;
  200. }
  201. }//while(1)
  202. }//else
  203.     return nRtVal;
  204. }
  205. /////////
  206. int GetLineStateToRect(CPoint ptStart,CPoint ptEnd,CRect rect)
  207. {
  208. return GetLineStateToRect(ptStart.x,ptStart.y,ptEnd.x,ptEnd.y,rect);
  209. }
  210. ///////////////////
  211. void DrawLine(CDC* pDC,CPoint ptStart,CPoint ptEnd,COLORREF color,int penWidth,UINT nStyle )
  212. {
  213. CPen pen,*poldPen;
  214. LOGBRUSH logbr;
  215. //logbr.lbStyle=BS_SOLID;
  216. logbr.lbStyle=nStyle;
  217. logbr.lbColor=color;
  218. pen.CreatePen(PS_GEOMETRIC,penWidth, &logbr);  
  219. poldPen=pDC->SelectObject(&pen);      
  220. pDC->MoveTo(ptStart);
  221. pDC->LineTo(ptEnd);
  222. pDC->SelectObject(poldPen);
  223. }
  224. void DrawLine(CDC* pDC,float flSX,float flSY,float flEX,float flEY,COLORREF color,int penWidth,UINT nStyle )
  225. {
  226. CPoint ptS(flSX,flSY);
  227. CPoint ptE(flEX,flEY);
  228. DrawLine(pDC,ptS,ptE,color,penWidth,nStyle);
  229. }
  230. //////////////////////////////////////////
  231. //////////////////////////////////////////////////////////////
  232. //
  233. //
  234. //                     o     o
  235. //   ptCenter ----------->o
  236. //                     o     o
  237. //
  238. //////////////////////////////////////////////////////////////
  239. void DrawOutRectPoint(CDC *pDC,CPoint ptCenter,COLORREF color)
  240. {
  241. pDC->SetPixel(ptCenter.x-1,ptCenter.y-1,color);
  242. pDC->SetPixel(ptCenter.x-1,ptCenter.y+1,color);
  243. pDC->SetPixel(ptCenter.x+1,ptCenter.y-1,color);
  244. pDC->SetPixel(ptCenter.x+1,ptCenter.y+1,color);
  245. return;
  246. }
  247. void DrawOutRectPoint(CDC *pDC,float flx,float fly,COLORREF color)
  248. {
  249. CPoint pt(flx,fly);
  250. DrawOutRectPoint(pDC,pt,color);
  251. }
  252. ///////////////////////////////////////////////////////////////
  253. int BezierCurve(CDC *pDC,CPoint ptArray[],int n)
  254. {
  255. float *pflX,*pflY; 
  256. float flTempx,flTempy,flU;//flu-------u参数
  257. int i,j;  
  258. if(n<2) return 0; 
  259. pflX=new float[n];
  260. pflY=new float[n];
  261. flTempx=ptArray[0].x;
  262. flTempy=ptArray[0].y;
  263. for(i=0;i<n;i++){
  264. pflX[i]=ptArray[i].x;
  265. pflY[i]=ptArray[i].y;
  266. }
  267. for(flU=0;flU<=1;flU+=0.1/n){
  268. for(i=1;i<n;i++){
  269. for(j=0;j<n-i;j++){
  270. pflX[j]=(1-flU)*pflX[j]+flU*pflX[j+1];
  271. pflY[j]=(1-flU)*pflY[j]+flU*pflY[j+1];
  272. }
  273. }
  274. pDC->MoveTo(flTempx,flTempy);
  275. pDC->LineTo(pflX[0],pflY[0]);
  276. flTempx=pflX[0];
  277. flTempy=pflY[0];
  278. }
  279. delete[] pflX;
  280. delete[] pflY;
  281. return 1;
  282. }
  283. /////////////////////////////
  284. ////////////////
  285. //辅助函数
  286. //return value
  287. //0------out
  288. //1------on line
  289. ///////////////
  290. int GetPtStateToBigLine(float flSx,float flSy,float flEx,float flEy,float flEnlarge,float x,float y)
  291. {
  292. //on the outline
  293. float flFirstx,flFirsty,flSecondx,flSecondy,flThirdx,flThirdy,flForthx,flForthy;
  294.     
  295. flFirstx=flSx-flEnlarge;
  296. flFirsty=flSy;
  297. flSecondx=flSx+flEnlarge;
  298. flSecondy=flSy;
  299. flThirdx=flEx+flEnlarge;
  300. flThirdy=flEy;
  301. flForthx=flEx-flEnlarge;
  302. flForthy=flEy;
  303. if(fabs(flSy-flEy)<15){
  304. flFirsty+=2*flEnlarge;
  305. flSecondy-=2*flEnlarge;
  306. flThirdy-=2*flEnlarge;
  307. flForthy+=2*flEnlarge;
  308. }
  309. int nRltVal=0;
  310. if(y>min(flFirsty,flSecondy)&&y<max(flFirsty,flSecondy))
  311. {
  312. if((flSecondx-(flSecondx-flFirstx)*(flSecondy-y)/(flSecondy-flFirsty))>=x){
  313. nRltVal+=1;
  314. }
  315. }
  316. if(y>min(flThirdy,flSecondy)&&y<max(flThirdy,flSecondy))
  317. {
  318. if((flSecondx-(flSecondx-flThirdx)*(flSecondy-y)/(flSecondy-flThirdy))>=x){
  319. nRltVal+=1;
  320. }
  321. }
  322. if(y>min(flThirdy,flForthy)&&y<max(flThirdy,flForthy))
  323. {
  324. if((flForthx-(flForthx-flThirdx)*(flForthy-y)/(flForthy-flThirdy))>=x){
  325. nRltVal+=1;
  326. }
  327. }
  328. if(y>min(flFirsty,flForthy)&&y<max(flFirsty,flForthy))
  329. {
  330. if((flForthx-(flForthx-flFirstx)*(flForthy-y)/(flForthy-flFirsty))>=x){
  331. nRltVal+=1;
  332. }
  333. }
  334. if(nRltVal==1){  
  335. return 1;
  336. }
  337. return 0;
  338. }
  339. /////////////////////////////////////////////
  340. //////////////////////////////////////////////////////////////////////
  341. // MODULE   :GetCutPtFrom2Line
  342. // ABSTRACT :取得两相交直线的交点
  343. // FUNCTION :在编辑图形时,组成边的移动
  344. // NOTE     :
  345. // RETURN   :返回是否成功得到交点,1--成功
  346. // ARGUMENTS:
  347. //              I/O           TYPE      NAME       EXPLANATION
  348. //               O            CPoint*   pPtRtn     返回交点          
  349. // CREATE   :  FNST)handwolf  2004-4-13
  350. // UPDATE   :  
  351. //          : Modify reason
  352. //////////////////////////////////////////////////////////////////////
  353. int GetCutPtFrom2Line(CPoint pt1,CPoint pt2,CPoint pt3,CPoint pt4,CPoint* pPtRtn)
  354. {
  355. float x1,x2,x3,x4,y1,y2,y3,y4;
  356. float a1,b1,a2,b2;
  357. x1=pt1.x;
  358. x2=pt2.x;
  359. x3=pt3.x;
  360. x4=pt4.x;
  361. y1=pt1.y;
  362. y2=pt2.y;
  363. y3=pt3.y;
  364. y4=pt4.y;
  365. if(x1==x2&&x3==x4){
  366. return 0;
  367. }
  368. if(x1 == x2 ){
  369. a2=(y3-y4)/(x3-x4);
  370. b2=y3-a2*x3;
  371. ((CPoint*)pPtRtn)->x=x1;
  372.         ((CPoint*)pPtRtn)->y=a2*x1+b2;
  373. return 1;
  374. }
  375. if(x3 == x4 ){
  376. a1=(y1-y2)/(x1-x2);
  377. b1=y1-a1*x1;
  378. ((CPoint*)pPtRtn)->x=x3;
  379.         ((CPoint*)pPtRtn)->y=a1*x3+b1;
  380. return 1;
  381. }
  382. a1=(y1-y2)/(x1-x2);
  383. b1=y1-a1*x1;
  384. a2=(y3-y4)/(x3-x4);
  385. b2=y3-a2*x3;
  386. if(a1==a2){
  387. return 0;
  388. }
  389. ((CPoint*)pPtRtn)->x=(b2-b1)/(a1-a2);
  390. ((CPoint*)pPtRtn)->y=a1*(b2-b1)/(a1-a2)+b1;
  391. return 1;
  392. }
  393. int GetCutPtFrom2Line(float x[],float y[],float *xR,float *yR)
  394. {
  395. float a1,b1,a2,b2;
  396. if(fabs(x[0]-x[1])<0.001&&abs(x[2]-x[3])<0.001){
  397. return 0;
  398. }
  399. if(fabs(x[0]-x[1])<0.001 ){
  400. a2=(y[2]-y[3])/(x[2]-x[3]);
  401. b2=y[2]-a2*x[2];
  402. *xR=x[0];
  403.         *yR=a2*x[1]+b2;
  404. return 1;
  405. }
  406. if(fabs(x[2]-x[3])<0.001 ){
  407. a1=(y[0]-y[1])/(x[0]-x[1]);
  408. b1=y[0]-a1*x[0];
  409.     *xR=x[2];
  410.         *yR=a1*x[2]+b1;
  411. return 1;
  412. }
  413. a1=(y[0]-y[1])/(x[0]-x[1]);
  414. b1=y[0]-a1*x[0];
  415. a2=(y[2]-y[3])/(x[2]-x[3]);
  416. b2=y[2]-a2*x[2];
  417. if(a1==a2){
  418. return 0;
  419. }
  420. *xR=(b2-b1)/(a1-a2);
  421. *yR=a1*(b2-b1)/(a1-a2)+b1;
  422. return 1;
  423. }
  424. //////////////////////////////////////////////////////////////////////
  425. // MODULE   :GetDisFromPtToLine
  426. // ABSTRACT :取得点到直线的距离
  427. // FUNCTION :在编辑图形时,椭圆
  428. // NOTE     :
  429. // RETURN   :距离
  430. // ARGUMENTS:
  431. //              I/O           TYPE      NAME       EXPLANATION
  432. //               
  433. // CREATE   :  FNST)handwolf  2004-4-13
  434. // UPDATE   : 
  435. //          : Modify reason
  436. //////////////////////////////////////////////////////////////////////
  437. float GetDisFromPtToLine(CPoint point,CPoint ptLineS,CPoint ptLineE)
  438. {
  439. if(point==ptLineS||point==ptLineE||ptLineE==ptLineS){
  440. return 0;
  441. }
  442. if(ptLineS.x==ptLineE.x){
  443. return fabs(point.x-ptLineS.x);
  444. }
  445. float a,b;
  446. float x1,y1,x2,y2;
  447. //y=a*x+b;
  448. x1=ptLineS.x;
  449. x2=ptLineE.x;
  450. y1=ptLineS.y;
  451. y2=ptLineE.y;
  452. a=(y2-y1)/(x2-x1);
  453.     b=y1-a*x1;
  454. //ax-y+b=0;
  455. float flRlt;
  456. flRlt=fabs(point.y-a*point.x-b)/sqrt(1+a*a);
  457. TRACE("Dis=%fn",flRlt);
  458. return flRlt;
  459. }
  460. float GetDisFromPtToLine(float x,float y,float Sx,float Sy,float Ex,float Ey)
  461. {
  462. if((fabs(x-Sx)<0.5&&fabs(y-Sy)<0.5)||(fabs(x-Ex)<0.5&&fabs(y-Ey)<0.5)||(fabs(Ex-Sx)<0.5&&fabs(Ey-Sy)<0.5)){
  463. return 0;
  464. }
  465. if(Sx==Ex){
  466. return fabs(x-Sx);
  467. float a,b;
  468. float x1,y1,x2,y2;
  469. //y=a*x+b;
  470. x1=Sx;
  471. x2=Ex;
  472. y1=Sy;
  473. y2=Ey;
  474. a=(y2-y1)/(x2-x1);
  475.     b=y1-a*x1;
  476. //ax-y+b=0;
  477. float flRlt;
  478. flRlt=fabs(y-a*x-b)/sqrt(1+a*a);
  479. TRACE("Dis=%fn",flRlt);
  480. return flRlt;
  481. }
  482. ////////////////////////////////////////////////////////////////////////////////
  483. float GetLineRate(float flx1,float fly1,float flx2,float fly2)
  484. {
  485. if(fabs(flx1-flx2)<0.1){
  486. return 1000;//
  487. }
  488. TRACE("Rate=%fn",(fly1-fly2)/(flx1-flx2));
  489. return (fly1-fly2)/(flx1-flx2);
  490. }
  491. float GetLineRate(CPoint ptS,CPoint ptE)
  492. {
  493. return  GetLineRate(ptS.x , ptS.y ,ptE.x ,ptE.y );
  494. }
  495. ///////////////////////////////////////////////////////////////
  496. bool IsPtInRect(float left,float top,float right,float bottom,float x,float y)
  497. {  
  498. if(x<left || x>right)
  499. return false;
  500. if(y<top || y>bottom)
  501. return false;
  502. return true;
  503. }
  504. /////////////////////////////////////////////////////////////////////////////////
  505. //////////////////////////////////////////////////////////////////////
  506. // MODULE   :GetShapeClass
  507. // ABSTRACT :Get a pointer point to a CShape type object By ClassName
  508. // FUNCTION :File->Import...
  509. // NOTE     :
  510. // RETURN   : a pointer point to a CShape type object
  511. // ARGUMENTS:
  512. //              I/O           TYPE      NAME           EXPLANATION
  513. //               I             char*    pChClassName   name of class
  514. // CREATE   :  FNST)handwolf  2004-4-14
  515. // UPDATE   : 
  516. //          : 
  517. //////////////////////////////////////////////////////////////////////
  518. class CShape;
  519. CShape* GetShapeClass(CString strClassName)
  520. {
  521. CRuntimeClass *pClass;
  522. CShape *pShape=NULL;
  523. AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
  524. // AfxLockGlobals(CRIT_RUNTIMECLASSLIST);   
  525. for(pClass = pModuleState->m_classList;pClass!=NULL;pClass=pClass->m_pNextClass){
  526. if(strClassName.Compare(pClass->m_lpszClassName)==0){
  527. pShape=(CShape*)(pClass->CreateObject());
  528. }
  529. }
  530. return pShape;
  531. }
  532. ///////////////////////////////////////////////////////////////////////////////////