CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

如何得到弧的端点坐标?

楼主aspiregao()2005-04-06 19:16:32 在 VC/MFC / 图形处理/算法 提问

我用Arc函数画了一段弧,我想直接得到这段弧的两个端点坐标,在windows下好像没有这样的函数,难道需要自己计算吗?  
  请问,如果需要自己算,怎么算呢? 问题点数:50、回复次数:9Top

1 楼I_Love_CPP(Never stop!)回复于 2005-04-06 20:52:23 得分 0

Arc  
  The   Arc   function   draws   an   elliptical   arc.    
   
  BOOL   Arc(  
      HDC   hdc,                   //   handle   to   device   context  
      int   nLeftRect,       //   x-coord   of   rectangle's   upper-left   corner  
      int   nTopRect,         //   y-coord   of   rectangle's   upper-left   corner  
      int   nRightRect,     //   x-coord   of   rectangle's   lower-right   corner  
      int   nBottomRect,   //   y-coord   of   rectangle's   lower-right   corner  
      int   nXStartArc,     //   x-coord   of   first   radial   ending   point  
      int   nYStartArc,     //   y-coord   of   first   radial   ending   point  
      int   nXEndArc,         //   x-coord   of   second   radial   ending   point  
      int   nYEndArc           //   y-coord   of   second   radial   ending   point  
  );  
   
  因此,你要用Arc画一段弧,肯定先要知道2个端点的坐标啊!!Top

2 楼aspiregao()回复于 2005-04-08 08:09:51 得分 0

 
  你用下面的代码画一下就知道了,arc函数中的后两个点不是弧的端点坐标。  
  弧的中心点向由这两个点构成的直线引的射线构成的弧  
   
  pDC->Rectangle(100,100,300,300);  
  pDC->Ellipse(200-2,   200-2,   200+2,   200+2);  
   
  pDC->Arc(100,100,300,300,277,111,245,298);  
  pDC->MoveTo(277,111);  
  pDC->LineTo(245,298);  
   
  CPen   pen(PS_SOLID,0,   RGB(255,0,0));  
  CPen*   OldPen   =   pDC->SelectObject(&pen);  
  pDC->MoveTo(200,200);  
  pDC->LineTo(277,111);  
  pDC->MoveTo(200,200);  
  pDC->LineTo(245,298);  
  pDC->SelectObject(OldPen);Top

3 楼hhoking(妙手仁心)回复于 2005-04-08 10:59:36 得分 30

椭圆公式没忘吧?  
  r   =   (a   *   b)   /   sqrt(cos(A)*cos(A)*b*b   +   sin(A)*sin(A)*a*a);  
  其中  
  a,b是椭圆长短轴,(这个是已知吧?)  
  角度A是就是你说的射线的角度,(那么cos(A)和sin(A)也已知了)  
  r就是你说的中心点到弧端点的长度,  
  那么端点坐标就好求了吧。(注意坐标转换!)Top

4 楼aspiregao()回复于 2005-04-08 13:19:36 得分 0

