require "tk"
module Foglio
class Punto
def initialize()
@x=0.0
@y=0.0
@stato=true
end
def copiaValoriIn(altro)
altro.x=@x
altro.y=@y
altro.stato=@stato
end
def distanza(altro)
if @stato and altro.stato
dx=altro.x - @x
dy=altro.y - @y
return (dx * dx + dy * dy) ** 0.5
end
return 0.0
end
def x=(valore)
@x=valore.to_f()
end
def x()
return @x
end
def y=(valore)
@y=valore.to_f()
end
def y()
return @y
end
def stato=(valore)
@stato=valore
end
def stato()
return @stato
end
end
class Segmento
def initialize()
@inizio=Punto.new()
@fine=Punto.new()
end
def lunghezza()
return @inizio.distanza(@fine)
end
def passo()
@fine.copiaValoriIn(@inizio)
end
attr_accessor :inizio
attr_accessor :fine
end
class Pennino
def initialize()
@spessore='1'
@colore='#808080'
end
attr_accessor :spessore
attr_accessor :colore
end
class Grafica
def initialize(posto)
@foglio=posto
@scale=Punto.new()
@limitiFoglio=Segmento.new()
@penna=Pennino.new()
isoDimensiona(-10.0, -7.5, 10.0)
end
def isoDimensiona(x0, y0, xf)
delta=xf - x0
@scale.x=@foglio['width'] / delta
@scale.y=@scale.x
@limitiFoglio.inizio.x=x0
@limitiFoglio.inizio.y=y0
@limitiFoglio.fine.x=xf
@limitiFoglio.fine.x=(@foglio['height'] / @scale.y) + @limitiFoglio.inizio.y
end
def assi(colore)
origine=trasla(Punto.new())
TkcLine.new(@foglio, 0, origine.y.to_i(), @foglio['width'], origine.y.to_i(), 'width' => @penna.spessore, 'fill' => colore)
TkcLine.new(@foglio, origine.x.to_i(), 0, origine.x.to_i(), @foglio['height'], 'width' => @penna.spessore, 'fill' => colore)
end
def cancella(sfondo)
TkcRectangle.new(@foglio, 0, 0, @foglio['width'], @foglio['height'], 'outline' => sfondo, 'fill' => sfondo)
end
def linea(tratto)
if tratto.inizio.stato and tratto.fine.stato
lato=Segmento.new()
lato.inizio=trasla(tratto.inizio)
lato.fine=trasla(tratto.fine)
TkcLine.new(@foglio, lato.inizio.x.to_i(), lato.inizio.y.to_i(), lato.fine.x.to_i(), lato.fine.y.to_i(), 'width' => @penna.spessore, 'fill' => @penna.colore)
end
end
def cerchio(centro, raggio)
lato = Segmento.new
lato.inizio.x = centro.x + raggio
lato.inizio.y = centro.y
alfa = 0
omega = Math::PI * 2.0
passo=(omega - alfa) / 500.0
while alfa <= omega
alfa += passo
lato.fine.x = centro.x + raggio * Math.cos(alfa)
lato.fine.y = centro.y + raggio * Math.sin(alfa)
linea(lato)
lato.passo
end
end
def trasla(coordinata)
p=Punto.new()
p.x=@scale.x * (coordinata.x - @limitiFoglio.inizio.x)
p.y=@foglio['height'] - @scale.y * (coordinata.y - @limitiFoglio.inizio.y)
if p.x < 0
p.x = -1.0
end
if p.x > @foglio['width']
p.x=@foglio['width'] + 1.0
end
if p.y < 0
p.y = -1.0
end
if p.y > @foglio['height']
p.y=@foglio['height']
end
return p
end
attr_accessor :penna
end
end