Newsgroup: it.comp.lang.visual-basic
Titolo: [?] RotateFlip [lunghetto, abbiate pazienza]

salve a tutti.
un problema che ha poco a che fare con la programmazione, nel senso che le
"istruzioni" per raggiungere il risultato le conosco :-)
è un problema di logica implementativa, quindi sganciato dal linguaggio
utilizzato.
lavoro con una immagine prodotta dalla scannerizzazione di una radiografia.
il programma si limita ad importare l'immagine altrove prodotta, e questa
potrebbe essere "ruotata" e/o "flippata" (prima domanda: trovare un termine
un po' più decente di "flippata" per indicare la rotazione di 180° rispetto
all'asse verticale o orizzontale). in una prima fase il problema della
"flippatura" non era stato posto, per cui avevo deciso di non modificare
l'immagine sul disco, ma di memorizzare quante rotazioni di 90° aveva subito
l'immagine, in modo da ripresentarla sempre con il giusto orientamento.
introducendo il flip le cose si complicano, in quanto diventa importante
anche l'ordine nel quale vengono eseguite le varie operazioni: se io ruoto
di 90° e poi flippo l'ungo l'asse verticale, ottengo un risultato
completamente diverso rispetto a quello ottenuto prima flippando e poi
ruotando...
quindi, come posso risolvere la questione?
la prima cosa che mi è venuta in mente è quella di impedire la rotazione di
una immagine flippata, per essere sicuro che l'operazione di flip è comunque
l'ultima, e poter riprodurre a colpo sicuro il corretto orientamento, ma è
ovviamente una cosa un po' bruttina.
qualcuno ha un'idea più brillante?
--
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 all'asse verticale o orizzontale).
"Riflessa rispetto a ..."?
oppure "Immagine simmetrica rispetto a..."
In geometria e cristallografia esistono delle "operazioni" di 
riflessione intorno ad un asse, ma adesso la mia memoria non mi aiuta e 
non ho sottomano i testi.
L'italiano e' sfortunatamente meno espressivo nei campi tecnologici.
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 qualcuno ha un'idea più brillante?
In tutta sincerità? Pretenderei che l'immagine non sia rovesciata.
In subordine, richiederei, in fase di input, i gradi e l'asse (e gli
assi...?!) di rovesciamento in modo da sapere sempre, prima o dopo una
rotazione, come deve essere vista l'immagine, in pratica correggerei il/i
rovesciamento/i.

 il/i rovesciamento/i.
prima obiezione: il più delle volte uno si accorge "dopo" che l'immagina va
ruotata/riflessa.
seconda obiezione: se non capisco male questo vorrebbe dire modificare
l'immagine salvata su disco, e questo si sontra con l'attuale logica
implementativa (non è un dramma, ma se si può evitare di modificare quanto
già scritto sono più contento)
terza obiezione: sfronda un po' i messaggi quando rispondi. ho notato che il
mio è pieno di errori di battitura, se lo riposti integralmente aumenti la
mia vergogna
:-)


 orientamento.
( Soluzione 1 )
Scusa non puoi memorizzare on time le modifiche ?
Esempio :
ho una image e un vettore di stringhe per comodita'
Memorizzo con R+ e R- i rotate (+ e - per le direzioni)
e con Fo e Fv (orizzontale e verticale) i flip
ora avrai dei pulsanti per il rotate e il flip, bene,
vettore vuoto = imm originale
clik su un rotate e il vettore si incrementa con un
0: R+
clicco su flip e ACCODO al vettore lo spostamento,
ora se clicco su SAVE salvo il vettore, altrimenti lascio il vettore nella
condizione in cui e' stata aperta (in questo caso vuota)
( Soluzione 2 )
Le possibili combinazioni di rotate e flip sono cmq finite, quindi ad ogni
cambiamento memorizzerei solo un numero da 0 a nCombinazioni in associazione
alla image
logicamente questa soluzione e' + macchinosa perche' devi calcolarti i
passaggi dalla situazione X alla situazione X + Rotate o X + FlipOrizzontale
PS: Come combinazioni ne ho trovate solo 8, dovresti impiegarci d+ a
calcolare i passaggi ma alla fine avrai solo un numerino associato alla imm
ottimizzando anche i passaggi es: se io faccio :
R+
R+
R+
R+
Sono tornato nella posizione iniziale, quindi memorizzo uno 0 e bon !
Fammi sapere che ne pensi !
-- 
-Gigio@Work(?)-

 quanto già scritto sono più contento)
