January 15, 2021, 05:04:45 PM

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

Offline 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
  5.                 For Local dy:Float= -radius To +radius Step 1
  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
  12.                                         DrawLine x+Sin(circleAngle)*radius,y+dy,x+Tan(lastAngle)*dy,y+dy
  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
  26.                                         DrawLine x+dx,y+dy,x+Sin(circleAngle)*radius,y+dy
  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
  38.                                         DrawLine Min(x,x-Sin(360-circleAngle)*radius),y+dy,Min(x,x-Tan(360-p.angle)*dy),y+dy
  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
  52.                                         DrawLine x-Sin(360-circleAngle)*radius,y+dy,x+dx,y+dy
  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
  58.                 DrawLine x,y,x+Sin(p.angle)*radius,y+Cos(p.angle)*radius
  59.                 DrawLine x,y,x+Sin(lastAngle)*radius,y+Cos(lastAngle)*radius
  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


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal