根据操作习惯,绘制圆弧只需要三点即可,
需求背景:
点击生成两点后,分别为起点和终点(圆弧的边缘点),第三次点击的时候为圆弧上的点
话不多说,直接代码:
(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
如觉得侵权,请联系我删除