drawDoc.cpp
上传用户:y440e3
上传日期:2010-03-08
资源大小:200k
文件大小:75k
源码类别:

GIS编程

开发平台:

Visual C++

  1. // DrawDoc.cpp : implementation of the CDrawDoc class
  2. //
  3. #include <float.h>
  4. #include "stdafx.h"
  5. #include "Draw.h"
  6. #include <float.h>
  7. #include <math.h>
  8. #include "DrawDoc.h"
  9. #include "Drawview.h"
  10. #include "CntrItem.h"
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. CGraphPara *p_GraphPara; //初试化一个公用的关于图形参数的实例
  17. extern CDrawView *p_View;
  18. extern CMemFile pFile;
  19. float xMinScreen,yMinScreen,xMaxScreen,yMaxScreen;
  20. int RunTimes=0;
  21. extern BOOL b_Draw;
  22. void DPtoVP(float x,float y,int *X,int *Y);
  23. void VPtoDP(int x,int y,float *X,float *Y);
  24. int DLtoVL(float l);
  25. float VLtoDL(int l);
  26. BOOL IsRectCross(float minx,float miny,float maxx,float maxy);
  27. BOOL IsRectCross(float minx,float miny,float maxx,float maxy)
  28. {
  29. if(minx>xMaxScreen||maxx<xMinScreen||miny>yMaxScreen||maxy<yMinScreen) //两个矩形区域不相交
  30. return 0; //如不相交函数返回0
  31. else 
  32. return 1; //如果相交就返回1
  33. }
  34. void DPtoVP(float x,float y,int *X,int *Y)
  35. {
  36. p_View->DPtoVP(x,y,X,Y);
  37. }
  38. void VPtoDP(int x,int y,float *X,float *Y)
  39. {
  40. p_View->VPtoDP(x,y,X,Y);
  41. }
  42.  
  43. int DLtoVL(float l)
  44. {
  45. return p_View->DLtoVL(l);
  46. }
  47. float VLtoDL(int l)
  48. {
  49. return p_View->VLtoDL(l);
  50. }
  51. /////////////////////////////////////////////////////////////////////////////
  52. // CDrawDoc
  53. IMPLEMENT_DYNCREATE(CDrawDoc, COleDocument)
  54. BEGIN_MESSAGE_MAP(CDrawDoc, COleDocument)
  55. //{{AFX_MSG_MAP(CDrawDoc)
  56. ON_UPDATE_COMMAND_UI(ID_SELECT_CLEAR, OnUpdateSelectClear)
  57. ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
  58. ON_UPDATE_COMMAND_UI(ID_SELECT_DELETE, OnUpdateSelectClear)
  59. ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateSelectClear)
  60. ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateSelectClear)
  61. ON_COMMAND(IDC_TEST, OnTest)
  62. //}}AFX_MSG_MAP
  63. // Enable default OLE container implementation
  64. ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, COleDocument::OnUpdatePasteMenu)
  65. ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE_LINK, COleDocument::OnUpdatePasteLinkMenu)
  66. ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_CONVERT, COleDocument::OnUpdateObjectVerbMenu)
  67. ON_COMMAND(ID_OLE_EDIT_CONVERT, COleDocument::OnEditConvert)
  68. ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_LINKS, COleDocument::OnUpdateEditLinksMenu)
  69. ON_COMMAND(ID_OLE_EDIT_LINKS, COleDocument::OnEditLinks)
  70. ON_UPDATE_COMMAND_UI(ID_OLE_VERB_FIRST, COleDocument::OnUpdateObjectVerbMenu)
  71. END_MESSAGE_MAP()
  72. /////////////////////////////////////////////////////////////////////////////
  73. // CDrawDoc construction/destruction
  74. CDrawDoc::CDrawDoc()
  75. {
  76. b_IsOleSelect=0;
  77. p_GraphPara=&m_GraphPara; //将公用的GraphPara类的指针指向当前文档的GraphPara对象
  78. n_GraphSelect=0;
  79. GraphSelect=new GraphSelectStruct[2000]; //最多可选中2000个图形元素
  80. n_MaxUnIndex=10000; //规定可以进行1万步的逆操作
  81. m_UndoList=new UndoStruct[n_MaxUnIndex];
  82. m_UndoList[0].l_Start=0;
  83. char p1[4];
  84. sprintf(p1,"%d",RunTimes);
  85. FileName="c:\draw";
  86. FileName+=p1;
  87. FileName+=".tmp";
  88. Fundo.Open(FileName,CFile::modeCreate|CFile::modeReadWrite|CFile::typeBinary);
  89. RunTimes++;
  90. n_CurUnIndex=0; //当前的逆操作序号为0
  91. EnableCompoundFile();
  92. m_Index=new int[20000];
  93. m_MaxScreen=1000; //最多能够记录在100个历史屏幕
  94. m_Screen=new ScreenStruct[m_MaxScreen];//给记录历史屏幕的数组分配空间
  95. //以下设置首屏的参数并将目前屏幕设置为首屏
  96. m_CurrentScreen=0;
  97. m_Screen[0].sx=0;
  98. m_Screen[0].sy=0;
  99. m_Screen[0].blc=1;
  100. strcpy(DataInfo[0].Name,"城市信息");
  101. DataInfo[0].only_ID=1;
  102. strcpy(DataInfo[1].Name,"连接信息");
  103. DataInfo[1].only_ID=2;
  104. m_NumbData=2;
  105. }
  106. CDrawDoc::~CDrawDoc()
  107. {
  108. delete GraphSelect;
  109. delete m_UndoList;
  110. delete m_Index;
  111. delete m_Screen;
  112. Fundo.Close();
  113. remove(FileName);
  114. }
  115. //绘制选中的图形元素
  116. //Lb-图形类别 Index-绘制图形的序列号 Mode-绘制覆盖模式 Mode1-绘制方式
  117. void CDrawDoc::DrawGraph(CDC* pDC,int Lb,int Index,int Mode,int Mode1,short BackColor)
  118. {
  119. if(Lb==1) //如果是直线
  120. GetLine(Index)->Draw(pDC,Mode,Mode1,BackColor);
  121. else if(Lb==2) //如果是连续直线
  122. GetPLine(Index)->Draw(pDC,Mode,Mode1,BackColor);
  123. else if(Lb==3) //如果圆
  124. GetCircle(Index)->Draw(pDC,Mode,Mode1,BackColor);
  125. else if(Lb==4) //如果是圆弧
  126. GetArc(Index)->Draw(pDC,Mode,Mode1,BackColor);
  127. else if(Lb==5) //如果是标注文字
  128. GetText(Index)->Draw(pDC,Mode,Mode1,BackColor);
  129. }
  130. void CDrawDoc::Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor)
  131. {
  132. int nn=GetNumbLines();//得到直线的数目
  133. while(b_Draw&&nn--) //绘制所有直线
  134. GetLine(nn)->Draw(pDC,m_DrawMode,m_DrawMode1,BackColor);
  135. nn=GetNumbPLines(); //得到连续直线和多边形区域数目
  136. while(b_Draw&&nn--) //绘制所有连续直线和多边形区域
  137. GetPLine(nn)->Draw(pDC,m_DrawMode,m_DrawMode1,BackColor);
  138. nn=GetNumbCircles(); //得到圆的数目
  139. while(b_Draw&&nn--) //绘制所有圆
  140. GetCircle(nn)->Draw(pDC,m_DrawMode,m_DrawMode1,BackColor);
  141. nn=GetNumbArcs(); //得到圆弧的数目
  142. while(b_Draw&&nn--) //绘制所有圆弧
  143. GetArc(nn)->Draw(pDC,m_DrawMode,m_DrawMode1,BackColor);
  144. nn=GetNumbTexts(); //得到文本的数目
  145. while(b_Draw&&nn--) //绘制所有文本
  146. GetText(nn)->Draw(pDC,m_DrawMode,m_DrawMode1,BackColor);
  147. for(int i=0;i<n_GraphSelect;i++)
  148. DrawGraph(pDC,GraphSelect[i].Lb,GraphSelect[i].Index,0,1,BackColor);
  149. }
  150. BOOL CDrawDoc::OnNewDocument()
  151. {
  152. if (!COleDocument::OnNewDocument())
  153. return FALSE;
  154. return TRUE;
  155. }
  156. /////////////////////////////////////////////////////////////////////////////
  157. // CDrawDoc serialization
  158. /*
  159. void CDrawDoc::Serialize(CArchive& ar)
  160. {
  161. if (ar.IsStoring())
  162. {
  163. // TODO: add storing code here
  164. }
  165. else
  166. {
  167. //line1=new CLine (0,0,0,0,0,0,0,0,100,100);
  168. // ar>>line1;
  169. // TODO: add loading code here
  170. }
  171. int nn=m_LineArray.GetSize();
  172. while(nn--)
  173. {
  174. if(m_LineArray.GetAt(nn)->IsDelete())
  175. {
  176. delete m_LineArray.GetAt(nn);
  177. m_LineArray.RemoveAt(nn);
  178. }
  179. }
  180. nn=m_PLineArray.GetSize();
  181. while(nn--)
  182. {
  183. if(m_PLineArray.GetAt(nn)->IsDelete())
  184. {
  185. delete m_PLineArray.GetAt(nn);
  186. m_PLineArray.RemoveAt(nn);
  187. }
  188. }
  189. nn=m_CircleArray.GetSize();
  190. while(nn--)
  191. {
  192. if(m_CircleArray.GetAt(nn)->IsDelete())
  193. {
  194. delete m_CircleArray.GetAt(nn);
  195. m_CircleArray.RemoveAt(nn);
  196. }
  197. }
  198. nn=m_ArcArray.GetSize();
  199. while(nn--)
  200. {
  201. if(m_ArcArray.GetAt(nn)->IsDelete())
  202. {
  203. delete m_ArcArray.GetAt(nn);
  204. m_ArcArray.RemoveAt(nn);
  205. }
  206. }
  207. nn=m_TextArray.GetSize();
  208. while(nn--)
  209. {
  210. if(m_TextArray.GetAt(nn)->IsDelete())
  211. {
  212. delete m_TextArray.GetAt(nn);
  213. m_TextArray.RemoveAt(nn);
  214. }
  215. }
  216. m_LineArray.Serialize(ar);
  217. m_PLineArray.Serialize(ar);
  218. m_CircleArray.Serialize(ar);
  219. m_ArcArray.Serialize(ar);
  220. m_TextArray.Serialize(ar);
  221. n_CurUnIndex=0;
  222. SetModifiedFlag(0);
  223. // Calling the base class COleDocument enables serialization
  224. //  of the container document's COleClientItem objects.
  225. COleDocument::Serialize(ar);
  226. }
  227. */
  228. void CDrawDoc::Serialize(CArchive& ar)
  229. {
  230. CFile *file1;
  231. int n_LineNumb,n_PLineNumb,n_CircleNumb,n_ArcNumb,n_TextNumb;
  232. file1=ar.GetFile();
  233. if (ar.IsStoring())
  234. {
  235. int nn=m_LineArray.GetUpperBound()+1;
  236. while(nn--)
  237. {
  238. if(m_LineArray.GetAt(nn)->IsDelete())
  239. {
  240. delete m_LineArray.GetAt(nn);
  241. m_LineArray.RemoveAt(nn);
  242. }
  243. }
  244. nn=m_PLineArray.GetUpperBound()+1;
  245. while(nn--)
  246. {
  247. if(m_PLineArray.GetAt(nn)->IsDelete())
  248. {
  249. delete m_PLineArray.GetAt(nn);
  250. m_PLineArray.RemoveAt(nn);
  251. }
  252. }
  253. nn=m_CircleArray.GetUpperBound()+1;
  254. while(nn--)
  255. {
  256. if(m_CircleArray.GetAt(nn)->IsDelete())
  257. {
  258. delete m_CircleArray.GetAt(nn);
  259. m_CircleArray.RemoveAt(nn);
  260. }
  261. }
  262. nn=m_ArcArray.GetUpperBound()+1;
  263. while(nn--)
  264. {
  265. if(m_ArcArray.GetAt(nn)->IsDelete())
  266. {
  267. delete m_ArcArray.GetAt(nn);
  268. m_ArcArray.RemoveAt(nn);
  269. }
  270. }
  271. nn=m_TextArray.GetUpperBound()+1;
  272. while(nn--)
  273. {
  274. if(m_TextArray.GetAt(nn)->IsDelete())
  275. {
  276. delete m_TextArray.GetAt(nn);
  277. m_TextArray.RemoveAt(nn);
  278. }
  279. // TODO: add storing code here
  280. }
  281. n_LineNumb=m_LineArray.GetSize();
  282. n_PLineNumb=m_PLineArray.GetSize();
  283. n_CircleNumb=m_CircleArray.GetSize();
  284. n_ArcNumb=m_ArcArray.GetSize();
  285. n_TextNumb=m_TextArray.GetSize();
  286. file1->Write((unsigned char *)&n_LineNumb,sizeof(int));
  287. file1->Write((unsigned char *)&n_PLineNumb,sizeof(int));
  288. file1->Write((unsigned char *)&n_CircleNumb,sizeof(int));
  289. file1->Write((unsigned char *)&n_ArcNumb,sizeof(int));
  290. file1->Write((unsigned char *)&n_TextNumb,sizeof(int));
  291. if(n_LineNumb>0)
  292. {
  293. nn=m_LineArray.GetUpperBound()+1;
  294. while(nn--)
  295. {
  296. if(m_LineArray.GetAt(nn))
  297. GetLine(nn)->Save(file1,1);
  298. }
  299. }
  300. if(n_PLineNumb>0)
  301. {
  302. nn=m_PLineArray.GetUpperBound()+1;
  303. while(nn--)
  304. {
  305. if(m_PLineArray.GetAt(nn))
  306. GetPLine(nn)->Save(file1,1);
  307. }
  308. }
  309. if(n_CircleNumb>0)
  310. {
  311. nn=m_CircleArray.GetUpperBound()+1;
  312. while(nn--)
  313. {
  314. if(m_CircleArray.GetAt(nn))
  315. GetCircle(nn)->Save(file1,1);
  316. }
  317. }
  318. if(n_ArcNumb>0)
  319. {
  320. nn=m_ArcArray.GetUpperBound()+1;
  321. while(nn--)
  322. {
  323. if(m_ArcArray.GetAt(nn))
  324. GetArc(nn)->Save(file1,1);
  325. }
  326. }
  327. if(n_TextNumb>0)
  328. {
  329. nn=m_TextArray.GetUpperBound();
  330. while(nn--)
  331. {
  332. if(m_TextArray.GetAt(nn))
  333. GetText(nn)->Save(file1,1);
  334. }
  335. }
  336. }
  337. else
  338. {
  339. file1->Read((unsigned char *)&n_LineNumb,sizeof(int));
  340. file1->Read((unsigned char *)&n_PLineNumb,sizeof(int));
  341. file1->Read((unsigned char *)&n_CircleNumb,sizeof(int));
  342. file1->Read((unsigned char *)&n_ArcNumb,sizeof(int));
  343. file1->Read((unsigned char *)&n_TextNumb,sizeof(int));
  344. for(int i=0;i<n_LineNumb;i++)
  345. {
  346. CLine* p_Line=new CLine();
  347. p_Line->Save(file1,0);
  348. m_LineArray.Add(p_Line);
  349. }
  350. for(i=0;i<n_PLineNumb;i++)
  351. {
  352. CPline* p_PLine=new CPline();
  353. p_PLine->Save(file1,0);
  354. m_PLineArray.Add(p_PLine);
  355. }
  356. for(i=0;i<n_CircleNumb;i++)
  357. {
  358. CCircle* p_Circle=new CCircle();
  359. p_Circle->Save(file1,0);
  360. m_CircleArray.Add(p_Circle);
  361. }
  362. for(i=0;i<n_ArcNumb;i++)
  363. {
  364. CArc* p_Arc=new CArc();
  365. p_Arc->Save(file1,0);
  366. m_ArcArray.Add(p_Arc);
  367. }
  368. for(i=0;i<n_TextNumb;i++)
  369. {
  370. CText* p_Text=new CText();
  371. p_Text->Save(file1,0);
  372. m_TextArray.Add(p_Text);
  373. }
  374. // TODO: add loading code here
  375. }
  376. SetModifiedFlag(0);
  377. n_CurUnIndex=0;
  378. COleDocument::Serialize(ar);
  379. }
  380. CLine* CDrawDoc::AddLine(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,float X1,float Y1,float X2,float Y2)
  381. {
  382. CLine* p_Line=new CLine(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,X1,Y1,X2,Y2);
  383. m_LineArray.Add(p_Line);
  384. return p_Line;
  385. }
  386. CLine* CDrawDoc::AddLine()
  387. {
  388. CLine* p_Line=new CLine();
  389. m_LineArray.Add(p_Line);
  390. return p_Line;
  391. }
  392. CLine * CDrawDoc::GetLine(int Index)
  393. {
  394. if(Index<0||Index>m_LineArray.GetUpperBound())
  395. return 0;
  396. return m_LineArray.GetAt(Index);
  397. }
  398. int CDrawDoc::GetNumbLines()
  399. {
  400. return m_LineArray.GetSize();
  401. }
  402. CPline* CDrawDoc::AddPLine(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,int Numble,PointStruct* PointList,BOOL Fill)
  403. {
  404. CPline* p_Pline=new CPline(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,Numble,PointList,Fill);
  405. m_PLineArray.Add(p_Pline);
  406. return p_Pline;
  407. }
  408. CPline* CDrawDoc::AddPLine()
  409. {
  410. CPline* p_Pline=new CPline();
  411. m_PLineArray.Add(p_Pline);
  412. return p_Pline;
  413. }
  414. CPline* CDrawDoc::GetPLine(int Index)
  415. {
  416. if(Index<0||Index>m_PLineArray.GetUpperBound())
  417. return 0;
  418. return m_PLineArray.GetAt(Index);
  419. }
  420. int CDrawDoc::GetNumbPLines()
  421. {
  422. return m_PLineArray.GetSize();
  423. }
  424. CCircle* CDrawDoc::AddCircle(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,float CircleX,float CircleY,float CircleR,BOOL Fill)
  425. {
  426. CCircle* p_Circle=new CCircle(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,CircleX,CircleY,CircleR,Fill);
  427. m_CircleArray.Add(p_Circle);
  428. return p_Circle;
  429. }
  430. CCircle* CDrawDoc::AddCircle()
  431. {
  432. CCircle* p_Circle=new CCircle();
  433. m_CircleArray.Add(p_Circle);
  434. return p_Circle;
  435. }
  436. CCircle* CDrawDoc::GetCircle(int Index)
  437. {
  438. if(Index<0||Index>m_CircleArray.GetUpperBound())
  439. return 0;
  440. return m_CircleArray.GetAt(Index);
  441. }
  442. int CDrawDoc::GetNumbCircles()
  443. {
  444. return m_CircleArray.GetSize();
  445. }
  446. CArc* CDrawDoc::AddArc(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,float CircleX,float CircleY,float CircleR,BOOL Fill,float Angle1,float Angle2)
  447. {
  448. CArc* p_Arc=new CArc(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,CircleX,CircleY,CircleR,Fill,Angle1,Angle2);
  449. m_ArcArray.Add(p_Arc);
  450. return p_Arc;
  451. }
  452. CArc* CDrawDoc::AddArc()
  453. {
  454. CArc* p_Arc=new CArc();
  455. m_ArcArray.Add(p_Arc);
  456. return p_Arc;
  457. }
  458. int CDrawDoc::GetNumbArcs()
  459. {
  460. return m_ArcArray.GetSize();
  461. }
  462. CText* CDrawDoc::AddText(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,float StartX,float StartY,float Angle1,float Angle2,float TextHeight,float TextWide,float OffWide,unsigned char TextFont,int TextLong,CString Text)
  463. {
  464. CText* p_Text=new CText(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,StartX,StartY,Angle1,Angle2,TextHeight,TextWide,OffWide,0,Text);
  465. m_TextArray.Add(p_Text);
  466. return p_Text;
  467. }
  468. CText* CDrawDoc::AddText()
  469. {
  470. CText* p_Text=new CText();
  471. m_TextArray.Add(p_Text);
  472. return p_Text;
  473. }
  474. CText* CDrawDoc::GetText(int Index)
  475. {
  476. if(Index<0||Index>m_TextArray.GetUpperBound())
  477. return 0;
  478. return m_TextArray.GetAt(Index);
  479. }
  480. int CDrawDoc::GetNumbTexts()
  481. {
  482. return m_TextArray.GetSize();
  483. }
  484. //在历史屏幕中增加一个屏幕,以供屏幕回溯操作
  485. //(StartX,StartY)屏幕起点,blc为屏幕的比例尺
  486. void CDrawDoc::AddScreen(float StartX,float StartY,float blc)
  487. {
  488. int i;
  489. if(m_CurrentScreen==m_MaxScreen)//如果当前屏幕在50屏上,即没有数组空间再存信息
  490. {
  491. //将数组做堆式滚动将第二屏去掉(screenxy[0]中存储的是首屏信息,操作时不改变)
  492. for(i=1;i<m_MaxScreen-1;i++)
  493. m_Screen[i]=m_Screen[i+1];
  494. }
  495. else    //如果不是最大屏,屏幕记录号增加1
  496. m_CurrentScreen++;
  497. //记录下本屏幕的参数
  498. m_Screen[m_CurrentScreen].sx=StartX;
  499. m_Screen[m_CurrentScreen].sy=StartY;
  500. m_Screen[m_CurrentScreen].blc=blc;
  501. }
  502. /////////////////////////////////////////////////////////////////////////////
  503. // CDrawDoc diagnostics
  504. #ifdef _DEBUG
  505. void CDrawDoc::AssertValid() const
  506. {
  507. COleDocument::AssertValid();
  508. }
  509. void CDrawDoc::Dump(CDumpContext& dc) const
  510. {
  511. COleDocument::Dump(dc);
  512. }
  513. #endif //_DEBUG
  514. COLORREF CGraphPara::GetColor(int n)
  515. {
  516. return m_ColorList[n]; //返回第n种颜色的实际值
  517. }
  518. BOOL CGraphPara::GetDisplayStatue(int n)
  519. {
  520. return m_LayerList[n].b_Display;
  521. }
  522. //计算点(x1,y1)与点(x2,y2)间的距离
  523. float CDraw::CalDisp(float x1,float y1,float x2,float y2)
  524. {
  525. return (float)sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
  526. }
  527. //作用:计算点(xx,yy)到线段(x1,y1)(x2,y2)的距离,返回计算的距离值
  528. float CDraw::PointLine(float xx,float yy,float x1,float y1,float x2,float y2)
  529. {
  530. float a,b,c,ang1,ang2,ang;
  531.     //计算三条边的距离
  532.     a=CalDisp(x1,y1,xx,yy);if(a==0.0)return 0.0;
  533.     b=CalDisp(x2,y2,xx,yy);if(b==0.0)return 0.0;
  534.     c=CalDisp(x1,y1,x2,y2);
  535.     //如果(x1,y1)和(x2,y2)是一个点直接返回距离
  536.     if(c==0.0) return a;
  537. if(a<b) //如果(xx,yy)的点(x1,y1)这条边较短
  538. {
  539. if(y1==y2)
  540. {
  541. if(x1<x2)
  542. ang1=0;
  543. else
  544. ang1=(float)pi;
  545. }
  546. else
  547. {
  548. ang1=(float)acos((x2-x1)/c);
  549. if(y1>y2)ang1=(float)pi*2-ang1;  //直线(x1,y1)-(x2,y2)的弧度
  550. }
  551. ang2=(float)acos((xx-x1)/a);
  552. if(y1>yy)ang2=(float)pi*2-ang2;  //直线(x1,y1)-(xx,yy)的弧度
  553. ang=ang2-ang1;
  554. if(ang<0)ang=-ang;
  555. if(ang>pi) ang=(float)pi*2-ang;  //交角的大小
  556. if(ang>pi/2) return a;    //如果为钝角,直接返回距离
  557. else 
  558. return (a*(float)sin(ang)); //否则返回计算得到的距离 
  559. }
  560. else //如果(xx,yy)的点(x2,y2)这条边较短
  561. {
  562. if(y1==y2)
  563. {
  564. if(x1<x2)
  565. ang1=(float)pi;
  566. else
  567. ang1=0;
  568. }
  569. else
  570. {
  571. ang1=(float)acos((x1-x2)/c);     //直线(x2,y2)-(x1,y1)的斜率的弧度
  572. if(y2>y1)ang1=(float)pi*2-ang1;
  573. }
  574. ang2=(float)acos((xx-x2)/b);     //直线(x2,x1)-(xx,yy)的斜率的弧度
  575. if(y2>yy)ang2=(float)pi*2-ang2;
  576. ang=ang2-ang1;
  577. if(ang<0) ang=-ang;
  578. if(ang>pi) ang=(float)pi*2-ang;  //交角的大小