根据操作习惯,绘制圆弧只需要三点即可,
需求背景:
点击生成两点后,分别为起点和终点(圆弧的边缘点),第三次点击的时候为圆弧上的点
话不多说,直接代码:
(Pi = 3.1415926,m_center圆心坐标,m_r半径)
//三点确定一个圆,硬解,可得到表达式(三点一线的时候,则无法形成圆) -- 直接网上搜索有对应的代码,https://blog.csdn.net/liyuanbhu/article/details/52891868 double x1 = sP.x(), x2 = mP.x(), x3 = fP.x(); double y1 = sP.y(), y2 = mP.y(), y3 = fP.y(); double a = x1 - x2; double b = y1 - y2; double c = x1 - x3; double d = y1 - y3; double e = ((x1 * x1 - x2 * x2) + (y1 * y1 - y2 * y2)) / 2.0; double f = ((x1 * x1 - x3 * x3) + (y1 * y1 - y3 * y3)) / 2.0; double det = b * c - a * d; if((x1 == x2 && x1 == x3) || (y1 == y2 && y1 == y3)) { //三点一线, return false; } double x0 = -(d * e - b * f) / det; double y0 = -(a * f - c * e) / det; m_center.setX(x0); m_center.setY(y0); m_r = hypot(x1 - x0, y1 - y0); //计算三点的对应的角度 double angle1 = acos((x1-x0)/(hypot((x1-x0),(y1-y0)))); double angle2 = acos((x2-x0)/(hypot((x2-x0),(y2-y0)))); double angle3 = acos((x3-x0)/(hypot((x3-x0),(y3-y0)))); if(y1-y0 < 0){ angle1 = 2*Pi - angle1; //点1在第三、四象限 }else{ angle1 = angle1; } if(y3-y0 < 0){ angle3 = 2*Pi - angle3; //点2在第三、四象限 }else{ angle3 = angle3; } if(y2-y0 < 0){ angle2 = 2*Pi - angle2; //点3在第三、四象限 }else{ angle2 = angle2; } //上面计算的角度是基于QGraphicsView中的坐标,需要进行转换为数学坐标中的角度 angle1 = 360-angle1*180/Pi; angle2 = 360-angle2*180/Pi; angle3 = 360-angle3*180/Pi; qDebug()<<angle1<<angle2<<angle3; if(angle1 < angle3){ //1是起点,3是终点 if(angle2 < angle3 && angle2 > angle1){ //2在中间,1-2-3 m_angle = angle1; m_spanAngle = angle3 - angle1; }else{ // 2在1-3外面 3-2-1 m_angle = angle3; m_spanAngle = 360-(angle3 - angle1); } }else{ //3是起点,1是终点 正方向-- 3-2-1 if(angle2 < angle1 && angle2 > angle3){ //3-2-1 m_angle = angle3; m_spanAngle = angle1 - angle3; }else{ //1-2-3 m_angle = angle1; m_spanAngle = 360-(angle1 - angle3); } } //m_angle圆弧在圆上的起点角度,m_spanAngle圆弧的角度 qDebug()<<m_angle<<m_spanAngle;
QGraphiceView的坐标系和数学坐标系区别:
上述求圆心的代码参考:https://blog.csdn.net/liyuanbhu/article/details/52891868
如觉得侵权,请联系我删除