Newsgroup: it.comp.lang.visual-basic
Titolo: rotazione di una linea


a.dem...@pn.itnet.it
supponendo che la tua linea sia lunga L:
x=L*cos(a)
y=L*sin(a)
dove a=angolo formato con l'asse delle ascisse.
Naturalmente dovrai sistemare i tuoi riferimenti.
Ciao Marco

devo far ruotare una linea con spostamenti di 10 ° per volta mantenendone
fissa un ' estremità, qual'è la procedura più semplice ?
Ho provato con le formule di rotazione di un punto:
X = x*cos(angolo)-y*sen(angolo)
Y=y*cos(angolo)+x*sen(angolo)
dove x, y è il punto originale e X,Y il punto ruotato. Gli angoli vanno
espressi in radianti (pi*gradi/180)
Solo che all'inizio sembra funzionare, ma poi l'angolo diminuisce sempre di
più fino a creando una figura a raggi.
Purtroppo mi manca il tempo, se qualcuno vuole provare ecco il codice che
usato:
Option Explicit
Dim x1 As Integer
Dim y1 As Integer
Dim x2 As Integer
Dim y2 As Integer
Const pi = 3.14159265358979
Private Sub cmdRuota_Click()
    x2 = x2 * Cos(pi * 10 / 180) - y2 * Sin(pi * 10 / 180)
    y2 = y2 * Cos(pi * 10 / 180) + x2 * Sin(pi * 10 / 180)
    Line (x1, y1)-(x2, y2)
End Sub
Private Sub Form_Load()
    x1 = 1000
    y1 = 1000
    x2 = 2000
    y2 = 2000
    Line (1000, 0)-(1000, 3600)
    Line (0, 1000)-(4800, 1000)
    Line (x1, y1)-(x2, y2)
End Sub

End Sub
Ciao Miemi,
Nel tuo codice ci sono due errori:
1) Nella riga
    "y2 = y2 * Cos(pi * 10 / 180) + x2 * Sin(pi * 10 / 180)"
usi x2 il cui valore è però già stato modificato nella riga precedente.
Devi quindi usate delle variabili temporanee ad es. così:
Private Sub cmdRuota_Click()
    Dim tmpX As Integer, tmpY As Integer
    tmpX = x2
    tmpY = y2
    x2 = tmpX * Cos(pi * 10 / 180) - tmpY * Sin(pi * 10 / 180)
    y2 = tmpY * Cos(pi * 10 / 180) + tmpX * Sin(pi * 10 / 180)
    Line (x1, y1)-(x2, y2)
End Sub
(In realtà tmpY non servirebbe ma mi pare che così il codice sia più ordinato)
2) Le formule che hai usato fanno ruotare il punto (x2,y2) attorno al punto (0,0) e non attorno
all'altra estremità della linea. Per risolvere questo problema devi fare così:
Private Sub cmdRuota_Click()
    Dim tmpX As Integer, tmpY As Integer
    tmpX = x2 - x1
    tmpY = y2 - y1
    x2 = x1 + tmpX * Cos(pi * 10 / 180) - tmpY * Sin(pi * 10 / 180)
    y2 = y1 + tmpY * Cos(pi * 10 / 180) + tmpX * Sin(pi * 10 / 180)
    Line (x1, y1)-(x2, y2)
End Sub
Le formule usate sarebbero queste:
X = x0+(x-x0)*Cos(angolo)-(y-y0)*Sin(angolo)
Y = y0+(y-y0)*Cos(angolo)+(x-x0)*Sin(angolo)
Naturalmente, poi, se non vuoi che la tua linea lasci tracce devi anche preoccuparti di
cancellarla dalla vecchia posizione quando la ruoti.
Per fare questo ti consiglio di disegnare la linea impostando Drawmode su Not (Invert) o su Xor in
modo che, per cancellare la linea ti basta ridisegnarcela sopra e questa sparisce.
Allora la Sub diventa così:
Private Sub cmdRuota_Click()
    Dim tmpX As Integer, tmpY As Integer
    Line (x1, y1)-(x2, y2)
    tmpX = x2 - x1
    tmpY = y2 - y1
    x2 = x1 + tmpX * Cos(pi * 10 / 180) - tmpY * Sin(pi * 10 / 180)
    y2 = y1 + tmpY * Cos(pi * 10 / 180) + tmpX * Sin(pi * 10 / 180)
    Line (x1, y1)-(x2, y2)
End Sub
NB: Se imposti Drawmode su Not non puoi scegliere il colore della linea perché sarà sempre del
colore inverso rispetto allo sfondo su cui viene disegnata.
Se imposti Drawmode su Xor e ForeColor è Nero non vedrai niente: per vedere la linea di un
determinato colore devi fare così:
Me.ForeColor = Colore Xor Me.BackColor
(Naturalmente questo vale solo se stiamo disegnando direttamente sul form e, comunque, la linea
avrà un colore unico solo se lo sfondo è in tinta unita)
Ciao
    Diego
PS. Scusa Meimi se ho esagerato con i particolari (da come ti vedo rispondere sul NG devi essere
esperta) ma qui sul NG questo messaggio può servire ad altri. ^_^


Grazie della spiegazione ^_^