Public Class Ellisse
Inherits Figura
Private segmenti As Integer
Public Sub New(ByVal tavolo As Disegno)
MyBase.New(tavolo)
segmenti = 150
End Sub
Public Overrides Sub disegna(ByVal eliminaPrecedente As Boolean)
If eliminaPrecedente Then
cancella()
End If
Dim alfa, omega, passo As Double
Dim ra As PointF
Dim punti As Tratto = New Tratto(), centro As Tratto
centro = getCoordinate()
ra = raggi(centro)
punti.inizio.X = centro.inizio.X + ra.X
punti.inizio.Y = centro.inizio.Y
omega = Math.PI * 2.1
passo = omega / segmenti
alfa = 0
foglio.pennino = pennino
While alfa <= omega
punti.fine.X = centro.inizio.X + ra.X * Math.Cos(alfa)
punti.fine.Y = centro.inizio.Y + ra.Y * Math.Sin(alfa)
foglio.linea(punti.inizio.X, punti.inizio.Y, punti.fine.X, punti.fine.Y)
punti.inizio = punti.fine
alfa += passo
End While
End Sub
Public Overrides Sub cancella()
Dim alfa, omega, passo As Double
Dim punti As Tratto = New Tratto(), centro As Tratto
Dim ra As PointF
centro = GetLeVecchieCoordinate()
ra = raggi(centro)
punti.inizio.X = centro.inizio.X + ra.X
punti.inizio.Y = centro.inizio.Y
omega = Math.PI * 2.1
passo = omega / segmenti
alfa = 0
Dim cancellino As Pen = New Pen(Color.White, pennino.Width + 2)
cancellino.StartCap = Drawing2D.LineCap.Square
cancellino.EndCap = Drawing2D.LineCap.Square
foglio.pennino = cancellino
While alfa <= omega
punti.fine.X = centro.inizio.X + ra.X * Math.Cos(alfa)
punti.fine.Y = centro.inizio.Y + ra.Y * Math.Sin(alfa)
foglio.linea(punti.inizio.X, punti.inizio.Y, punti.fine.X, punti.fine.Y)
punti.inizio = punti.fine
alfa += passo
End While
End Sub
Public Overrides Sub disegna()
disegna(True)
End Sub
Public Overrides Function ToString() As String
Dim rapporto As Double
Dim coordinate As Tratto
Dim ra As PointF
coordinate = getCoordinate()
ra = raggi(coordinate)
If ra.X <> 0 Then
rapporto = ra.Y / ra.X
Else
rapporto = 0
End If
Return String.Format("Ellisse con centro ({0}; {1}) e rapporto tra gli assi {2:F3}", coordinate.inizio.X, coordinate.inizio.Y, rapporto)
End Function
Public Overrides Function area() As Double
Dim ra As PointF
ra = raggi(getCoordinate())
Return Math.PI * ra.X * ra.Y
End Function
Public Overrides Function perimetro() As Double
Dim ra As PointF
ra = raggi(getCoordinate())
Return Math.PI * (3.0 * (ra.X + ra.Y) - Math.Sqrt((3.0 * ra.X + ra.Y) * (ra.X + 3.0 * ra.Y)))
End Function
Private Function raggi(ByVal coordinate As Tratto) As PointF
Dim risultato As PointF
risultato.X = Math.Abs(coordinate.fine.X - coordinate.inizio.X)
risultato.Y = Math.Abs(coordinate.fine.Y - coordinate.inizio.Y)
Return risultato
End Function
End Class