Anamorfosi conica -...
Transcript of Anamorfosi conica -...
Anamorfosi conica
Rossetto Silvano
Preludio.
Si prende una sezione quadrata di una foto digitale e la si rielabora con un programma al computer.
L’effetto può essere inquietante: è difficile dire che sia migliorativo per quanto discutibile possa
essere l’originale …
Poniamo ora uno specchio di forma conica sopra il disco
azzurro e osserviamo l’immagine riflessa mettendo
l’occhio sulla sua verticale ad una altezza di 40-50 cm.
La figura deformata si ricompone perfettamente sullo
specchio.
Ci chiediamo come costruire il programma che legga la foto originale e la trasformi (anamorfosi) in
modo che lo specchio a cono la possa ricostruire.
Possiamo partire dall’ultima immagine, che mostra l’anamorfosi e, al centro, la figura ricomposta, e
cercare di esprimere con una formula la relazione tra i punti interni alla circonferenza blu e i punti
esterni.
Il programma scorre tutti i punti della figura reale, ne legge il colore, calcola il punto corrispondente
nella trasformazione e gli assegna il colore letto ottenendo la figura anamorfica.
Parte prima. L’anamorfosi con CABRI
La figura mostra la corrispondenza tra il punto reale
P’, della figura anamorfica; e il punto P ricostruito
dallo specchio a cono attraverso la riflessione del
raggio di luce P’M nel punto di osservazione V.
Il punto P è la proiezione del raggio riflesso MV sulla
base del cono.
Data la simmetria del cono rispetto al suo asse, le
considerazioni geometriche passano dallo spazio al
piano che contiene l’asse e i punti P e P’. La
corrispondenza cercata riguarda quindi la distanza dei
punti P e P’ dal centro O della base del cono.
Rispetto al piano che contiene la base del cono, i due
punti P e P’ si trovano sulla retta radiale del cerchio
base del cono.
Il cono è caratterizzato dal raggio OR e dall'altezza
OH.
Possiamo costruire la figura della sezione del cono in modo da osservare ‘dinamicamente’ come si
corrispondono i due punti P e P’
Questi sono i passi della costruzione con un programma come CABRI.
O e R punti liberi;
retta a per OR, retta b ⊥ a passante per O;
H e V punti liberi su b;
R' simmetrico di R rispetto ad O;
triangolo RR'H;
segmento OR, P su OR;
segmento VP, M = VP ∩ HR;
Q simmetrico di P rispetto a HR;
retta c per H e Q;
P' = c ∩ a
Ora riportiamo sul piano la costruzione della corrispondenza anamorfica, in modo da osservarne
qualche proprietà:
Nuova costruzione.
O’ e Q liberi sul piano.
O, R liberi, a semiretta di origina O e passante per R
retta b ⊥ a, H e V su B
R’ simmetrico di R rispetto a O, triangolo R V R’
circonferenza (compasso) di centro O’ e raggio OR
Γ circonferenza (compasso) di centro O e raggio O’Q
P = Γ ∩ a
traccio la retta PV
retta t simmetrica di PV rispetto a HR
P’ = t ∩ a
Γ1 circonferenza (compasso) di centro O’ e raggio OP’
traccio r semiretta O’Q
Q’ = Γ1 ∩ r
La costruzione è ‘buona’ perché trova la corrispondenza tra Q e Q’ indipendentemente dal fatto che
siano dentro o fuori la circonferenza di base. I punti R, H e V permettono di variare dinamicamente
i parametri dello specchio conico e in modo da poter osservare come varia la relazione tra Q e Q’
Infine possiamo vincolare Q a figure geometriche (segmenti, circonferenze, poligoni …) e tracciare
il luogo di Q’ al variare di Q.
La costruzione permette di fare qualche osservazione in modo ‘virtuale’ da verificare poi con i
conetti a specchio.
Ecco alcuni esempi delle figure trasformate.
La circonferenza azzurra indica la base del cono; si
possono osservare il bordo del ‘semipiano ’verde’, il
cerchio rosso che non contiene il centro della base del
cono e quello blu che invece lo contiene.
Poiché l’anamorfosi effettua una speciale inversione
della base del cono, si può notare che una figura, che
contiene il centro della base, viene proiettata verso
l’esterno nella figura anamorfica e appare con un
‘buco’ (vedi le aree blu e bianca), mentre una figura
che non lo contiene mantiene la convessità.
Parte seconda. Alla ricerca delle formule con DERIVE
Riprendiamo la figura iniziale fatta con CABRI.
Si vuole esprimere la lunghezza del segmento OP’ in funzione della
lunghezza del segmento OP.
Possiamo riferire la figura al piano cartesiano di assi OR e OH.
Si tratta quindi di esprimere l’ascissa di P’ in funzione di quella di P.
La retta P’M è simmetrica della retta PM rispetto al segmento HR.
Si può procedere in questo modo:
1. calcolare le coordinate di P’’, simmetrico di P rispetto al
segmento HR;
2. calcolare M = PV ∩ RH;
3. calcolare l’equazione della retta r (MP’’);
4. calcolare P’ = r ∩ Ox e prenderne l’ascissa.
I passi sono concettualmente semplici, ma piuttosto laboriosi come calcolo algebrico: possiamo
ricorrere ad un programma di calcolo simbolico come Derive.
Calcolo delle coordinate del punto simmetrico P’’ al punto P rispetto all retta (RH).
Predisponiamo in DERIVE la definizione della funzione RETTA(p,q) che produce l’equazione in
forma esplicita della retta per due punti.
La riga #1 calcola l’equazione della retta dati un punto e la
pendenza; la riga #2 calcola il coefficiente angolare dati due
punti e la riga #3 produce l’equazione della retta mettendo
insieme le due funzioni precedenti.
La riga #4 calcola l’equazione della retta che genera la
superficie del cono. Il risultato è in #5.
Dati i punti A e B, vogliamo calcolare le equazioni della
simmetria assiale rispetto alla retta (AB).
Le righe #8 e #9 definiscono due punti generici P0 e P1 che si
corrisponderanno nella simmetria assiale.
Le righe #10 e #11 definiscono in modo generico due punti dell’asse
di simmetria; la riga #12 calcoal (riga #13) l’equazione dell’asse.
Le equazioni della simmetria assiale rispetto alla retta (AB) si possono trovare mettendo a sistema
le due condizioni:
1. le rette (AB) e (P0P1) sono perpendicolari e quindi i coefficienti sono reciproci ed opposti;
2. il punto medio di P0P1 appartiene alla retta (AB)
Le due condizioni si esprimono con il sistema
La cui soluzione ‘generale’ è:
… terribile, si immagini di doverla calcolare a mano, ma con DERIVE …
Imponendo le condizioni del nostro problema: A=(r,0), B=(0,h), P0=(x0,0), le due equazioni si
riducono:
fornendo le coordinate del punto P’’ simmetrico di P
rispetto alla retta (RH) generatrice del cono a specchio.
Calcolare M = PV ∩ RH
Per calcolare il punto P in cui il raggio che parte dal punto P’ si riflette per raggiungere il punto di
vista V occorre risolvere il sistema tra le rette (PV) e (RH):
Calcolare l’ascissa di P’ in funzione dell’ascissa di P e dei parametri del cono
Siamo ora in grado di calcolare l’ascissa del punto P’ e quindi di esprimere analiticamente la
relazione tra il punto P e il suo anamorfico P’: basta calcolare l’equazione della retta (MP’’), righe
#21 e #22) ed intersecarla con l’asse delle ascisse (righe #23 e #24).
Ecco pronta la funzione che permette di calcolare la distanza di un punto anamorfico dal centro del
cono ‘generatore’ a partire da quella del punto reale.
Prima di applicare la funzione ad un programma che generi la trasformazione, ne osserviamo per
via algebrica qualche proprietà e qualche caso speciale in relazione ai parametri del cono.
Definiamo la funzione DIST_ANAM(x)
che calcola la distanza del punto
anamorfico data la distanza x del punto
reale.
I punti che stanno sul bordo della base del
cono sono fissi (righe #26 e #27)
Nella trasformazione anamorfica il centro della base del cono non
ha un unico punto corrispondente perché per il centro passano
tutte le rette radiali. Possiamo però dire che tutti i punti di questo
insieme hanno la stessa distanza dal centro. Si osservi che questa è
la distanza massima dei punti anamorfici che definisce quindi il
disco immagine della base del cono. E’ interessante notare che il
disco immagine ha un raggio che dipende SOLO dai parametri del cono (raggio r e altezza h), ma
NON dal punto di osservazione dal quale osserviamo la figura.
Due domande: cosa succede quando h < r e cosa quando h = r?
Gli specchi a cono della collezione
sono a sezione equilatera.
Il disco anamorfico ha raggio 3r, a
destra la dimostrazione senza parole.
Domanda: qual è lo sviluppo della superficie laterale di questi
coni?
Parte terza. Anamorfosi – inversione circolare: torniamo in CABRI
Analizziamo il caso particolare di h=r,
cioè di un cono retto.
La funzione della distanza si riduce
drasticamente.
Si può anche osservare che il disco
immagine ha in questo caso raggio
infinito.
Il fattore (r-v), che compare nella funzione distanza, suggerisce un’ulteriore caso particolare: v = r
che corrisponde a mettere l’occhio esattamente sul vertice del cono (… non raccomandato,
potremmo pensarlo come caso limite da osservare con una fotocamera digitale).
In queste condizioni la funzione si riduce ulteriormente:
ponendo v = r, la funzione si riduce alla semplicissima
forma r2/x che caratterizza l’inversione circolare
E’ immediato osservare che l’inversione circolare è
INVOLUTORIA, ossia AUTOINVERSA …
Possiamo tornare in CABRI e confermare questa essenziale caratteristica che distingue la generica
anamorfosi dal caso limite dell’inversione circolare. E’ utile, per questo scopo, ridefinire la
costruzione dell’anamorfosi conica in modo da utilizzarla come ‘macro’ e poterla applicare a punti
diversi. Il file anamorfosi_macro.fig mostra la costruzione della macro utilizzata poi nel file
verso_inversione_circolare.fig con il quale si ottengono le due figure seguenti.
Nella figura a sinistra il punto Q, vincolato alla circonferenza blu, viene trasformato nel punto Q’.
Il punto Q’ traccia il luogo ‘rosso’ al variare di Q nella sua circonferenza. Se trasformiamo Q’in
Q’’, applicando la stessa anamorfosi, il nuovo punto genera, al variare di Q, il luogo ‘verde’.
Q’’ non coincide con Q e il suo luogo non si sovrappone alla circonferenza blu.
Quando si spostano i punti H e V in modo che il cono sia retto e V (punto di vista) stia su H (vertice
del cono), Q’’ coincide con Q e quindi il suo luogo si sovrappone alla circonferenza blu.
(in realtà, l’anamorfosi conica è sempre involutoria, basta mettere l’occhio sul vertice … lo si può
verificare geometricamente con CABRI e algebricamente con DERIVE)
Alla ricerca della costruzione più bella
L’inversione circolare apre un fronte molto ampio di domande. Eccone alcune:
1. Costruzioni alternative dell’inversione circolare
a. adattando l’anamorfosi al caso particolare:
b. seconda alternativa …
c. terza alternativa …
d. altre? Vedi figure cabri
In una inversione circolare a cosa corrispondono le rette?
Si può costruire con CABRI una macro basata su una delle costruzioni precedenti (data una
circonferenza) oppure anche usare la costruzione INVERSIONE predefinita
Il punto P’ è l’inverso rispetto alla circonferenza blu
del punto P vincolato alla retta verde.
Il luogo geometrico di P’, quando P si muove sulla
retta, è la circonferenza rossa che passa per il centro
della circonferenza base dell’inversione.
Nell’inversione circolare, a rette corrispondono
circonferenze che passano per il centro della
circonferenza base.
L’inversione circolare definisce una geometria
nella quale le rette sono circonferenze che passano
per un punto fisso (centro dell’inversione).
Si conservano gli angoli, ma non le distanze (che
dipendono dalla circonferenza base). Nel piano
inverso possiamo considerare come angolo tra due
‘rette’ (circonferenze che passano per il centro
dell’inversione) l’angolo delle rispettive rette
(euclidee) tangenti.
Parte quarta. Dalla formula al programma: clik – trasforma – stampa … ooooh …
L’aspetto è ‘tecnico’ e il tempo a disposizione insufficiente. Ci limitiamo a riportare il programma
in pascal che utilizza la formula della distanza del punto anamorfico per produrre la figura
trasformata.
unit anamorfosi;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,unit3,unit4;
type
TForm1 = class(TForm)
open1: TOpenDialog;
save1: TSaveDialog;
dati_cono: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Bottone_calcola: TButton;
Bottone_Apri: TButton;
procedure Bottone_calcolaClick(Sender: TObject);
procedure Bottone_ApriClick(Sender: TObject);
procedure calcola;
procedure colora(i,j,x,y:integer);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
controllo_file:boolean;
file_in,file_out:string;
bitmap_in:tbitmap;
bitmap_out:tbitmap;
di,de,v,h,r:real;
larg_bmp:integer;
scala_video:real;
implementation
{$R *.DFM}
procedure TForm1.Bottone_calcolaClick(Sender: TObject);
var err:integer;
begin
if Controllo_file=false then
begin
Open1.execute;
File_in:=open1.FileName;
end;
bitmap_in.loadfromfile(file_in);
(* lettura dimensioni della bitmap*)
larg_bmp:=bitmap_in.Width;
(* lettura delle dimensioni del cono*)
val(edit1.text,r,err);
val(edit2.text,h,err);
val(edit3.Text,v,err);
calcola;
end;
procedure TForm1.Bottone_ApriClick(Sender: TObject);
var rgn:hrgn;
rct:trect;
begin
file_in:='';
Open1.execute;
File_in:=open1.FileName;
if file_in <> '' then
controllo_file:=true;
form_in.visible:=true;
bitmap_in.loadfromfile(file_in);
rct:=rect(0,0,form_in.clientwidth,form_in.clientwidth);
rgn:=createEllipticrgn(0,0,form_in.clientwidth,form_in.clientwidth);
selectcliprgn(form_in.img_in.canvas.Handle,rgn);
form_in.img_in.canvas.stretchdraw(rct,bitmap_in);
end;
function distanza_int(de,r,h,v:real):real;
begin
distanza_int:=v*(2*h*h*r-de*(h*h-r*r))/(2*de*h*r+h*h*v-2*h*r*r+r*r*v);
end;
procedure tform1.colora(i,j,x,y:integer);
var i1,j1:integer;
begin
bitmap_out.canvas.pixels[i,j]:=bitmap_in.canvas.pixels[x,y];
with form4 do
begin
i1:=round(i*scala_video)+img_out.left;
j1:=round(j*scala_video)+img_out.top;
canvas.Pixels[i1,j1]:=bitmap_in.canvas.pixels[x,y];
img_out.canvas.Pixels[i1-img_out.left,j1-
img_out.top]:=bitmap_in.canvas.pixels[x,y];
end;
end;
(* Calcolo partendo dalle coordinate del punto anamorfico la
posizione del punto reale leggendone il colore lo assegno
al punto di partenza *)
procedure Tform1.calcola;
var i,j,x,y,R_PX:integer;
h_px,v_px:real;
larg_bmp_anam:real;
larg_reale:real;
s:string;
l_med:integer;
alfa:real;
begin
(* avendo dato le dimensioni del cono in cm le riferisco alla dim.
in px della figura *)
r_px:=ROUND(larg_bmp/2);
h_px:=h*r_px/r;
v_px:=v*r_px/r;
(* larg_bmp_anam = dimensione max della bitmap anamorfica
nel ciclo poi considero il valore medio l_med*)
larg_bmp_anam:=2*h_px*h_px*r_px/(h_px*h_px-r_px*r_px);
larg_reale:=2*h*h*r/(h*h-r*r)*2;
str(larg_reale:0:1,s);
form4.label2.caption:=s;
l_med:=round(larg_bmp_anam);
(* definisco le dimensioni della bitmap di uscita *)
bitmap_out.width:=round(larg_bmp_anam*2);
bitmap_out.height:=round(larg_bmp_anam*2);
scala_video:=FORM4.img_out.WIDTh/bitmap_out.width;
form4.visible:=true;
(* calcolo la posizione del generico punto di coordinate {i,j} e
verifico che la de sia esterna al raggio del cono e la corrispettiva
di sia interna a questo *)
for i:=0 to l_med do
for j:=0 to l_med do
begin
de:=sqrt(i*i+j*j);
di:=distanza_int(de,r_px,h_px,v_px);
if (de>=r_px) and (de<=l_med) then
begin
if i>0 then
alfa:=arctan(j/i)
else
alfa:=0;
x:=round(di*cos(alfa));
y:=round(di*sin(alfa));
colora(l_med+i,l_med-j,r_px+x,r_px-y);
colora(l_med+i,l_med+j,r_px+x,r_px+y);
colora(l_med-i,l_med-j,r_px-x,r_px-y);
colora(l_med-i,l_med+j,r_px-x,r_px+y);
end
else
begin
bitmap_out.canvas.Pixels[l_med+i,l_med-j]:=clwhite;
bitmap_out.canvas.Pixels[l_med+i,l_med+j]:=clwhite;
bitmap_out.canvas.Pixels[l_med-i,l_med-j]:=clwhite;
bitmap_out.canvas.Pixels[l_med-i,l_med+j]:=clwhite;
end;
end;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
bitmap_in:=tbitmap.create;
bitmap_out:=tbitmap.create;
end;
end.