Lordis Opublikowano 10 Maja 2011 Udostępnij Opublikowano 10 Maja 2011 Witam. Mam np. 7 obiektów rozrzuconych po roomie. Jak w szybki sposób sprawdzić które są oddalone najbardziej od siebie i pokazać jaka to odległość w pixelach? Licze na szybką pomoc :D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheMarcQ Opublikowano 10 Maja 2011 Udostępnij Opublikowano 10 Maja 2011 przy tworzeniu zapisz ich id do tablicy GML var odl,naj1,naj2; odl=0; for(i=0;i<liczba_obiektow(jakis byl na to kod nie pamietam jaki);i+=1){ for(j=0;j<liczba_obiektow(jakis byl na to kod nie pamietam jaki);j+=1){ with(tablica){ if (distance_to_object(tablica[j])>odl) {odl=distance_to_object(tablica[j]; naj1=tablica; naj2=tablica[j];} }} odl - odleglosc naj1 i naj2 - najdalsze obiekty od siebie Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Platyna Opublikowano 10 Maja 2011 Udostępnij Opublikowano 10 Maja 2011 Tablica jest zbędną. instance_find() i instance_number() mój drogi. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Lordis Opublikowano 10 Maja 2011 Autor Udostępnij Opublikowano 10 Maja 2011 Zrobiłem to tak: GML for(i=1; i<global.ilosc_boxow; i+=1) { for(j=1; j<global.ilosc_boxow; j+=1) { if(box_click != 0 and box_click[j] != 0 and box_click != box_click[j] ) { with(box_click) { if (distance_to_object( box_click[j] ) > odleglosc) { odleglosc=distance_to_object( box_click[j] ); } } } } } i tez na inny sposób: GML i=1; while(box_click != 0) { j=1; while(box_click[j] != 0) { with(box_click) { if (distance_to_object( box_click[j] ) > odleglosc) { odleglosc=distance_to_object( box_click[j] ); } } j+=1; } i+=1; } box_click to tablica z id obiektów, global.ilosc_boxow to liczba wszystkich obiektów ale tu i tu wywala ten sam error: ___________________________________________ ERROR in action number 1 of Alarm Event for alarm 2 for object SYSTEM: Error in code at line 53: if (distance_to_object( box_click[j] ) > odleglosc) at position 52: Unknown variable j Czasem tez wywala Unknown variable odleglosc... Poradzicie cos? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 10 Maja 2011 Udostępnij Opublikowano 10 Maja 2011 Czas potrzebny na wykonanie skryptu poszukiwania dwóch najdalej położonych od siebie obiektów spośród n obiektów rośnie wykładniczo. Jeśli się nie mylę, wyraża się on wzorem n!/2 dla n > 1, gdzie jednostką jest porównanie odległości dwóch obiektów. Dlatego lepiej użyć funkcji instance_furthest, wtedy czas wykonania skryptu wynosi co najwyżej n. Pisząc tę wypowiedź nie uwzględniłem Twojego ostatniego postu. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Lordis Opublikowano 10 Maja 2011 Autor Udostępnij Opublikowano 10 Maja 2011 a moge prosić jakiś przykład z finkcjią instance_furthest odnoszący sie do mojego problemu? :D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 10 Maja 2011 Udostępnij Opublikowano 10 Maja 2011 GML a = 0 //a to odległość od siebie najdalszych obiektów g1 = 0 //pierwszy tymczasowy obiekt g2 = 0 //drugi tymczasowy obiekt id1 = -4 //pierwszy obiekt id2 = -4 //drugi obiekt for(i = 0; i < instance_number(obiekt); i += 1) { g1 = instance_find(obiekt,i) g2 = instance_furthest(g1.x,g1.y,obiekt) if(point_distance(g1.x,g1.y,g2.x,g2.y) > a) { id1 = g1 id2 = g2 a = point_distance(g1.x,g1.y,g2.x,g2.y) } } Nie jestem całkowicie pewien, czy zadziała, ale powinno. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Tymon Opublikowano 10 Maja 2011 Udostępnij Opublikowano 10 Maja 2011 GML id_first = noone; id_second = noone; distance = 0; with( Object ) { var _id, _distance; _id = instance_furthest( x, y, Object ); _distance = point_distance( x, y, _id.x, _id.y ); if( _distance > other.distance ) { other.distance = _distance; other.id_first = _id; other.id_second = id; } } NO! Teraz ok. W zmiennych id_first i id_second masz ID tych obiektów, a w distance masz odległość. https://gmclan.org/up152_14_100511_gm81_furest_pair.html Myszą przesuwasz obiekty. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 10 Maja 2011 Udostępnij Opublikowano 10 Maja 2011 Porównałem szybkość obu skryptów i wychodzi na to, że kod Tymona jest ok. 50% szybszy. :/ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Tymon Opublikowano 10 Maja 2011 Udostępnij Opublikowano 10 Maja 2011 GML a = 0 //a to odległość od siebie najdalszych obiektów g1 = 0 //pierwszy tymczasowy obiekt g2 = 0 //drugi tymczasowy obiekt id1 = -4 //pierwszy obiekt id2 = -4 //drugi obiekt r = instance_number(obiekt); i = 0; repeat( r ) { g1 = instance_find(obiekt,i) g2 = instance_furthest(g1.x,g1.y,obiekt) d = point_distance(g1.x,g1.y,g2.x,g2.y); if(d > a) { id1 = g1 id2 = g2 a = d } i+=1; } Try now. ;) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 10 Maja 2011 Udostępnij Opublikowano 10 Maja 2011 Dwa razy wolniejsze niż przedtem, ale to pewnie dlatego, że w pętli for jest ten licznik deklarowany na samym początku. A po repeat nie stawiamy średnika ;) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Lordis Opublikowano 11 Maja 2011 Autor Udostępnij Opublikowano 11 Maja 2011 Wielkie dzięki za pomoc :D wszystko juz działa :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się