No, non necessariamente. Mantieni l'immagine com'è attualmente su disco (e
quindi puoi anche acquisirne di nuove in ogni modo rovesciate), ma chiedi le
caratteristiche degli errori della stessa, quindi se rovesciata sull'asse X
(a differenza di prima, direi che i gradi di rovesciamento non possono
essere che 180, quindi inutile chiederli, è sufficiente conoscere gli assi
per i quali l'immagini risulta rovesciata) e/o se rovesciata sull'asse Y.
Quando la esponi la mostri correttamente. Ovviamente tendo a dare per
scontato che tu abbia le routine per rovesciare (e non solo ruotare)
un'immagine. Se no, ... non ho capito niente.

 abbia le routine per rovesciare (e non solo ruotare) un'immagine.
beh... non č che le abbia io... le ha direttamente il 
framework.net
 :-)


 associazione alla image
di fatto è praticamente già così.
fino adesso avevo 4 posizioni possibili, quindi memorizzavo un integer da 0
a quattro.
adesso aggiungo 10 per indicare che è stata flippata (consento solo la
rotazione sull'asse verticale, precisazione: su quello che, in quel momento,
è l'asse verticale).
già così sono 8 combinazioni, che però non consentono di identificare
l'orientamento finale dell'immagine.
potrei introdurre questa modifica: se il flip viene chiesto quando è stata
ruotata un numero dispari di volte, memorizzare il flip come verticale... ma
devo ragionarci un po' sopra.
in questi casi è facilissimo progettare qualcosa che va immediatamente in
crisi se solo l'utente fa manovre illogiche ma possibili.


 integer da 0 a quattro.
naturalmente era da 0 a 3 :-(


 l'orientamento finale dell'immagine.
Perchè no? Ipotizzando che (ruotando in senso antiorario) 0 voglia dire
rotazione 0 gradi, 1=90, 2=180, 3=270 e che quindi 10=0+Rov, 11=90+Rov,
12=180+Rov, 13=270+Rov puoi (pseudo-codice):
Call Ruota_in_senso_orario((valore mod 10)*90)
If Fix(valore/10) Then Call Rovescia
... Io, da che ci sei, prevederei anche il rovesciamento sull'asse X, per
esempio con un +100 al valore o il tutto in negativo.

 Perchè no?
perchè, come ho detto prima, la rotazione è rispetto all'asse verticale "di
quel momento".
prova a prendere una immagine, flipparla rispetto all'asse verticale e poi
ruotarla di 90° antiorari, poi riparti dalla posizione originale, prima
ruota e poi flippala. anche se l'hai flippata ancora sull'asse verticale,
rispetto all'immagine stessa hai usato l'altro asse, quindi il risultato è
diverso.


 
Si chiama trasformazione non abeliana.
Finalmente un esame universitario che mi e' servito a qualcosa!
:-)


 Finalmente un esame universitario che mi e' servito a qualcosa!
bene, bravo. è sempre utile sapere come chiamare le cose.
ma fermarsi lì è pericoloso. :-)
il problema come si risolve?


 
Purtroppo non mi hanno promosso all'esame successivo.
;-)


 verticale "di quel momento".
Ancora non ci sono. Per me i dati da inserire e archiviare, senza modificare
l'immagine, dicono com'è l'immagine su disco (per intenderci, 0 se non
ruotata e non rovesciata) e quindi hai tutti gli elementi per mostrarla come
si deve, ruotando e rovesciando al contrario di quanto quel numero dice...
Ovvio che chi introduce il dato, anche per le immagini già archiviate, deve
indicarlo in funzione dello stato dell'immagine depositata in modo che,
appunto, agendo al contrario si possa riportare l'immagine allo stato 0.

 possibili.
bha non so, provo a spiegartela in un altro senso, immagina una matrice
bidimensionale e muoviti dentro di lei considerando un vertice dell'immagine
e se e' Flippata o No :
tu hai :
Matrix(4,2 elementi)
0.0  ' 1 pos originale
1.0  ' rotato di + 90
2.0  ' rotato di + 180
3.0  ' rotato di + 270
0.1  'pos originale flippata lungo l'asse verticale
1.1  ' rotato di + 90 + Flip
2.1  ' rotato di +180 + Flip
3.1  ' rotato di +270 +Flip
http://www.g2kweb.it/_temp/cssoft.jpg
la linea blu rappresenta un lato noto e la rossa un vertice noto, ora con F
e R intendo Fronte e Retro, se ti fai i calcoli sono queste le uniche
combinazioni possibili !
ora tu parti sempre da 0.0 ora cosa fai ? se clicchi su Rotate+ aumenti di
90° e quindi passi dalla posizione
(X.y) alla posizione (X+1.y) , se clikki Rotate- passi da X a X-1, se flippi
in orizzontale passi da Y all'inverso di Y. Se invece flippi in verticale
passi da X,Y a (X+2 ,NotY)
Prova a fare tutti i passaggi che vuoi sull'immagine, io non ho trovato bug
!
Precisazioni
1) logicamente l'incremento della X va gestito
2) lo spreco di una matrice e' solo per muoverti con uno schema ben preciso
3) una volta capite le posizioni e i passaggi potresti tornare al famoso
numero di combinazione da 1 a 8
-- 
-Gigio@Work(?)-

 
A parte gli scherzi, non so se la geometria/algebra puo' venire in tuo 
aiuto, ma  da quel che ricordo era possibile definire delle classi di 
equivalenza di trasformazioni, cioe' esprimere una serie di 
trasformazioni con rotazioni e riflessioni in modo da ottenere lo stesso 
risultato in 2 o piu' modi diversi.
Bisognerebbe trovare qualcosa sui gruppi non abeliani.
Purtroppo devo andare a memoria, ma la rappresentazione era del tipo:
triangolo con vertici che chiamo  1 2 3 (1 in alto, 2 in basso a destra, 
3 in basso a sx)
una rotazione a destra di 120 gradi veniva espressa cosi':
1 2 3
3 2 1
Una riflessione verticale:
1 2 3
1 3 2
L'applicazione di piu' rotazioni, ad esempio, porta ad ottenere il 
triangolo iniziale (con 3 rotazioni).
C'erano poi una serie di teoremi che davano delle indicazioni su cosa si 
ottiene combinando le varie operazioni.
Purtroppo la mia mente vacilla ancora al ricordo. Vedi qui se ti puo' 
essere d'aiuto:
http://www.crema.unimi.it/didattica/matedisc/Gruppi_1_2.html
Guarda la parte sul gruppo simmetrico a n oggetti.
Forse in rete si trova anche qualche "traduzione" per il tuo problema 
specifico...
ciao


 asse, quindi il risultato è diverso.
