Odczytanie pikseli na planie koła. Wyświetlacz widmowy

0

Witam.
Otóż zabrałem się do pisania w Delphi programu który z kolei pisałby kod w języku bacom w którym byłby kompilowany i wgrywany do mikroprocesora [???] Chodzi o to że stworzyłem sobie układ elektroniczny zwany jako wyświetlacz widmowy Np taki jak TEN. I ten program w delphi ma za zadanie sczytać kolejne piksele z bitmapy i przekształcić je w bajty kodu i zapisać je w języku bacom . Tą część programu mam już gotową łącznie z optymalizacją kodu bacom (oszczędność pamięci) . Jednak program ten czyta tylko bitmapę w kształcie prostokąta i trudno w ten sposób stworzyć ilustrację wyświetlaną na całej powierzchni koła (problem synchronizacji czasu oraz narysowania rysunku w odpowiedni sposób) . I chciałbym dodać funkcję typu wstawiamy obrazek do image następnie wydzielamy z tego okrąg ( ustawiamy która cześć obrazka nas interesuje np . Część znajdująca się wewnątrz wygenerowanego okręgu) i sczytujemy promieniście od środka w kierunku krawędzi okręgu (zgodnie z ruchem wskazówek zegara) np po 8 piksele (z czego środkowy jest wspólny) I w tym tkwi problem bo nie mam pojęcia jak się do tego zabrać. (czytaj. do odczytania pikseli w ten sposób)

To tak już poprawiam.
*Program jest pisany w Delphi i ma za zadanie z podanych danych utworzyć kod w BASCOMie (środowisko programistyczne mikroprocesorów). Postanowiłem takowy program zrobić ponieważ przeliczanie i napisanie kodu do mojego projektu (czytaj. Zegar Widmowy, Wyświetlacz widmowy coś jak TEN)jest bardzo czasochłonne i czasem sam kod może zajmować do kilku tysięcy linijek (w bascomie) , zależnie od tego co chcemy wyświetlić.

Czynności zrobione:
*Program (w delphi) "zbiera" od nas prawie wszystkie potrzebne informacje np. czas, końcówki portów, ilość pikseli, plik bitmapy. Następnie pobiera z niej wartości pikseli (wszystkie poza białym to logiczne 1) i zapisuje je w postaci dziesiętnej jako jeden bajt (0-255 Spowodowane jest to łatwiejszą obsługa mikroprocesora którego nóżki podzielone są na porty po 8 pinów) i przekształca je do kodu bascom.

