January 15, 2021, 05:04:45 PM

### Author Topic: [bmx] Pie Chart by Silver_Knee [ 1+ years ago ]  (Read 501 times)

#### BlitzBot

• Jr. Member
• Posts: 1
##### [bmx] Pie Chart by Silver_Knee [ 1+ years ago ]
« on: June 29, 2017, 12:28:38 AM »
Title : Pie Chart
Author : Silver_Knee
Posted : 1+ years ago

Description : Draw a full colored pie chart by adding all pie chart pieces to an array. The angle given must be the angle the pie piece ends. The first pie piece will start at angle 0 that is straight down and the pieces are added counterclockwise. The first piece may have an angle of 10, the second an angle of 180, the third an angle of 200 and so on. To build a full pie, the last piece must have an angle of 360.

The code is only safe if all pieces are in order, so no angle is below an angle that came before it in the array, and all angles are between 0 and 360 inclusive.

The chart is drawn with straigt lines. In BB Rects were faster than straight lines, I don't know how it is with BlitzMax and the diffrent drivers here. Also, the code uses two for-loops, so it is probably slow for many pieces and a big radius.

Code :
Code: BlitzMax
1. Function DrawPieChart(x:Float, y:Float, pieces:TPieChartPiece[], radius:Float)
2.         Local lastAngle:Float=0
3.         For Local p:TPieChartPiece=EachIn pieces
4.                 SetColor p.r,p.g,p.b
6.                         'right half - cut to right half with Max here
7.                         Local circleAngle:Float=ACos(dy/radius) 'min 0 / max 180
8.
9.                         If circleAngle<90
10.                                 'bottom
11.                                 If p.angle>circleAngle And circleAngle>lastAngle
13.                                 ElseIf p.angle<=circleAngle
14.                                         DrawLine x+Tan(p.angle)*dy,y+dy,x+Tan(lastAngle)*dy,y+dy
15.                                 EndIf
16.                         Else
17.                                 'top
18.                                 Local dx:Int
19.                                 If p.angle<=180
20.                                         dx=Tan(p.angle)*dy
21.                                 Else
22.                                         dx=0
23.                                 EndIf
24.
25.                                 If p.angle>circleAngle And circleAngle>lastAngle
27.                                 ElseIf p.angle>=circleAngle And lastAngle<=180
28.                                         DrawLine x+dx,y+dy,x+Tan(lastAngle)*dy,y+dy
29.                                 EndIf
30.                         EndIf
31.
32.                         'left half - cut to left half with Min here
33.                         circleAngle=360-circleAngle
34.
35.                         If circleAngle>270
36.                                 'bottom
37.                                 If p.angle>circleAngle And circleAngle>lastAngle
39.                                 ElseIf p.angle>=circleAngle
40.                                         DrawLine Min(x,x-Tan(360-p.angle)*dy),y+dy,Min(x,x-Tan(360-lastAngle)*dy),y+dy
41.                                 EndIf
42.                         Else
43.                                 'top
44.                                 Local dx:Int
45.                                 If lastAngle>=180
46.                                         dx=-Tan(360-lastAngle)*dy
47.                                 Else
48.                                         dx=0
49.                                 EndIf
50.
51.                                 If p.angle>circleAngle And circleAngle>lastAngle
53.                                 ElseIf p.angle<=circleAngle And p.angle>180
54.                                         DrawLine x+Tan(p.angle)*dy,y+dy,x+dx,y+dy
55.                                 EndIf
56.                         EndIf
57.                 Next
60.                 lastAngle=p.angle
61.         Next
62. End Function
63.
64. Type TPieChartPiece
65.         Function Create:TPieChartPiece(angle:Float,r:Int,g:Int,b:Int)
66.                 Local this:TPieChartPiece=New TPieChartPiece
67.                 this.angle=angle
68.                 this.r=r
69.                 this.g=g
70.                 this.b=b
71.                 Return this
72.         End Function
73.
74.         Field angle:Float
75.         Field r:Int,g:Int,b:Int
76. End Type