quarda l'altro post, non puoi scappare qualsiasi tasto premi sai la
posizione in cui ti trovi con questa formuletta :
(X,Y)
Rotate+ (X+1,Y)
Rotate- (X+1,Y)
Flip Verticale (X,not(Y))
Flip Orizzontale (X+2,not(Y))
Tutto qui, prova tutte le combinazioni di spostamenti che vuoi, non scappi !
^_^
-- 
-Gigio@Work(?)-

Prova anche qui, il paragrafo "Un altro esempio"
http://www.crema.unimi.it/didattica/matedisc/Gruppi_1_1.html


 Ancora non ci sono.
perchè forse non ti ho detto come è l'interfaccia utente :-)
l'utente ha a disposizione tre tasti, che potrebbero essere anche due: due
(o uno, la logica è la stessa) che effettua la rotazione, oraria o
antioraria, di 90°, uno che esegue la riflessione lungo l'asse verticale.
immagina cosa succede a cliccare prima su un tasto di rotazione un numero
dispari di volte, e poi effettuare una riflessione, poi invece procedi al
contrario, prima la riflessione e poi lo stesso numero di rotazioni.
il risultato sarà abbastanza diverso.
quindi non posso limitarmi a memorizzare il fatto che l'utente ha ruotato
e/o flippato, devo in qualche modo tenere traccia di quali erano le
condizioni di rotazione nel momento in cui ha effetuato il flip.
la soluzione a cui sto pensando è più difficile a spiegarsi che a farsi :-)
la posizione relativa alla rotazione è indicata dalle unità di un numero a
due cifre:
0 non ruotato
1 ruotato 90° senso orario
2 ruotato 180°
3 ruotato di 270° senso orario
il flip invece dalle decine
0x = non flippato
1x = flippato x
2x = flippato y
3x = flippato sia x che y (eqivale ad una rotazione di 180°, ma non ce ne
frega nulla)
poi, quando viene fatto il click sul pulsante che esegue la riflessione,
considerare questa come effettuata secondo l'asse x se la cifra legata alle
rotazioni è dispari.


 posizione in cui ti trovi con questa formuletta :
sě.
a parte il fatto che l'utente ha a disposizione un solo flip, la logica č di
considerarlo verticale o orizzontale in funzione della rotazione
dell'immagine.
le riflessioni convergono. :-)
thanks to all


 ce ne frega nulla)
Mi ricorda qualcosa... forse le mie ultime 3 ore a cercare di spiegartelo
^_^
:p
-- 
-Gigio@Work(?)-

 le riflessioni convergono. :-)
guarda se hai solo una riflessione possibile e' ancora + semplice ^_^
8 combinazioni e ti muovi con quella formuletta che ti ho postato prima !
-- 
-Gigio@Work(?)-

 spiegartelo ^_^
beh, direi che è la "esplicazione" di quanto accennato nel mio post delle
11.55, non puoi accusarmi di non aver prestato attenzione ai tuoi
suggerimenti :-)


 perchè forse non ti ho detto come è l'interfaccia utente :-)
Possibile, ma c'ho ripensato a pranzo e hai ragione: se non viene fornita la
sequenza delle operazioni (rotazioni/rovesciamenti) non c'è modo certo, da
un solo numero riportante la somma/risultato delle operazioni (ma, appunto,
non la loro sequenza) di ottenere l'immagine "corretta".

 suggerimenti :-)
gattaccio malefico, sempre in piedi cadi :p
-- 
-Gigio@Work(?)-