*Zrobiona jest również optymalizacja kodu (powtarzające wartości są wpisywane do kodu tylko raz i mnożony jest czas przez ilość powtórzeń .

*Inne wodotryski typu tworzenie kodu sprawdzającego prędkość obrotowa itp.

Czynności niezrobione:

**Najpierw opisze zasadę działania tego zegara, wyświetlacza. Otóż jest to pojedyncza linia diód świecących sterowana mikroprocesorem i umieszczona na ruchomym śmigle którym kręci silnik elektryczny lub cokolwiek innego. Obraz powstaje przez gaszenie i zaświecanie diód w ściśle określonym czasie podczas obrotu.

  • I tutaj jest problem ponieważ chcę zrobić tak by w programie dało sie wczytać rysunek (bitmapę) tak aby móc nią swobodnie poruszać aby można było wybrać cześć obrazka która nas interesuje np znajdująca się w znaczniku (okrąg z zaznaczającym środek obrazu. Ale to nie jest najważniejsze Chodzi mi o sposób dzięki któremu będę mógł odczytać kolor pikseli znajdujących się w kole. Mają one byc odczytywane rzędami od środka do zewnątrz obrazu zgodnie z ruchem wskazówek zegara.
0
gugusek28 napisał(a)

(...)zabrałem się do pisania w Delphi programu który z kolei pisałby kod w języku bacom w którym byłby kompilowany i wgrywany do mikroprocesora [???] Chodzi o to że stworzyłem sobie układ elektroniczny (...). I ten program w Delphi ma za zadanie sczytać kolejne piksele (...) i zapisać je w języku bacom (1) . Tą część programu mam już gotową łącznie z optymalizacją kodu bacom (oszczędność pamięci). Jednak program ten czyta tylko bitmapę w kształcie prostokąta i (...). I chciałbym dodać funkcję typu wstawiamy obrazek do image następnie wydzielamy z tego okrąg (...) i sczytujemy promieniście od środka w kierunku krawędzi okręgu (zgodnie z ruchem wskazówek zegara) np po 8 pikseli (z czego środkowy jest wspólny) I w tym tkwi problem bo nie mam pojęcia jak się do tego zabrać. (...)

Ad 1. Słyszałem o języku Bascom...
2. Ledwie doczytałem do końca (a zrozumiałem chyba połowę). Sformatuj tekst...
3. Napisz w punktach, co chcesz zrobić i zrobiłeś, po kolei (czyli jakby zadanie w punktach).
4. Czy to pasuje do kategorii Delphi?

0

WITAM
Jeszcze raz bardzo proszę o pomoc

0

Potrzebujesz takiego rownania kola:
x = x0 + (r * cos(rad * a) + r * sin(rad * a))
y = y0 - (r * cos(rad * a) - r * sin(rad * a))
gdzie:
(x, y) - wynikowe wspolrzedne punktu na okregu o promieniu r, srodku w pkt (x0,y0)
(x0, y0) - wsp srodka okregu na obrazku
r - promien
rad - jeden radian, stala rowna 2*PI/360
a - kat.
Po prostu robisz petle na a od 0 do 359 z jakims odpowiednio malym krokiem (dobierz eksperymentalnie). W srodku druga petla na r od 0 do [promien okregu]. Ze wzoru bedziesz otrzymywal wsp punktu do odczytania.

0

Witam
Albo ja coś żle robię albo te punkty mają być w ułamkach.ponieważ zazwyczaj wychodzi mi taki wynik
??

0

Zaokrąglij wynik.

0

Witam.
Zkorzystałem z tego wzoru
Potrzebujesz takiego rownania kola:
x = x0 + (r * cos(rad * a) + r * sin(rad * a))
y = y0 - (r * cos(rad * a) - r * sin(rad * a))
gdzie:
(x, y) - wynikowe wspolrzedne punktu na okregu o promieniu r, srodku w pkt (x0,y0)
(x0, y0) - wsp srodka okregu na obrazku
r - promien
rad - jeden radian, stala rowna 2*PI/360
a - kat.
Po prostu robisz petle na a od 0 do 359 z jakims odpowiednio malym krokiem (dobierz eksperymentalnie). W srodku druga petla na r od 0 do [promien okregu]. Ze wzoru bedziesz otrzymywal wsp punktu do odczytania.

MAm jeszcze jedno pytanie jak zrobić aby program zaczął odczytywać te piksele na 12 zamiast 13`10

0
crow6 napisał(a)

rad - jeden radian, stala rowna 2*PI/360
a - kat.
Po prostu robisz petle na a od 0 do 359
A nie lepiej od razu posługiwać się radianami ? :> Stopnie to mało przydatna skala.

0

To znaczy??
Jak dla mnie może być . Na razie nie zauważyłem problemu z tym.
Ale co zrobić z tym żeby oczyt zaczynał się na 12 bo mi zaczyna o jakies 30 może 40 stopni dalej a to już jest mały problem.

Witam mam jeszcze jedno pytanie ponieważ ta funkcja podczas czytania tych piksele np na 12 czyli prosta linia pionowa (powinna wyjść cała czarna a wychądzi mi przerywane (specjalnie napisałem funkcję przerysowującą obrazek z prawej poprzez ten wzór na strone lewo) Co jest tego przyczyną ??
Oto wynik działania funkcji. Dokładność dokładnie jeden stopień.
Oto link do zdjęcia http://www.fotosik.pl/showFullSize.php?id=129eda73eb090ac9
<font size="2"></span>Nie umiem dodawać tutaj zdjęć :-/

0

Nie bardzo rozumiem, o co ci chodzi, ale ten rysunek powinien pomóc:
user image

0

OK problem początku obrotu rozwiązany. Dzięki za obrazek , dzięki niemu zrozumiałem co trzeba banalnego zrobić aby było tak jak chcę (zacząć od -40 stopni zamiast od 0)

Pozostaje już tylko 2 pytanie z mojego posta powyżej albo raczej stronę wcześniej.

0

Zacznij moze od -45 stopni to bedzie lepiej ;)

0

Sorry, ze tak dwa posty jeden pod drugim ale wlasnie zaczynam sie budzic i tak:
poprawny wzor to oczywiscie:
x = x0 + (r * sin(rad * a))
y = y0 - (r * cos(rad * a))
(ten poprzedni to chyba z obrotow 3D byl o ile dobrze pamietam :( ) wiec moj blad...
Teraz bedzie dzialac dla a = (0,360).
Co do bialych pol to wina oczywiscie zaokraglen wynikow. Jesli naprawde zalezy Ci aby ich nie bylo to musisz zmniejszyc krok w petli dla a (np 0.1 stopnia). Im wiekszy bedzie promien kola tym mniejszy musi byc krok.

A dlaczego stopnie, a nie radiany? Bo wiekszosc ludzi ma problemy z radianami po kilku(nastu) latach uczenia sie o stopniach. Wiec po co komplikowac jakimis radianami problem?

0

Długo wytrzymałem, ale żaden z postujących się o tym nie zająknął, więc wtrącę swoje: rysowanie koła przez wyliczanie funkcji trygonometrycznych w każdym kroku od 0 do 2PI to straszliwe marnotrawstwo. Wystarczy narysować np 1/8 obwodu, reszta punktów daje się wyliczyć przez proste przekształcenia mat. (symetria, odbicie)

0

Ok wzór poprzedni może nie do tego ale też działa :) Co do początku obrotu tak zrobiłem od 45- stopni ale do tego doSZEDŁem wczoraj . doSZEDŁem również do tego że nie potrzebuje takiej dokładności i że te niezamalowane pola wcale nie przeszkadzają pracy programu także chyba doszliśmy do końca ponieważ już wiem wszystko co potrzebuję , program już działa zgodnie z założeniami. Nic tylko PODZIĘKOWAĆ za pomoc.
TBSO co do wyliczania reszty koła po co komplikować sobie życie jak może zrobić to ten sam wzór :) a ja nie potrzebuję wcale jakiejś zawrotnej prędkości ponieważ i tak spowalniam funkcję dla zobaczenia rysowania całego koła (sleep(20)). Także wszystko ok . Jeszcze raz dziękuję i pozdrawiam .

0
gugusek28 napisał(a)

TBSO co do wyliczania reszty koła po co komplikować sobie życie jak może zrobić to ten sam wzór :) a ja nie potrzebuję wcale jakiejś zawrotnej prędkości ponieważ i tak spowalniam funkcję dla zobaczenia rysowania całego koła (sleep(20)). Także wszystko ok . Jeszcze raz dziękuję i pozdrawiam .

Bo sztuka cierpi :D
Nie twierdzę, że należy to stosować zawsze, ot ciekawostka, o której się nikt nie zająknął.

0

Wiesz polak jak polak nie lubi sobie komplikować Przynajmniej ja:)

PS. Zmieniłem ten wzór z poprzedniej strony na ten co teraz podałeś i zniknęły prawie wszystkie błędy z obrazka (czyt. przerysowanie obrazka za pomocą funkcji) tzn pozostało kilka pikseli których dalej nie pokrywa ale jest dużo bardziej dokładny , nawet bez zmniejszania wielkości radianu.Zniknęły też problemy z kątem naktórym rozpoczyna się czytanie , teraz zaczyna idealnie w pionie nie trzeba a zmieniać na - 45 stopni.

1 użytkowników online, w tym zalogowanych: 0, gości: 1