fix: fix label render of pie chart, #34

This commit is contained in:
vicanso 2022-11-07 20:34:28 +08:00
parent bdcc871ab1
commit 6f6d6c3447

View file

@ -101,8 +101,23 @@ func (p *pieChart) render(result *defaultRenderResult, seriesList SeriesList) (B
theme := opt.Theme theme := opt.Theme
currentValue := float64(0) currentValue := float64(0)
prevEndX := 0 prevPoints := make([]Point, 0)
prevEndY := 0
isOverride := func(x, y int) bool {
for _, p := range prevPoints {
if math.Abs(float64(p.Y-y)) > labelFontSize {
continue
}
// label可能较多内容不好计算横向占用空间
// 因此x的位置需要中间位置两侧否则认为override
if (p.X <= cx && x <= cx) ||
(p.X > cx && x > cx) {
return true
}
}
return false
}
for index, v := range values { for index, v := range values {
seriesPainter.OverrideDrawingStyle(Style{ seriesPainter.OverrideDrawingStyle(Style{
StrokeWidth: 1, StrokeWidth: 1,
@ -134,13 +149,17 @@ func (p *pieChart) render(result *defaultRenderResult, seriesList SeriesList) (B
endx := cx + int(labelRadius*math.Cos(angle)) endx := cx + int(labelRadius*math.Cos(angle))
endy := cy + int(labelRadius*math.Sin(angle)) endy := cy + int(labelRadius*math.Sin(angle))
// 计算是否有重叠如果有则调整y坐标位置 // 计算是否有重叠如果有则调整y坐标位置
if index != 0 && // 最多只尝试5次
math.Abs(float64(endx-prevEndX)) < labelFontSize && for i := 0; i < 5; i++ {
math.Abs(float64(endy-prevEndY)) < labelFontSize { if !isOverride(endx, endy) {
break
}
endy -= (labelFontSize << 1) endy -= (labelFontSize << 1)
} }
prevEndX = endx prevPoints = append(prevPoints, Point{
prevEndY = endy X: endx,
Y: endy,
})
seriesPainter.MoveTo(startx, starty) seriesPainter.MoveTo(startx, starty)
seriesPainter.LineTo(endx, endy) seriesPainter.LineTo(endx, endy)