to   hhoking(妙手仁心)    
  原来还需要自己算呀,我还想着有现成的函数呢。  
  我按照公式算了一下,可以,谢谢  
   
  函数如下:  
  #include   <math.h>  
  #define   PI   3.1415926  
   
  //得到弧的角度  
  double   GetArcAngle(LPCRECT   lpRect,   POINT   pt)  
  {  
  long   a   =   abs((lpRect->right-lpRect->left)/2);  
  long   b   =   abs((lpRect->bottom-lpRect->top)/2);  
   
  double   tanval   =   0;  
  double   angle   =   0;  
  tanval   =   (((lpRect->top+b)-pt.y)*1.0)   /   ((pt.x-(lpRect->left+a))*1.0)   ;  
   
  angle   =   atan(tanval);  
   
  return   angle;  
   
  }  
   
  //根据角度得到弧的端点坐标  
  POINT   GetArcPoint(LPCRECT   lpRect,   double   angle)  
  {  
  long   a   =   abs((lpRect->right-lpRect->left)/2);  
  long   b   =   abs((lpRect->bottom-lpRect->top)/2);  
  double   radio;  
   
  POINT   pt;  
   
  radio   =   (a*b)*1.0   /   sqrt(   (sin(angle)*sin(angle))*(a*a)   +   (cos(angle)*cos(angle))*(b*b)     )   ;  
   
  long   dx,dy;  
  dx   =   (long)(radio*cos(angle));  
  dy   =   (long)(radio*sin(angle));  
   
  pt.x   =   lpRect->left+a   +   dx;  
  pt.y   =   lpRect->top+b   -   dy;  
   
  return   pt;  
  }  
   
  测试代码:  
  CRect   rect(100,   100,   400,   200);  
  POINT   pt1;  
  pt1.x   =   377;  
  pt1.y   =   111;  
   
  POINT   pt2;  
  pt2.x   =   465;  
  pt2.y   =   328;  
   
  long   cx;  
  long   cy;  
  cx   =   rect.left+   (rect.right-rect.left)/2;  
  cy   =   rect.top   +   (rect.bottom-rect.top)/2;  
   
  pDC->Rectangle(rect);  
  pDC->Ellipse(cx-2,   cy-2,   cx+2,   cy+2);  
   
  pDC->Arc(&rect,   pt1,   pt2);  
  pDC->MoveTo(pt1);  
  pDC->LineTo(pt2);  
   
  CPen*   OldPen;  
  CPen   pen1(PS_SOLID,0,   RGB(255,0,0));  
  OldPen   =   pDC->SelectObject(&pen1);  
  pDC->MoveTo(cx,cy);  
  pDC->LineTo(pt1);  
  pDC->MoveTo(cx,cy);  
  pDC->LineTo(pt2);  
  pDC->SelectObject(OldPen);  
   
  double   angle1;  
  double   angle2;  
   
  angle1   =   GetArcAngle(&rect,   pt1);  
  pt1   =   GetArcPoint(&rect,   angle1);  
   
  angle2   =   GetArcAngle(&rect,   pt2);  
  pt2   =   GetArcPoint(&rect,   angle2);  
   
  CPen   pen(PS_SOLID,0,   RGB(255,0,255));  
  OldPen   =   pDC->SelectObject(&pen);  
  pDC->MoveTo(pt1);  
  pDC->LineTo(pt2);  
  pDC->SelectObject(OldPen);  
  Top

5 楼happy__888([顾问团]寻开心 www.e-jjj.com)回复于 2005-04-08 13:36:42 得分 20

椭圆参数方程  
    x   =   a   *   cosA  
    y   =   b   *   sinA  
  A的角度可以根据,nXStart,nYStart和包围矩形中心成的角度来计算  
  这个角度可以是atan2(dx,dy)函数自己算得到Top

6 楼happy__888([顾问团]寻开心 www.e-jjj.com)回复于 2005-04-08 13:39:43 得分 0

计算角度   不能用     atan    
  应该用   atan2  
   
  否则在x的负半轴上计算就会出现错误的Top

7 楼aspiregao()回复于 2005-04-08 15:00:21 得分 0

谢谢   happy__888([顾问团]寻开心)   ,   atan   在x的负半轴上确实计算错误,应该用   atan2Top

8 楼aspiregao()回复于 2005-04-08 16:12:34 得分 0

我感觉arc函数不能画出所有形状的弧,比如说我用和短轴a的x坐标重合的线的端点作为arc的后两个坐标参数,那么画出的弧是向右开口的半个弧。我怎样用arc画出向左开口的半个弧呢Top

9 楼aspiregao()回复于 2005-04-08 16:37:40 得分 0

自己太愚了,调整坐标的先后顺序就可以画出需要的弧。  
  结贴!Top

相关问题

  • ★★★已知一段弧的两个端点坐标和弧度,如何求出弧的中点坐标★★★
  • 红着脸问一个问题,已知弧的两个端点的坐标和弧的弧度,如何求出圆心坐标。
  • 已知两线端点的经纬坐标,求交点的经纬坐标?
  • 怎么样光滑的连接两条直线,直线的两个端点坐标都已知。
  • 怎样得到,窗体的坐标
  • 如何在ASP中得到坐标?
  • 如何得到CButton对象的坐标?
  • 如何得到屏幕上的坐标
  • *****如何得到鼠标的坐标*****
  • 怎样得到鼠标的坐标

关键词

  • 坐标
  • 函数
  • 弧
  • 端点
  • lprect
  • angle
  • coord
  • pdc
  • arc
  • tanval

得分解答快速导航

  • 帖主:aspiregao
  • hhoking
  • happy__888

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo