Dublet (soczewki) w pythonie

Dublet (soczewki) w pythonie
WS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0

Hej, mam do wygenerowania 4 bitmapy (dwie dla soczewki skupiającej i dwie dla rozszczepiającej).Bitmapy te są mi potrzebne do stworzenia dubletu, który jest właśnie połączeniem ww. soczewek. Mój dublet ma trzy krzywizny, ale muszę podzielić te soczewki na pół, tak, aby pomiędzy nimi była powierzchnia płaska. R1, R2 i R3 są mi znane. Z tego co wiem muszę wykorzystując równanie opisujące powierzchnię soczewki wygenerować odpowiednią macierz i potem zapisać to jako bitmapę. Nie wiem jak się za to zabrać, ktoś pomoże?python.png

AN
  • Rejestracja: dni
  • Ostatnio: dni
1

Dawno temu, amatorsko bawiłem się w symulowanie załamania światła. Działało to w ten sposób, że wczytywało się bitmapę przedstawiającą układ optyczny, a potem puszczało się promień światła wskazując jego początek i kierunek.

Bitmapa wyglądała tak, że używało się kilku kolorów (minimum 2), gdzie każdy odpowiadał jakiemuś ośrodkowi optycznemu. Jeżeli krzywizny soczewek można opisać równaniami, to sprawa jest prosta, po prostu malujesz krzywą według równania. Nawet, jeżeli nie masz równania typu f(x)=y ani f(y)=x, czyli np. chcesz narysować elipsę o równaniu 10*x*x + 5*y*y <= 500, to przelatujesz pętlą po każdym pikselu (x, y) obszaru krzywej i malujesz jakimś kolorem te piksele, których współrzędne po podstawieniu spełniają równanie. Oczywiście możesz albo dostosować równanie, albo przeliczyć współrzędne pikseli, że punkt (0, 0) jest nie w lewym górnym narożniku, a także, że przesunięcie o piksel nie jest zmianą o 1, tylko o inną wartość.

Nie są potrzebne żadne dodatkowe macierze, możesz w pętli po pikselach od razu malować bitmapę. Jeżeli krzywa w soczewce jest wycinkiem elipsy, to, można ja opisać ogólną nierównością A*x*X + B*y*y <= C, gdzie A, B i C są wartościami stałymi, a x i y są współrzędnymi piksela. Linie pionowe opiszesz równaniem x = A, a poziome mają równanie y = B. Oczywiście, w przypadku linii, zamiast = możesz wpisać <= lub =>, aby równanie opisywało ograniczenie powierzchni.

Tak naprawdę, każda pojedyncza soczewka to jest powierzchnia ograniczona kilkoma nierównościami, do tej powierzchni należą piksele spełniające wszystkie nierówności. Idąc dalej, dla każdej soczewki przygotowujesz osobny zestaw nierówności i do każdego zestawu przypisujesz kolor reprezentujący rodzaj szkła (niektóre obiektywy wykonuje się z kilku rodzajów szkła). Cały program to pętla po pikselach i sprawdzenie, czy spełnia wszystkie nierówności z któregoś zestawu, jeżeli tak, to malujesz piksel na kolor przypisany do danego zestawu.

Chodzi o to, żeby dostać jednokolorowe pełne kształty. Nie mogą to być figury, które mają same kontury lub kolor wypełnienia jest inny niż kolor konturu. Jeżeli chcesz namalować obiektyw składający się z "sklejonych" soczewek z dwóch rodzaju szkła, to np. na czarnym tle malujesz jedną soczewkę ciemnoszarym kolorem i drugą soczewkę na jasnoszarym kolorem. Granica między soczewkami to przejście od koloru ciemnoszarego do jasnoszarego bez pośrednictwa innego.

Czy chcesz tylko namalować soczewki, czy również chcesz zasymulować załamanie promieni świetlnych?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.