Consultas, desarrollo de programas y petición de presupuestos:

martes, 28 de agosto de 2012

Dibujo de una espiral: Zoom y Coordenadas del Raton

Otro antiguo ejemplo: dibujo de una espiral con ejes cartesianos:

Enlace de descarga: Enlace


Resolviendo una duda en gambas-es.org, he ampliado un programa de dibujo que viene en wiki-gambas-en-ingles del dibujo de una espiral.
Se trada de dibujar un eje cartesiano, y una espiral.
Yo le he añadido :
- escribir las coordenadas del raton cuando se desplaza por el DrawingArea
Para eso necesitas usar un DrawingArea y para saber el punto donde pulsas con el ratón para definir sus coordenadas, deberás poner su propiedad Tracking en True.
- hacer zoom del dibujo.

Aquí teneis el código fuente y también lo transcribo en el blog:
' Gambas class file
PUBLIC ymax AS Integer
PUBLIC ymin AS Integer
PUBLIC xmax AS Integer
PUBLIC xmin AS Integer
PUBLIC escala AS Float
PUBLIC SUB Form_Open()
ymax = 5
ymin = -5
xmax = 5
xmin = -5
escala = 1
Labelxder.Text = xmax
Labelxizq.Text = xmin
Labelyder.Text = ymax
Labelyizq.Text = ymin
END
PUBLIC SUB DrawingArea1_MouseMove()
DIM x_convertido AS Float
DIM y_convertido AS Float
x_convertido = (Mouse.X - DrawingArea1.Width / 2) * xmax / (DrawingArea1.Width / 2)
y_convertido = (- (Mouse.y - DrawingArea1.height / 2)) * ymax / (DrawingArea1.Height / 2)
LabelCoorX.Text = Format$(x_convertido, "0#.##")
labelcoory.text = Format$(y_convertido, "0#.##")
END
PUBLIC SUB ToolButtonRedubujar_Click()
DIM dymax AS Integer
DIM dymin AS Integer
'DIM ymax AS Integer
'DIM ymin AS Integer
DIM y AS Float
DIM dy AS Float
DIM dyi AS Integer
DIM dxmax AS Integer
DIM dxmin AS Integer
'DIM xmax AS Integer
'DIM xmin AS Integer
DIM x AS Float
DIM dx AS Float
DIM dxi AS Integer
DIM k AS Float
DIM a AS Float
DIM w AS Float
dymax = DrawingArea1.Height
dymin = 0
dxmax = DrawingArea1.Width
dxmin = 0
Draw.Begin(DrawingArea1)
' Draws a line horizontally across the centre of the form
Draw.Line(coorX(0), coory(ymin), coorX(0), coory(ymax))
' Draws a line vertically down the centre of the form
Draw.Line(coorX(xmin), coory(0), coorX(xmax), coory(0))
Draw.Text("5", coorX(5), coory(1))
Draw.Text("-5", coorX(-5), coory(1))
Draw.Text("5", coorX(1), coory(5))
Draw.Text("-5", coorX(1), coory(-5))
Draw.Line(coorX(5), coory(-1), coorX(5), coory(1))
Draw.Line(coorX(-5), coory(-1), coorX(-5), coory(1))
Draw.Line(coorX(-1), coory(5), coorX(1), coory(5))
Draw.Line(coorX(-1), coory(-5), coorX(1), coory(-5))
Draw.End
'Here the spiral starts
FOR k = -100 TO 150 STEP 0.05
a = 0.97
'Distance from 0,0 to the point
w = 0.15
'Angle under whiche the point is seen from the origin
a = a ^ k
w = w * k
x = a * Cos(w)
'x coordinate of each point
y = a * Sin(w)
'y coordinate of each point
Draw.Begin(DrawingArea1)
Draw.Point(coorX(x), coory(y))
Draw.End
NEXT
END
PUBLIC SUB ToolButtonSalir_Click()
ME.Close
END
'-------------------- convertir coordenadas -----------------
PUBLIC FUNCTION coorX(a AS Float) AS Float
RETURN Fix(CFloat(a - xmin) / (xmax - xmin) * (DrawingArea1.Width))
END
PUBLIC FUNCTION coory(b AS Float) AS Float
RETURN DrawingArea1.Height - Fix(CFloat(b - ymin) / (ymax - ymin) * (DrawingArea1.Height))
END
'--------------------zona de zoom ------------
PUBLIC SUB ToolButtonAmpliacion_Click()
DrawingArea1.Clear
escala += 1
ymax = 5 * escala
ymin = -5 * escala
xmax = 5 * escala
xmin = -5 * escala
Labelxder.Text = xmax
Labelxizq.Text = xmin
labelyder.Text = ymax
Labelyizq.Text = ymin
ToolButtonRedubujar_Click
END
PUBLIC SUB ToolButtonReducir_Click()
DrawingArea1.Clear
escala -= 1
IF escala > 0 THEN
ymax = 5 * escala
ymin = -5 * escala
xmax = 5 * escala
xmin = -5 * escala
Labelxder.Text = xmax
Labelxizq.Text = xmin
Labelyder.Text = ymax
Labelyizq.Text = ymin
ToolButtonRedubujar_Click
ENDIF
END
PUBLIC SUB ToolButtonauno_Click()
DrawingArea1.Clear
escala = 1
ymax = 5 * escala
ymin = -5 * escala
xmax = 5 * escala
xmin = -5 * escala
Labelxder.Text = xmax
Labelxizq.Text = xmin
Labelyder.Text = ymax
Labelyizq.Text = ymin
ToolButtonRedubujar_Click
END

No hay comentarios:

Publicar un comentario