The default pie drawing behavior in .NET does not create a pie slice that has 3d perspective when the bounds are rectangular. In order to give the pie slice 3d perspective you need to transform the angles using a little trig. I'm not a math expert so I'm not going to attempt to explan why/how the formulas work...
Kudos to a ton of math sites and Julijan Sribar for his 3d pie chart for helping me figure this out. The following functions allow you to compute the angles for a 3d perspective:
Private Function To3dSweepAngle(ByVal Bounds As Rectangle, _
ByVal Angle As Single, _
ByVal SweepAngle As Single) As Single
If SweepAngle Mod 180 <> 0 Then
Dim Angle3d As Single = To3dAngle(Bounds, Angle)
SweepAngle = To3dAngle(Bounds, Angle + SweepAngle) - Angle3d
End If
If SweepAngle < 0 Then
SweepAngle += 360
End If
Return SweepAngle
End Function
Private Function To3dAngle(ByVal Bounds As System.Drawing.Rectangle, _
ByVal Angle As Single) As Single
Dim Radians As Single = ToRadian(Angle)
Dim X As Double = Bounds.Width * Math.Cos(Radians)
Dim Y As Double = Bounds.Height * Math.Sin(Radians)
Dim Angle3D As Single = Math.Atan2(Y, X) * 180 / Math.PI
If Angle3D < 0 Then
Return Angle3D + 360
Else
Return Angle3D
End If
End Function
Private Function ToRadian(ByVal Angle As Single) As Single
Return (Math.PI * Angle) / 180
End Function
The following code snipet demonstrates how to draw a pie slice with 3d perspective:
Private Sub Form1_Paint(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim PieBounds As New Rectangle(20, 20, 400, 100)
Dim PieAngle As Single = 150
Dim PieSweepAngle As Single = 100
'--> Determine the 3d angles
PieSweepAngle = To3dSweepAngle(PieBounds, PieAngle, PieSweepAngle)
PieAngle = To3dAngle(PieBounds, PieAngle)
'--> Draw the pie
e.Graphics.FillPie(Brushes.SteelBlue, PieBounds, PieAngle, PieSweepAngle)
End Sub
