Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP, JS] Jak sprawdzić czy współrzędne należą do figury
Forum PHP.pl > Forum > PHP
maniak11
Witam,

Mam problem tego typu że stworzyłem funkcje rysujące różne figury za pomocą GD pobierając współrzędne z bazy są to kwadraty elipsy itp a także figury dowolne (rysowane za pomocą imagesexpixel i imagesline) I teraz mam pytanie jak po narysowaniu tego wszystkiego, po najechaniu kursorem na daną figurę i odczytaniu X i Y kursora sprawdzić czy ten punkt należy do danej figury (zawiera się w zbiorze punktów w bazie) Siedze nad tym pół dnia i nic mi nie przychodzi do głowy:/ Za jakąś pomoc będę bardzo wdzięczny
bartek00
Witam

Mysle, ze to moze ci pomóc:

link

Pozdrawiam
starach
Każdy taki punkt składa się z dwóch współrzędnych (X,Y)
dla prostokąta masz takie 4 punkty które są granicami figury.
powiedzmy masz prostokąt: LG = 20,60 PG = 100,60 PD = 100,10 LD = 20,10
LG = Lewy górny
PG = Prawy górny
PD = Prawy dolny
LD = Lewy dolny
I masz współrzędne 40,30 jak sprawdzasz czy punkt należy do prostokąta ?
Za pomocą operatorów <,>,= i tyle.
mike
~orglee proszę nie pisz jak nie znasz rozwiązania.
Prostokąt to jeden z bardziej trywialnych przypadków, ale jak wiesz (choć chyba raczej nie wiesz) jest jeszcze nieskończona ilość figur geometrycznych a Twój algorytm ... no cóż. Nie działa.

Za mało jeszcze wiesz lub masz za słabą wyobraźnię tongue.gif
starach
Jak zwykle się czepiasz szczegółów nie mam zamiaru nic ci udowadniać,
ale zwróć uwagę że chodziło mi o pokazanie sposobu w jaki powinno się patrzeć na to zadanie. Rozwiązanie podałem dobre a zamiast się czepiać napisz mu kod panie mądralo. laugh.gif
mike
Cytat(orglee @ 12.04.2007, 20:43:31 ) *
Rozwiązanie podałem dobre (...)
Proszę nie pisz takich rzeczy.
Naplułem na monitor ze śmiechu sad.gif

To teraz mi pokaż jak to Twoje "dobre" rozwiązanie zadziała dla powiedzmy dowolnego sześciokąta z dziurą w środku gdzie punkt jest wewnątrz dziury?
Uwierz mi, to zadziała tylko dla prostokąta (no może jeszcze fartownie dla jakiejś innej figury).

~maniak11 rozwiązanie tego problemu za pomocą PHP (bądź JS) nie będzie takie proste.
Będzie wymagało masę obliczeń matematycznych.

Zasada jest (wydawałoby się) bardzo prosta.
Każda prosta przechodząca przez punkt wyznaczona w dowolnym kierunku może przecinać boki wielokąta w parzystej liczbie punktów. Jeśli istnieje prosta prosta mająca nieparzystą ilość punktów wspólnych z bokami wielokąta to punkt należy do obszaru wielokąta.
(to samo jest zresztą napisane w podanych wyżej linku)

Obliczenie tego jest bardzo trudne więc zastanów się czy jest Ci to potrzebne winksmiley.jpg
maniak11
Dzięki bartek00 za tego linka, tekst jest zakręcony jak słoik na zimę ale postaram się przez niego przebrnąć. Pozostaje tylko pytanie jak przekazać zmienną (np. po kliknięciu w obrazek) do php aby ten mogl dalej z tym robić co trzeba, z tego co wiem to za pomocą samego tylko JS się nie da (co innego AJAX) tyle tylko że z tym nie miałem do czynienia i nie umiałbym zrobić tego aby nie bylo okupione przeładowaniem strony. W sumie to moze sie nawet przeładowac byle by tylko pobrac te wartości. Dzięki za pomoc

Dzięki mike_mech, niestety jest mi to potrzebne bo pisze prace mgr i jest to jedna z rzeczy do zrobienia przy ktorej utknąłem dry.gif Chodzi o to że po najechaniu na daną figurę ma się wyświetlić informacja o nim pobrana z bazy a żeby to zrobić muszę mieć współrzędne bo tylko tak sprawdzę do ktorej figury dany punkt należy (żeby wyświetlić właściwy opis). Ehh czasami to mi sie mózg lasuje od kombinowania z tym...
mike
Cytat(maniak11 @ 12.04.2007, 21:03:49 ) *
Dzięki mike_mech, niestety jest mi to potrzebne bo pisze prace mgr (...)
biggrin.gif Mam to za sobą.

Na dobrą sprawę tak jak mówiłem, nie jest to trudne ale wymaga masę obliczeń.

