Public Class Poligono
Inherits Figura
Private lati As Integer
Public Sub New(ByVal luogo As Disegno)
MyBase.New(luogo)
lati = 3
End Sub
Public Overrides Sub disegna(ByVal eliminaPrecedente As Boolean)
If eliminaPrecedente Then
Call cancella()
End If
Dim i As Integer
Dim alfa, passo, beta, ra As Double
Dim coordinate, punti As Tratto
coordinate = getCoordinate()
punti = New Tratto()
beta = arcoTangente(coordinate.fine.X - coordinate.inizio.X, coordinate.fine.Y - coordinate.inizio.Y)
ra = raggio(coordinate)
punti.inizio.X = coordinate.inizio.X + ra * Math.Cos(beta)
punti.inizio.Y = coordinate.inizio.Y + ra * Math.Sin(beta)
passo = (2.0 * Math.PI) / lati
foglio.pennino = pennino
For i = 1 To lati
alfa = beta + i * passo
punti.fine.X = coordinate.inizio.X + ra * Math.Cos(alfa)
punti.fine.Y = coordinate.inizio.Y + ra * Math.Sin(alfa)
foglio.linea(punti.inizio.X, punti.inizio.Y, punti.fine.X, punti.fine.Y)
punti.inizio = punti.fine
Next i
End Sub
Public Overrides Sub cancella()
Dim ra, alfa, passo, beta As Double
Dim i As Integer
Dim punti, centro As Tratto
punti = New Tratto()
centro = GetLeVecchieCoordinate()
beta = arcoTangente(centro.fine.X - centro.inizio.X, centro.fine.Y - centro.inizio.Y)
ra = raggio(centro)
punti.inizio.X = centro.inizio.X + ra * Math.Cos(beta)
punti.inizio.Y = centro.inizio.Y + ra * Math.Sin(beta)
passo = (2.0 * Math.PI) / lati
Dim cancellino As Pen = New Pen(Color.White, pennino.Width + 2)
cancellino.StartCap = Drawing2D.LineCap.Square
cancellino.EndCap = Drawing2D.LineCap.Square
foglio.pennino = cancellino
For i = 1 To lati
alfa = beta + i * passo
punti.fine.X = centro.inizio.X + ra * Math.Cos(alfa)
punti.fine.Y = centro.inizio.Y + ra * Math.Sin(alfa)
foglio.linea(punti.inizio.X, punti.inizio.Y, punti.fine.X, punti.fine.Y)
punti.inizio = punti.fine
Next i
End Sub
Public Overrides Function ToString() As String
Dim coordinate As Tratto
Dim r, dx, dy As Double
coordinate = getCoordinate()
dx = coordinate.fine.X - coordinate.inizio.X
dy = coordinate.fine.Y - coordinate.inizio.Y
r = Math.Pow((dx * dx + dy * dy), 0.5)
Return String.Format("Poligono di {0} lati, inscritto nel cerchio di raggio {1:f3}", lati, r)
End Function
Private Function arcoTangente(ByVal x As Double, ByVal y As Double)
Dim risultato As Double
If x <> 0.0 Then
risultato = Math.Atan(y / x)
Else
If y >= 0 Then
risultato = 0.5 * Math.PI
Else
risultato = 1.5 * Math.PI
End If
End If
If x < 0 Then
risultato += Math.PI
End If
Return risultato
End Function
Public Property numeroLati() As Integer
Get
Return lati
End Get
Set(ByVal value As Integer)
lati = value
If lati < 3 Then
lati = 3
End If
If lati > 60 Then
lati = 60
End If
End Set
End Property
Private Function raggio(ByVal c As Tratto) As Double
Dim dx, dy As Double
dx = c.fine.X - c.inizio.X
dy = c.fine.Y - c.inizio.Y
Return Math.Pow(((dx * dx) + (dy * dy)), 0.5#)
End Function
Public Overrides Function area() As Double
Dim alfa, ra As Double
alfa = Math.PI / lati
ra = raggio(getCoordinate())
Return lati * ra * ra * Math.Sin(alfa) * Math.Cos(alfa)
End Function
Public Overrides Function perimetro() As Double
Return 2.0 * lati * raggio(getCoordinate()) * Math.Sin(Math.PI / lati)
End Function
End Class