找回密码
 立即注册
收起左侧

知道圆心坐标以及圆弧上任意两点坐标,怎样算出外接矩...

10
回复
12852
查看
[复制链接]
累计签到:41 天
连续签到:1 天
来源: 2015-11-19 17:26:45 显示全部楼层 |阅读模式
3Qter豆
知道圆心坐标以及圆弧上任意两点坐标,怎样算出外接矩形的4个顶点坐标,画出一段弧线

最佳答案

查看完整内容

这是我之前做过的项目,源码贴上。使用方法:还有一个,半径这个参数,这个你会算吧?
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2015-11-19 17:26:46 显示全部楼层
这是我之前做过的项目,源码贴上。
  1. /**
  2. * @brief 定义圆的结构体
  3. * 因为画布大小为1440 * 900,
  4. * 所以2个字节的short类型就足够
  5. */
  6. struct Circle
  7. {
  8.     short x;
  9.     short y;
  10.     short r;
  11. };

  12. /**
  13.   * @author yuliuchuan
  14.   * @date 2015-04-10
  15.   * 因为绘图的零度是三点钟方向,
  16.   * 所以用余弦定理计算圆弧上某点的角度,
  17.   * acos()返回值为[0,PI]。
  18.   * 如果点在圆心的上方,则用360减去返回值。
  19.   * 由于物理坐标是以左上角为原点,
  20.   * 逻辑坐标要以左下角为原点,
  21.   * 所以需要进行变换。
  22.   * 即 x1 = x0,y1 = height - y0。
  23.   */
  24. double PainterArea::getAngle(CirclePoint *cl, Point *p1)
  25. {
  26.     int centerX = cl->x;
  27.     int centerY = rect.height() - cl->y;
  28.     int radius = cl->r;

  29.     double px = p1->x;
  30.     double py = rect.height() - p1->y;

  31.     //3点钟方向
  32.     double p3x = centerX + radius;
  33.     double p3y = centerY;

  34.     double a2 = (px - p3x) * (px - p3x) + (py - p3y) * (py - p3y);
  35.     double b2 = radius * radius;
  36.     //double c2 = b2;

  37.     double cosa = (b2 * 2 - a2) / (2 * b2);

  38.     //任意角度的余弦值为[-1.0,1.0];
  39.     //上式可简化为1 - a2 / (2 * b2),
  40.     //所以如果值小于-1.0,则应取-1.0。
  41.     if(cosa < - 1.0){
  42.         cosa = -1.0;
  43.     }
  44.     //换算成角度
  45.     double angle =  acos(cosa) / 3.1415926 * 180;
  46. #ifdef QT_DEBUG
  47.     qDebug()<<"angle:"<<angle;
  48. #endif
  49.     if(py < centerY){
  50.         return (360 - angle);
  51.     }
  52.     return angle;
  53. }

  54. /**
  55.   * @author yuliuchuan
  56.   * @date 2015-04-10
  57.   * 计算变换后的圆的外接矩形
  58.   */
  59. QRectF PainterArea::getCircleRect(Circle *cl)
  60. {
  61.     return QRectF(cl->x - cl->r,rect.height() - cl->y - cl->r,2 * cl->r,2 * cl->r);
  62. }

  63. /**
  64.   * @author yuliuchuan
  65.   * @date 2015-04-10
  66.   * 计算变换后的圆的外接矩形
  67.   */
  68. QRectF PainterArea::getCircleRect(int x, int y, int r)
  69. {
  70.     return QRectF(x - r,rect.height() - y - r,2 * r,2 *r);
  71. }

  72. /**
  73.   * @author yuliuchuan
  74.   * @date 2015-04-10
  75.   * 计算绘制圆弧时的起始角度和跨越角度。
  76.   */
  77. int *PainterArea::get2Angles(CirclePoint *cl, Point *p1, Point *p2)
  78. {
  79.     int *angles = new int[2];
  80.     angles[0] = 0;
  81.     angles[1] = 0;

  82.     angles[0] = int(getAngle(cl,p1));
  83.     angles[1] = int(getAngle(cl,p2));

  84. #ifdef QT_DEBUG
  85.     qDebug()<<"angle1:"<<p1->x<<p1->y<<angles[0];
  86.     qDebug()<<"angle2:"<<p2->x<<p2->y<<angles[1];
  87. #endif
  88.     angles[0] = angles[0];
  89.     //如果末点角度小于起点角度,则加上360度后与起点角度求差,得到跨越角度
  90.     angles[1] = angles[1] < angles[0] ? (angles[1] + 360 - angles[0]) : (angles[1] - angles[0]);

  91.     //在QT中,一度用16表示,
  92.     //正数代表逆时针,负数代表逆时针。
  93.     angles[0] *= (-16);
  94.     angles[1] *= (-16);

  95.     return angles;
  96. }
