<< | #415 ; Por kalkuli simplan reflekton el spegulo |
>> |
En la antaŭa artikolo mi jam prezentis foton pri bildo el finna libro, principan bildon pri luma reflekto el ebena spegulo. Mi kontinuos por pritrakti la temon. Mi desegnis sube similan bildon iom alie tiel ke ĝi pli bone taŭgas por miaj celoj.
En la apuda desegnaĵo estas L la vektoro de eniranta luma radio kaj la vektoro R prezentas la reflekton de tio lumradio el spegulo. La vektoro N estas orta al la surfaco de spegulo. Ni volas kalkuli la direkton de reflektita lumo, la vektoron R kiam ni scias la vektorojn N kaj L.
La desegnaĵo estas nur 2-dimensia, sed la sama principo taŭgas ankaŭ bone por 3D-kazo, se oni uzas 3-dimensiaj vektoroj. Por miaj celoj povus la 2D-kazo tamen provizore esti sufiĉe bona por simplaj kalkuloj.
Speciale grava vektoro en la bildo estas nomita LN, ĝi estas la komponanto de vektoro L kio estas samdirekta kun la al spegulo orta vektoro N. Ni notu ke ĉi tio komponanto restas la sama en reflekto el spegulo. La anguloj de venanta kaj reflektita lumradio kontraŭ la orta vektoro estas same grandaj.
Uzante skalaraj produtoj ( · ) de vektoroj ni povas esprimi la komponanton de lumo laŭ la orta vektoro N kiam la longo de orta vektoro estas "normigita" al longo 1. Mi supozas ke oni jam kalkulis la "normigitan" vektoron n = N / |N|
tiel ke la longo de n estas unuo, |n| = 1
.
LN = ( L · n ) n
La rezulto de skalara produto L · n
ja estas nura nombro (skalaro) kaj per tio oni multiplikas la vektoron n por produkti la vektoron LN.
Sekve oni povas facile kalkuli la vektoron R de reflektita lumo, subtrahante la komponanton LN du fojoj el la vektoro de al spegulo venonta lumo L. Ĉi tion oni klare vidas en la apuda desegnaĵo, kie la vektoro R aperas en du lokoj. Plej grava ja estas la direkto de vektoro. Ni ja scias aparte la punkton de reflekto kie la vektoro startas. Klare validas R = L + 2 * ( - LN )
R = L - 2 LN = L - 2 ( L · n ) n
Reflekto el ebena spegulo eble ne estas la plej interesa kazo. Mia ideo estas por uzi la formulojn por sfera spegulo. Tiam oni certe devas atenti ke la al surfaco perpendikla vektoro estas iom alia en aliaj lokoj de spegulo. Tamen estas la reflekto principe la sama kiam oni atentas la lokan ortan vektoron en la punkto kie la spegulo reflektas la lumradion.
La apuda kruda desegnaĵo provas prezenti la ideon de sfera spegulo kaj al optika akso oblikva lumo. Certe la skalo estas tute absurda, sed ni pensu pri la principoj. En realo mi preferus sferan spegulon ekzemple diametro D = 100 milimetroj, aperturo f/10, do la fokusa distanco f = 10 * D = 1 metro. Mi esperas ke la eraroj en tia spegulo estus sufiĉe malgrandaj por uzi kun fotilo por foti la stelan ĉielon.
Se la lumo venus al spegulo samdirekte kun la optika akso, estus la fokuso de reflektita lumo en punkto f en la optika akso. Nia lumo tamen alvenas oblikve. La fokuso ne estas tre bona, sed eble uzebla?
El centro de spegulo la lumradio L2 reflektas same kiel el vertikala ebena spegulo ĉar la al surfaco perpendikla vektoro N2 estas horizontala.
Ĉiu lumradio reflektas el spegulo tiel ke la angulo kontraŭ la loka orta vektoro N estas la sama en la venonta lumo kaj la reflektita lumo. La lumradioj tamen estas en aliaj flankoj de orta vektoro.
Tre grave do estas por kalkuli la direkton de loka malgranda ebeno ĉe la punkto kaj de loka orta vektoro en ĉiuj la punktoj kie la lumo trafas la spegulon. La spegulo ja estas sfera kaj tial la kalkulado ne estas tre malfacila.
La bona loko por fotilo estus proksimume tie kie la reflektitaj lumradioj renkontas unu la alian. Ĉiuj la lumradioj ja ne renkontas precize en unu kaj sama punkto. Mi tamen esperas ke por "malrapida" spegulo la eraro povus esti nur kelkaj rastrunuoj sur la fotila sensilo kaj tial akceptebla? Mi tamen devas kalkuli unue.
En la apuda absurda, nur principa desegnaĵo la fotilo certe ombrumadus la lumon, sed por "malrapida" spegulo eblas loki la fotilon tiel iom flanken el optika akso ke ĝi tute ne ombrumas la venantan lumon kaj tamen la lumo ne bezonas esti tre oblikva al la optika akso.
La bildoj ja estas nur 2-dimensiaj sekcoj de spegulo, sed ĉiuj sekcoj de sfera spegulo estas similaj. Se la samdirekta lumo estus laŭ la optika akso, estus ĉiuj sekcoj same bonaj. Por la oblikva lumo tamen la situacio estas alia en aliaj sekcoj. Mi esperas ke jam simpla kalkulado produktos utilaj rezultoj.
La 3-dimensiaj vektoroj estas tiel iom maloportunaj ke du 3D -vektoroj eble krucos precize en nenio punkto eĉ se ne estas samdirektaj. La 2-dimensia kazo estas pli afabla. Du aliaj senfine longaj linioj ĉiam krucas unu la alian en unu punkto de 2D-spaco, se ili ne estas tute samdirektaj.
La ideo estas unue nur kalkuli en 2 dimensioj. Sed grava demando tial estas, kie tranĉas la (ne tute samdirektaj) rektaj linioj unu la alian en 2D-spaco? Ni pritraktu du vektorojn pq kaj rs inter la punktoj p kaj q kaj punktoj r kaj s en la apuda bildo.
Oni povas prezenti al vektoroj korelativaj rektaj linioj de nedefinita longo kun simplaj multiplikantoj t
kaj h
.
p + t * pq r + h * rs
Ni povas iom post iom solvi la tranĉan punkton, kio apartenas al ambaŭ linioj:
p + t * pq = r + h * rs # ĉar estas komuna punkto p + t * (q - p) = r + h * (s - r) t * (q - p) - h * (s - r) = r - p
Ni uzu iom da matricoj ...
/ \ | t | [ q-p -(s-r) ] | | = r - p | h | \ / / \ | t | [ q-p r-s ] | | = r - p | h | \ / / \ / \ | xq - xp xr - xs | | xr - xp | | yq - yp yr - ys | = | yr - yp | \ / \ /
Eblas solvi uzante determinantoj ...
det ( [r-p r-s] ) t = --------------------- det ( [q-p r-s] ) (xr - xp) (yr - ys) - (xr - xs) (yr - yp) = ------------------------------------------- (xq - xp) (yr - ys) - (xr - xs) (yq - yp) det ( [q-p r-p] ) h = --------------------- det ( [q-p r-s] ) (xq - xp) (yr - yp) - (xr - xp) (yq - yp) = ------------------------------------------- (xq - xp) (yr - ys) - (xr - xs) (yq - yp)
Nenio solvo tamen ekzistas se la komuna denominatoro egalas nulo, aŭ det ( [q-p r-s] ) = 0
Kiam oni trovis la valuojn t
kaj h
, oni uzu ilin en la formuloj por solvi la komunan punkton.
p + t * pq r + h * rs
Ekzistas ankaŭ alia metodo por la sama tasko, por trovi la tranĉan punkton de du rektaj linioj. Oni povas nomi ĝin "2D kruca produto" kvankam ne eblas vera kruca produto en 2D-spaco, nur en 3D-spaco. Ni uzu por ĝi la iom strangan signon ✗2D kaj la rezulto estas nura skalaro. Por du 2-dimensiaj vektoroj v = ( x, y )
kaj u = ( x', y' )
estas la "2D kruca produto":
/ \ / \ | x | | x' | v ✗2D u = | | ✗2D | | = x*y' - y*x' | y | | y' | \ / \ /
La valuo de "2D kruca produto" v ✗2D u
estas pozitiva kiam la vektoro u estas maldekstrume (kontraŭe al horloĝdirekto) el vektoro v (angulon malpli ol 180°).
Eble mi poste rakontos pli ...
...
Mi provu kalkuli realan ekzemplon. Fokusa distanco de sfera spegulo estu f = 1000 mm
kaj la aperturo estu D = f/10 = 100 mm
Tial estas la centro de kurbeco de spegula surfaco en distanco R = 2*f = 2 metroj
kaj la duono de spegula diametro estas r = D/2 = 50 mm
Ne eblas por desegni la kurbecon de spegulo por la supra desegnaĵo, sed la linioj el spegulo al la centro de kurbeco en punkto R klare devas esti ortaj al la spegula surfaco.
Estu la origo (0, 0) de koordinatoj en la centro de spegula surfaco. X-koordinato kreskas dekstren kaj Y-koordinato kreskas supren.
Ni unue pensu pri oblikva lumradio kio trafas la centron de spegulo. La venanta lumradio estu en alto D/2 el la optika akso en distanco f. La orta vektoro por centro de spegulo estas horizontala N2 = (1, 0) kaj la al origo venanta lumradio estu L2 = (0, 0) - (f, D/2) = (-1000, -50)
Ni volas kalkuli la direkton de el origo reflektita lumradio per programo "GNU Octave".
>> n = [1, 0] n = 1 0 >> L = [-1000, -50] L = -1000 -50 >> Ln = dot(L, n) * n Ln = -1000 -0 >> R2 = L - 2*Ln R2 = 1000 -50
Do la direkto de el centra spegulo reflektita lumo estas simple (1000, -50) kio certe ŝajnas nature, ĉar estas en distanco f al la alia flanko de optika akso.
Por la aliaj lumradioj el randoj de spegulo ni bezonas la valuon "sagitta" por la rando de sfera spegulo el artikolo #403
z = r - (r2 - h2)1/2
Kaj por la rando de spegulo estas la "sagitta" z
kiam h = D/2 = 50 mm
kaj radiuso de kurbeco r = 2000 mm
z = 2000 - (20002 - 502)1/2 = 2000 - 1999,3749 = 0,6251 mm
Sekve ni pensu pri la plej supra lumradio L1 kio estas samdirekta kun la aliaj lumradioj. La direkto de venanta lumo fakte estas la sama kvankam trafas alian punkton ; L1 = (-1000, -50) = L2
La orta vektoro tamen estas iom alia ĉar la surfaco estas kurba. Ni atentu la valuon de "sagitta" z ; N1 = (z, D/2) - (2000, 0) = (0.6251, 50) - (2000, 0) = (-1999.3749, 50)
sed ni tamen uzu normigitan valuon (longo de vektoro 1) por la perpendikla vektoro.
La origina longo de vektoro N1 : 1999.999998 kaj tial estas la normigita vektoro n = N1 / |N1| = (-0.99968745, 0.0250)
>> n = [-0.99968745, 0.0250] n = -0.999687 0.025000 >> Ln = dot(L, n) * n Ln = -998.125 24.961 >> R1 = L - 2*Ln R1 = 996.251 -99.922
Tio ja estas la direkto de reflektita lumradio kio startas el punkto (z, D/2) = (0.6251, 50)
sed ni volas trovi la punkton kie la lumradioj trafas unu la alian.
Ni unue kalkulu la trian vektoron.
>> R0 = [2000, 0]; % centro de kurbeco >> r = 2000; >> h = 50; >> z = r - sqrt(r^2 - h^2); % sagitta >> N3 = [z, -50] - R0; >> longo = sqrt( N3(1)^2 + N3(2)^2); >> n3 = N3 / longo; >> Ln = dot(L, n3) * n3; >> R3 = L - 2*Ln R3 = 1001.249219 0.046873
Kiel la suba simpla bildo montras, trafas la vektoroj de lumradioj iom bone la saman punkton, sed eraro povus esti relative granda sur la fotila sensilo. Mia bildo estas proksimume 1000 rastrunuoj en x-direkto kaj ĝi prezentas 1000 milimetroj, sed eraro de unu milimetro estas tre granda sur moderna sensilo. Ekzemple la rastrunoj de HQ-fotilo estas kvadratoj de nur 1,55 μm * 1,55 μm kaj do por longo de unu milimetro estus 645 da ili. La tuta distinga kapablo de HQ-fotilo certe ne estas utila por ĉi tia spegulo kun oblikva lumo, sed mi esperas ke eble mi povus uzi ekzemple 8*8 rastrunuoj kune. Tiam estus fine unu rastrunuo sur foto 12,4 μm * 12,4 μm da areo el sensilo, iom pli ol 0,0001 mm2.
La skaloj en la supra bildo ja estas iom aliaj por la X- kaj Y- direktoj. Mi uzis la sekvantan parton de programo por desegni la bildon en GNU Octave (kaj poste aldonis mane iom da teksto).
% La direkto de envenanta lumo ja estas la sama por ĉiuj punktoj L = [-1000, -50]; % punktoj sur la sfera surfaco de spegulo p1 = [z, 50]; p2 = [0, 0]; p3 = [z, -50]; % punktoj kie la envenanta lumo "startas" l1 = p1 - L; l2 = p2 - L; l3 = p3 - L; % punktoj por reflektita lumo ĉe fokuso r1 = p1 + R1 r2 = p2 + R2 r3 = p3 + R3 % r1 = 996.876 -49.922 % r2 = 1000 -50 % r3 = 1001.874 -49.953 % Linioj por la envenanta lumo line ("xdata", [l1(1) p1(1)], "ydata", [l1(2) p1(2)]) line ("xdata", [l2(1) p2(1)], "ydata", [l2(2) p2(2)]) line ("xdata", [l3(1) p3(1)], "ydata", [l3(2) p3(2)]) % Linioj por la reflektoj el spegulo line ("xdata", [p1(1) r1(1)], "ydata", [p1(2) r1(2)]) line ("xdata", [p2(1) r2(1)], "ydata", [p2(2) r2(2)]) line ("xdata", [p3(1) r3(1)], "ydata", [p3(2) r3(2)]) axis( [-20, 1010, -60, 100] ); xlabel ("x (mm)"); ylabel ("y (mm)"); title ("2-D");
Ni povas uzi la funkcion "det()" en la bona programo "GNU Octave" por trovi la veran fokusan punkton pli akurate.
Estu vektoro rs la supra lumradio kaj vektoro pq la lumradio el centro de spegulo.
La punktoj estas : p = (0, 0), q = ( 1000, -50), r = (0.6251, 50) kaj s = r + (996.251, -99.922) kaj ni uzu la jam supre donitan formulon:
det ( [r-p r-s] ) t = --------------------- det ( [q-p r-s] )
Ni uzu la liberan programon "GNU Octave" por trovi la solvon:
>> p = [0, 0]; >> q = [1000, -50]; >> r = [0.6251, 50]; >> s = r + [996.251, -99.922] s = 996.876 -49.922 >> pq = q - p pq = 1000 -50 >> pr = r - p pr = 0.62510 50.00000 >> sr = r - s sr = -996.251 99.922 >> y = [ transpose(pr) , transpose(sr) ] y = 0.62510 -996.25100 50.00000 99.92200 >> x = [ transpose(pq) , transpose(sr) ] x = 1000.000 -996.251 -50.000 99.922 >> t = det(y) / det(x) t = 0.99532 # kaj la kruca punkto: >> x = p + t*pq x = 995.321 -49.766
Nu mi do supozas ke la du lumradioj krucas unu la alian en punkto ( 995.321, -49.766 )
kaj mi supozas ke la formulo r + h * rs
produktus la saman rezulton se mi unue kalkulus la valuon h
La krucaj punktoj kun la lumo reflektita el la suba rando de spegulo p3 = [0.6251, -50]
sendube estus iom aliaj. Nature estus grave por trovi la distancon el spegulo ĉirkaŭ la "oficiala" fokusa distanco f
(por samdirekta lumo en direkto de optika akso) kie la bildo estus la plej malgranda. Eble oni tamen devus provi ankaŭ la aliajn sekcojn de teleskopo kaj por tio mi devus kalkuli per 3D-vektoroj ĉar la vektoroj ne estas en la XY -ebeno.
Estas mia unua provo por ĉi tiaj kalkuloj per vektoroj kaj mi kredas ke mi poste returnos ankoraŭ multaj fojoj al la sama temo ... ĉar la problemo min jam tre longe turmentis.
Estas ja provizore nur 2D-kazo kaj nur 3 lumradioj, sed mi volas pli bone prezenti kiel la lumradioj veturas ĉe la fokuso. Ni pensu unue nur pri la X-komponantoj kaj la veturadon de lumo al io certa distanco de fotila sensilo, ekzemple fx
. La lumradio startas el X-koordinato px
kaj la lumo veturas kun la X-komponanto de vektoro Rx
. Por io provizore nekonata valuo t1
validas:
px + t1 * Rx = fx
El tio oni trovas la valuon t1
fx - px t1 = --------- Rx
Kiam oni konas la valuon t1
, oni kapablas kalkuli per Y-komponentoj kaj trovi kie la lumradio trafas en Y-direkto en X-koordinato fx
:
py + t1 * Ry = fy
La reflektita lumradio do startis en la surfaco de sfera spegulo en punkto ( px, py ), veturis kun la vektoro ( Rx, Ry ) kaj fine trafis la punkton ( fx, fy ) sur la fotila sensilo.
Eblas trovi la plej malgrandan eraron inter la 3 lumradioj ĉe la fokuso kie estus la loko de fotila sensilo. Mi certe esperas pri eraroj kiuj estus maksimume nur kelkaj centonoj de milimetro.
Bedaŭrinde mi tamen devas konstati ke la plej malgranda eraro je la plej bona fokusa distanco (iom pli ol 997 mm) estas proksimume dekono de milimetro ... dek fojoj pli granda ol kion mi esperis. En la malgrandaj rastunuoj de HQ-fotilo estas 0,1 mm pli ol 70 "pixel". Hmmm ... kaj en 3 dimensioj povus la eraro esti eĉ pli granda ...
funua = 994; t1 = (funua - p1(1)) / R1(1); f1y1 = p1(2) + t1 * R1(2) t2 = (funua - p2(1)) / R2(1); f1y2 = p2(2) + t2 * R2(2) t3 = (funua - p3(1)) / R3(1); f1y3 = p3(2) + t3 * R3(2) % f1y1 = -49.633 % f1y2 = -49.700 % f1y3 = -49.953 fdua = 1000; t1 = (fdua - p1(1)) / R1(1); f2y1 = p1(2) + t1 * R1(2) t2 = (fdua - p2(1)) / R2(1); f2y2 = p2(2) + t2 * R2(2) t3 = (fdua - p3(1)) / R3(1); f2y3 = p3(2) + t3 * R3(2) % f2y1 = -50.235 % f2y2 = -50 % f2y3 = -49.953 figure() axis( [funua - 0.5, fdua + 0.5, -50.3, -49.6] ); line ("xdata", [funua fdua], "ydata", [f1y1 f2y1]) line ("xdata", [funua fdua], "ydata", [f1y2 f2y2]) line ("xdata", [funua fdua], "ydata", [f1y3 f2y3]) xlabel ("x (mm)"); ylabel ("y (mm)");
Mi kredas ke la programo "GNU Octave" estus bona laborilo por kalkuli "spot diagram" por la simpla spegulo. Kial konstrui tute propran programon kiam la "GNU Octave" jam enhavas la funkciojn kiojn oni bezonas. Nature miaj solvoj estas provizore nur primitivaj, sed mi espereble iom post iom lernos por produkti pli bonaj.
Kaj certe fine ..........
NI VENKOS!
La Ambasadoro en Finnlando de sendependa nacio Mueleja Insulo |