Jeśli masz do czynienia tylko z wielokątami (nie tylko wypukłymi) to nie jest tak tragicznie.
Mając wszystkie wierzchołki, wyliczasz wszystkie proste, w których zawieają się krawędzie. To będzie akurat proste, pomimo, że może czasochłonne.
Potem wyliczasz wszystkie proste przechodzące przez dany punkt. Dla sprawienia że obliczenia będą wykonalne w ograniczonym czasie możesz zawęzić ich ilość do 360 biggrin.gif

Teraz najważniejsze:
Bierzesz prostą przechodzącą przez punkt i liczysz ilość przecięć z wszystkimi krawędziami. Jeśli ilość jest parzysta to bierzesz kolejną prostą i ponawiasz obliczenia. Jeśli ilość jest nieparzysta to punkt należy do figury.

Obliczeń będzie masa, wszystko najszybciej pójdzie na macierzach, choć podejrzewam ze PHP i tak zdechnie po drodze z 10 razy.
Nie nadaje się do takich obliczeń.

Tak to wygląda w skrócie, być może w implementacji jest do prostsze bo to co napisałem to bezpośrednie przeniesienie twierdzenia na kod. Poszukaj implementacji, być może jest prostsza od tego co napisałem, nie wiem bo nigdy nie potrzebowałem.
Jeśli nie znajdziesz implementacji tego algorytmu to czeka Cię ogrom pisania. Z niepewnością, że PHP to dźwignie.
maniak11
Dzieki wielkie za informacje, poszukam czegoś w necie, może coś będzie, na tej stronce co bartek00 podal są implementacje tyle że nie w php, poszukam czegoś bo jak pomysle o pisaniu tego to...brrrr smile.gif Dzięki jeszcze raz
mike
Cytat(maniak11 @ 12.04.2007, 21:22:10 ) *
(...) na tej stronce co bartek00 podal są implementacje tyle że nie w php (...)
Oo, nawet nie zwróciłem uwagi.
Nooo, to stary masz gotowca jedym slowem. Przepisanie tego na PHP to nic trudnego. Pikuś bym rzekł.

Większa trudność niż to obisanie tego jakimś układem współrzędnych, rysowanie figur na nim na podstawie dancyh z bazy a potem pobieranie współrzędnych punktu do obliczeń.

Na kiedy masz to mieć snitch.gif

Bo wiesz (Uwaga: Teraz nastąpi autoreklama) jest magistrem matematyki biggrin.gif
Mógłbym Ci to machnąć ale dopiero za jakiś miesiąć. Do tego czasu sam to napiszesz ze dwa razy winksmiley.jpg
maniak11
Hehe, dzięki, prace mam oddać standardowo do końca czerwca więc czasu trochę jest ale miesiąc to rzeczywiście kupa czasu więc mam nadzieje ze za ten czas będę duużo do przodu:) Dzięki Ci jeszcze raz, cieszy mnie że są jeszcze tacy ludzie jak Ty, pozdrawiam, hey
DeyV
A może podejść do tego od innej strony?
Zamiast tworzyć matematyczny wzór wszystkich tych figur, i matematyczną analizę ich struktury, może łatwiej byłoby po prostu odczytać kolor pixla na utworzonym wcześniej obrazku?
W ten sposób analizę matematyczną i tworzenie figur zostawiamy bibliotece GD, która i tak to musi zrobić podczas ich rysowania, a nam pozostaje jedynie zatroszczyć się o to, by każda z figur miała inny kolor.

Cytat
imagecolorat" title="Zobacz w manualu PHP" target="_manual — Get the index of the color of a pixel
Opis
int imagecolorat ( resource $image, int $x, int $y )


Ad 2. - pobranie współrzędnej gdzie obrazek został kliknięty jest bardzo proste. Wystarczy zrobić
<input type="image" src="adres obrazka" />
Ma on nie tylko funkcjonalność submit, ale wysyła również współrzędne x i y kliknięcia.


ps. Choć tak naprawdę - rozwiązałbym ten problem chyba raczej w Flash, gdzie utworzyłbym mechanizm do rysowania figur geometrycznych, tworząc z nich od razu buttony. Pozwoliłoby to urozmaicić prezentację o elementy animacji winksmiley.jpg
maniak11
DeyV: Też myślałem o tym żeby pobrać kolor obrazka tym bardziej że kolor zapisany jest w bazie mysql i takie figury są rysowane jaki kolor jest w bazie, niestety jednak nie mogę zrobić tak żeby każda figura miala inny kolor bo ma to być fragment mapy więc ulice będą mialy ten sam kolor, budynki ten sam itd.

Ciekawy sposób na pobranie współrzędnych x,y swoją drogą. dzięki za pomoc.

Jeśli chodzi o flasha to z początku chciałem to tak zrobić ale usłyszałem od genialnej Pani opiekun że nie jest to narzędzie do tego typu zadań. No cóż...wystarczy wejsc na mapa.pf.pl aby się o tym przekonać. Teraz to już za dużo zrobiłem żeby wszystko na AS-a przenosić. Dzieki jeszcze raz
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.