Skocz do zawartości

Wielki problem z pixelami


dawiddawido

Polecane posty

Na kółku typu Shape wyliczyłem sobie 12 punktów w równych odległościach.

Do jednego takiego punktu, przyjąłem sobie że on będzie reagował na kolor zielony. Kołkiem poruszam się przy pomocy strzałek na klawiaturze.

Pixele porównuje tak:

KODTColor Color = clRed;

 

if( Form1->Canvas->Pixels[parametry sprawdzanego punktuX][Y] == Color)

I tutaj co ma się dziać

 

Mam tylko małe pytanie. Czemu to działa, czyli kula się zatrzymuje tylko jak jade ją przez jakąś figure o właściwym kolorze tylko od dołu do góry i od prawej do lewej, czyli jak zbliżam się do zera a jak oddalam to nie .

-------------------------------------

Teraz objaśniam jak to się dzieje żeby nie było nieporozumień:

Pixel jest porównywany, tylko w tedy, gdy dana wartość się zmniejsza, czyli w moim przypadku top kuli się zmniejsza, lub left kuli się zmniejsza. W innym przypadku gdy top lub left się zwiększa, to ten pixel w ogóle nie jest porównywany jaki jest kolor, sprawdza warunek i wyznacza flage false.

Chyba że ja ten piksel źle porównuje bo ja porównuje piksel na Form1, czyli Form1->Canvas->Pixel[współrzędna X która zmienia się w zależności w którą stronę porusza się kula][i Y zmieniany tak samo jak X]

 

Jeżeli ktoś wie dlaczego, lub co źle robię że pixele są porównywane tylko jak się ich położenie zmniejsza to bardzo proszę o pomoc. Jeśli ktoś może to prosze o szybką odpowiedz.

Mam nadzieje że tego za bardzo nie zagmaftałem, i wiecie o co mi chodzi

Pozdro.

(Mój pierwszy post na tym forum)

Link do komentarza
Udostępnij na innych stronach

Za nic nie potrafię zrozumieć o co chodzi. Kolory porównujesz dobrze, a o co w tym wszystkim chodzi to nie wiem.

 

Np co to znaczy "na kółku typu Shape" ;)

"przyjąłem sobie że on będzie reagował na kolor zielony" Kto on?

 

Proponuję napisać to jakoś logicznie po polsku. I samemu przeczytać to 10 razy zanim wyśle się na forum.

Link do komentarza
Udostępnij na innych stronach

Sprawa jest prosta

Chodzi mi o to że:

Kółko typu Shape jest to stCircle taki obiekt :)

Przyjąłem sobie że on będzie reagował na kolor zielony - ten właśnie pixel.

Profesor sobie umyślił pewien projekt, który będę realizował, więc mi jest to trochę ciężko wytłumaczyć, ale się postaram.

Jak już wcześniej wspominałem, mam obiekt typu shape w kształcie kułka. Jest na nim wyznaczone 12 punktów które są obliczane z wzoru, każdy jest o alfa pozycji dalej. I teraz UWAGA bo będę opowiadał tylko o jednym konkretnym przypadku, o to on, ale wcześniej dodam że każdy pixel ma reagować na inny kolor.

Tera o jednym konkretnym pixelu który reaguje na kolor zielony:

Gdy koło się porusza (Poruszam się strzałkami) to sprawdzam czy:

KODTColor Color = clGreen;

s = (magiczny wzór, który jest trochę długi i niechce mi się go przepisywać :) )

if( Form1->Canvas->Pixels[s+X][s+Y] == Color)

Timer1->Enable = false;

i teraz ma się koło zatrzymać.

I zatrzymuje się tylko w 2 konkretnych przypadkach , a powinno się zatrzymywać w 4 przypadkach!!!!!

Powinno się zatrzymywać jak: koło porusza się przez element o kolorze zielonym z

1 góry na dól

2 dołu do góry

3 lewo na prawo

4 prawo na lewo.

I tu się zaczyna mój problem bo moje kółko reaguje na punkt 2 i 4.

Jeśli jeszcze coś jest nie jasne to dla zainteresowanego moge przesłać ten program na maila tylko mi prosze go podać ewentualnie na gg(o ile się da bo tego to nie robiłem nigdy :) )

Pozdro

Link do komentarza
Udostępnij na innych stronach

Ciągle jest to średnio napisane, ale nie czepiam sie już więcej :P

 

Z tego co napisałeś nie wynika dlaczego program nie działa wg twoich założeń. Najlepiej jeśli dojdziesz do tego sam metodą testowania krok po kroku.

 

Przykładowo możesz zrobić tak:

Uwzględniasz tylko 1 przypadek (tak jak napisałeś)

Ustalasz sobie ten kolor przykładowo zielony w konkretnej pozycji, którą znasz.

Na bieżąco wyświetlasz sobie gdzieś pozycje tego punktu, który przesuwasz i który ma reagować na kolor.

Jeśli pozycja punktu leży dokładnie w miejscu wystąpienia koloru to powinno się coś stać (zatrzymanie timera).

 

Program może nie działać z wielu różnych przyczyn, ale nikt tutaj nie zgadnie co jest nie tak.

 

Ja podejrzewam, ze albo coś z tym wzorem, albo przesuwasz się w jednym kroku o więcej niż 1 pixel i czasami po prostu punkt nie trafia, albo kto wie co jeszcze ;)

Link do komentarza
Udostępnij na innych stronach

Ja podejrzewam, ze albo coś z tym wzorem, albo przesuwasz się w jednym kroku o więcej niż 1 pixel i czasami po prostu punkt nie trafia, albo kto wie co jeszcze ;)

 

Wielkie dzięki bo mnie olśniłeś. A znasz jakiś sposób aby liczbe currency lub double zamienić na liczbe integer???

 

Bo coś mi się wydaje że ja się poruszam o 1.jakiś ułamek. Jak to sprawdzę to dam znać czy pomogło. Zastanawiam się tylko dlaczego jak zmniejszały się wartości to to działało, może akurat trafiało na liczbe całkowitą.

Pozdro

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...