扇形图绘制位置计算方法
/*
* 计算圆上任意点的位置
* params:
* center:扇形的中心位置
* angle: 当前角度,0度从x轴方向正向开始,顺时针旋转
* radius: 半径
* */
Offset calculateOffset(Offset center, double angle, double radius) {
double dx = 0.0;
double dy = 0.0;
// 计算象限
int flag = (angle / pi * 2).toInt();
double targetAngle;
// x正向
if (angle == 2 * pi) {
return Offset(center.dx + radius, center.dy);
}
// x负向
if (angle == pi) {
return Offset(center.dx - radius, center.dy);
}
// y正向
if (angle == pi / 2 * 3) {
return Offset(center.dx, center.dy - radius);
}
// y负向
if (angle == pi / 2) {
return Offset(center.dx, center.dy + radius);
}
switch (flag) {
case 0: // 第四象限
targetAngle = angle;
dx = cos(targetAngle) * radius + center.dx;
dy = sin(targetAngle) * radius + center.dy;
break;
case 1: // 第三想象限
targetAngle = pi - angle;
dy = center.dy + sin(targetAngle) * radius;
dx = center.dx - cos(targetAngle) * radius;
break;
case 2: // 第二象限
targetAngle = angle - pi;
dx = center.dx - cos(targetAngle) * radius;
dy = center.dy - sin(targetAngle) * radius;
break;
case 3: // 第一象限
targetAngle = 2 * pi - angle;
dx = cos(targetAngle) * radius + center.dx;
dy = center.dy - sin(targetAngle) * radius;
break;
default:
break;
}
return Offset(dx, dy);
}
计算虚线的终点
/*
* 计算虚线的终点
* params:
* isSlant:是否是倾斜的部分
* start: 起点
* width:绘制的长度
* angle:角度
* */
Offset calculateDashEnd(
bool isSlant, double width, Offset start, double angle) {
if (isSlant) {
if (angle > pi) {
// 上左: x,y都减
if (angle <= 3 * pi / 2) {
return Offset(start.dx - width, start.dy - width);
} else {
// 上右: x+,y-
return Offset(start.dx + width, start.dy - width);
}
} else {
// 下左: x-,y+
if (angle > pi / 2) {
return Offset(start.dx - width, start.dy + width);
} else {
// 下右: x,y都加
return Offset(start.dx + width, start.dy + width);
}
}
} else {
// 左
if ((angle > pi / 2) && (angle < 3 * pi / 2)) {
return Offset(start.dx - width, start.dy);
} else {
// 右
return Offset(start.dx + width, start.dy);
}
}
}