From jguardon, 3 Years ago, written in GAMBAS.
Embed
  1. ' Gambas class file
  2.  
  3. Private $centro As Point
  4. Private $anguloAguja As Float
  5. Private $cardinales As String[] = ["E", "S", "W", "N"]
  6.  
  7. Property Rumbo As Float 'propiedad para asignar rumbo desde otra función
  8.  
  9. Event VChange
  10.  
  11. Public Sub Form_Open()
  12.  
  13.     $centro = Point(DrawingArea1.Width / 2, DrawingArea1.Height / 2)
  14.     Slider1.Value = 90
  15.  
  16.  
  17. '' Disparamos el evento cada vez que cambia el valor de Rumbo
  18. Public Sub Form_VChange()
  19.  
  20.  
  21.  
  22.     DrawingArea1.Refresh
  23.  
  24.  
  25. Public Sub DrawingArea1_Draw()
  26.  
  27.     Dim X, iniTickX, iniTickY, finTickX, finTickY As Integer
  28.     Dim nTicks As Integer = 12
  29.     Dim AnguloTick As Float
  30.     Dim agujaX, agujaY, agujaXfin, agujaYfin As Integer
  31.  
  32.     Draw.LineStyle = Line.Solid
  33.     Draw.LineWidth = 4
  34.     Draw.Circle($centro.X, $centro.Y, DrawingArea1.Height / 2 - 5)
  35.  
  36.     ' Ticks principales
  37.     Draw.LineWidth = 3
  38.     For X = 0 To nTicks
  39.         AnguloTick = X * 30
  40.         AnguloTick = Rad(AnguloTick)
  41.         iniTickX = (Cos(AnguloTick) * ((DrawingArea1.Width / 2) - 6)) + DrawingArea1.Width / 2
  42.         iniTickY = (Sin(AnguloTick) * ((DrawingArea1.Height / 2) - 6)) + DrawingArea1.Height / 2
  43.         finTickX = (Cos(AnguloTick) * ((DrawingArea1.Width / 2) - 20)) + DrawingArea1.Width / 2
  44.         finTickY = (Sin(AnguloTick) * ((DrawingArea1.Height / 2) - 20)) + DrawingArea1.Height / 2
  45.         Draw.Line(iniTickX, iniTickY, finTickX, finTickY)
  46.     Next
  47.  
  48.     ' Ticks secundarios
  49.     nTicks = 60
  50.     Draw.LineWidth = 1
  51.     For X = 0 To nTicks
  52.         AnguloTick = X * 6
  53.         AnguloTick = Rad(AnguloTick)
  54.         iniTickX = (Cos(AnguloTick) * ((DrawingArea1.Width / 2) - 6)) + DrawingArea1.Width / 2
  55.         iniTickY = (Sin(AnguloTick) * ((DrawingArea1.Height / 2) - 6)) + DrawingArea1.Height / 2
  56.         finTickX = (Cos(AnguloTick) * ((DrawingArea1.Width / 2) - 15)) + DrawingArea1.Width / 2
  57.         finTickY = (Sin(AnguloTick) * ((DrawingArea1.Height / 2) - 15)) + DrawingArea1.Height / 2
  58.         Draw.Line(iniTickX, iniTickY, finTickX, finTickY)
  59.     Next
  60.  
  61.     ' Puntos cardinales
  62.     nTicks = 3
  63.     For X = 0 To nTicks
  64.         AnguloTick = X * 90
  65.         AnguloTick = Rad(AnguloTick)
  66.         iniTickX = (Cos(AnguloTick) * ((DrawingArea1.Width / 2) - 40)) + ((DrawingArea1.Width / 2) - 5)
  67.         iniTickY = (Sin(AnguloTick) * ((DrawingArea1.Height / 2) - 40)) + ((DrawingArea1.Height / 2) - 5)
  68.         Draw.Text($cardinales[X], iniTickX, iniTickY)
  69.     Next
  70.  
  71.     ' Texto rumbo
  72.     $rumbo = Rad($rumbo)
  73.     Draw.Foreground = Color.Magenta
  74.     Draw.Font = Font["Arial, Bold, 12"]
  75.     Draw.Text(CStr(Round(Deg($rumbo) + 90)) & "º", DrawingArea1.width / 2 - 12, DrawingArea1.Height / 2 + 65, 30, 10, Align.Center)
  76.  
  77.     ' Aguja o apuntador
  78.     Draw.LineWidth = 5
  79.     Draw.Foreground = Color.Red
  80.     agujaX = (Cos($rumbo) * ((DrawingArea1.Width / 2) - 24)) + DrawingArea1.Width / 2
  81.     agujaY = (Sin($rumbo) * ((DrawingArea1.Height / 2) - 24)) + DrawingArea1.Height / 2
  82.     agujaXfin = (Cos($rumbo) * ((DrawingArea1.Width / 2) - 276)) + DrawingArea1.Width / 2
  83.     agujaYfin = (Sin($rumbo) * ((DrawingArea1.Height / 2) - 276)) + DrawingArea1.Height / 2
  84.  
  85.     Draw.Line(agujaX, agujaY, $centro.X, $centro.Y)
  86.     Draw.Foreground = Color.Blue
  87.     Draw.Line($centro.X, $centro.Y, agujaXfin, agujaYfin)
  88.  
  89.     ' centro aguja
  90.     Draw.Foreground = Color.Black
  91.     Draw.FillColor = Color.Black
  92.     Draw.FillStyle = Fill.Solid
  93.     Draw.Circle($centro.X, $centro.Y, 7)
  94.  
  95.  
  96. ' "Rumbo": propiedad para asignar rumbo desde otra función
  97.  
  98. Private Function Rumbo_Read() As Float
  99.  
  100.     Return $rumbo
  101.  
  102.  
  103. Private Sub Rumbo_Write(Value As Float)
  104.  
  105.     $rumbo = Value - 90
  106.     Raise VChange
  107.  
  108.  
  109. ' deslizador para probar funcionamiento
  110. Public Sub Slider1_Change()
  111.  
  112.     Me.Rumbo = Slider1.Value
  113.  
  114.