复制代码
使用方法:
  1. painter.drawEllipse(getCircleRect(cl));
复制代码
还有一个,半径这个参数,这个你会算吧?
回复

使用道具 举报

累计签到:191 天
连续签到:1 天
2015-11-19 19:13:55 显示全部楼层
问题描述不清楚,圆的特征值为圆心和半径。根据圆心和圆弧上任意两点坐标确定圆,但是圆的外接矩形不能唯一确定。
如果是椭圆弧,这个问题还算成立?是不是椭圆弧?
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2015-11-19 21:41:03 显示全部楼层
我做过这个问题,不用那么麻烦,计算起始角度,然后就可以画出来了。
回复

使用道具 举报

累计签到:41 天
连续签到:1 天
2015-11-20 11:24:31 显示全部楼层
Syylc120317 发表于 2015-11-19 21:49
这是我之前做过的项目,源码贴上。使用方法:还有一个,半径这个参数,这个你会算吧?
...

为什么是painter.drawEllipse(这不是画一个椭圆),而不是用painter.drawArc(我需要画一段弧)。画弧,drawArc(int x,int y,int  width,int height,int startAngle,int spanAngle),
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2015-11-20 11:39:17 显示全部楼层
Sirius 发表于 2015-11-20 11:24
为什么是painter.drawEllipse(这不是画一个椭圆),而不是用painter.drawArc(我需要画一段弧)。画弧,d ...

调用方法写错了。因为我做的有画圆的,还有画弧的。回去,我把代码继续贴上。
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-11-20 16:50:12 显示全部楼层
留个脚印 最近也在看怎么做painter之类的
回复

使用道具 举报

累计签到:41 天
连续签到:1 天
2015-11-21 10:17:46 显示全部楼层
Youji 发表于 2015-11-19 19:13
问题描述不清楚,圆的特征值为圆心和半径。根据圆心和圆弧上任意两点坐标确定圆,但是圆的外接矩形不能唯一 ...

圆的外接矩形不能唯一?若是椭圆弧,怎么画?
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2015-11-21 18:21:01 显示全部楼层
本帖最后由 Syylc120317 于 2015-11-21 18:23 编辑

昨天部门活动,回来就很晚了。现在补上代码。
绘制圆弧。
  1. angles = get2Angles(cp,p1,p2);

  2. painter.drawArc(getCircleRect(cp->x,cp->y,cp->r),angles[0],angles[1]);
复制代码
补上CirclePoint结构体定义
  1. /**
  2. * @brief 定义带有交点信息的圆
  3. */
  4. struct CirclePoint
  5. {
  6.     short x;
  7.     short y;
  8.     short r;
  9.     vector<Point> points;//交点
  10. };
复制代码
参与人数 1人气 +2 收起 理由
Sirius + 2 很详细!

查看全部评分总评分 : 人气 +2

回复

使用道具 举报

累计签到:41 天
连续签到:1 天
2015-11-23 10:20:38 显示全部楼层
应经搞定了,不过还是要谢谢你。新手,不知怎样才能把豆子给你?
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2015-11-23 10:56:48 显示全部楼层
Sirius 发表于 2015-11-23 10:20
应经搞定了,不过还是要谢谢你。新手,不知怎样才能把豆子给你?

不客气。选为最佳答案就行了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了