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 SweepAngleEnd FunctionPrivate 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 IfEnd FunctionPrivate Function ToRadian(ByVal Angle As Single) As Single Return (Math.PI * Angle) / 180End 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