drawLineTick method
绘制直线上的Tick(直线可能是斜线) 如果ticks 只有一个则居中 大于等于2则在首尾均匀分布
Implementation
void drawLineTick(Canvas canvas, Paint paint, Offset start, Offset end, List<String> ticks) {
if (ticks.isEmpty || !show) {
return;
}
num b2 = length * length;
num b4 = (length + labelPadding) * (length + labelPadding);
int maxLimit = ticks.length;
int tickCount = ticks.length;
if (ticks.length == 1) {
maxLimit += 1;
} else {
tickCount -= 1;
}
double tickXInterval = (end.dx - start.dx) / tickCount;
double tickYInterval = (end.dy - start.dy) / tickCount;
for (int i = 0; i < maxLimit; i++) {
Offset o1 = Offset(start.dx + i * tickXInterval, start.dy + i * tickYInterval);
Offset o2 = Offset(start.dx + (i + 1) * tickXInterval, start.dy + (i + 1) * tickYInterval);
//计算轴线夹角
double lineAngle = o2.offsetAngle(Offset(start.dx, 0));
double distance = o1.distance2(start);
double c2 = distance * distance + b2;
double c = sqrt(c2);
//夹角
double angle = atan(length / distance) * 180 / pi;
double resultAngle = inside ? (lineAngle - angle) : (lineAngle + angle);
if (resultAngle < 0) {
resultAngle += 360;
}
//Tick End position
Offset o3 = circlePoint(c, resultAngle, start);
lineStyle.drawPolygon(canvas, paint, [o1, o3]);
if (i >= ticks.length) {
continue;
}
///计算文本绘制点
if (ticks.length == 1) {
distance = Offset(start.dx + (i + 0.5) * tickXInterval, start.dy + (i + 0.5) * tickYInterval).distance2(start);
o2 = Offset(start.dx + (i + 1.5) * tickXInterval, start.dy + (i + 1.5) * tickYInterval);
lineAngle = o2.offsetAngle(Offset(start.dx, 0));
}
c2 = distance * distance + b4;
c = sqrt(c2);
angle = atan((length + labelPadding) / distance) * 180 / pi;
resultAngle = inside ? (lineAngle - angle) : (lineAngle + angle);
if (resultAngle < 0) {
resultAngle += 360;
}
Offset textOffset = circlePoint(c, resultAngle, start);
TextDrawConfig config = TextDrawConfig(textOffset, align: toAlignment(lineAngle + 90, inside));
labelStyle.draw(canvas, paint, ticks[i], config);
}
}