wiktor12348 Temat założony przez niniejszego użytkownika |
Współrzędne figury i sprawdzenie czy jest kwadratem » 2012-11-11 15:25:20 Witam
Mój program pobiera od usera współrzędne punktów. W sumie 4 punkty. Następnie ma sprawdzić czy czworokąt jest kwadratem. Najprościej jest sprawdzić długość wszystkich boków oraz przekątnych. Wzór na długość wektora sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)). No i mój program sobie sprawdza.
PX - punkt X, "=" by zobrazować długości boków. Przykładowe wsp: P1(-1,1), P2(1,1), P3(1,-1), P4(-1,-1)
P1+P2=a, P2+P3=b, P3+P4=c, P4+P1=d, P2+P4=e, P1+P4=f (e i f to przekątne).
Ale jak wpiszę odwrotnie punkty, wszystko się chrzani. NP. zamienię P3 z P4 bo wpiszę dolną krawędź od prawej a nie od lewej.
Jest na to jakiś sprytny myk? Czy trzeba sprawdzać punkty i układać? |
|
cyklopek11 |
» 2012-11-11 18:33:32 Wykorzystaj wcześniej napisany wzór na odległość punktów i wtedy nawet możesz sobie punkty zamienić.
Moja sugestia: robisz coś źle w programie (może zapominasz że "minus" z "minusem" daje "plus"). NIE MA TAKIEJ OPCJI Z MATEMATYCZNEGO PUNKTU WIDZENIA, ABY WYCHODZIŁO CI ŹLE PO ZAMIANIE PUNKTÓW. |
|
wiktor12348 Temat założony przez niniejszego użytkownika |
» 2012-11-11 18:58:55 Ja nie muszę pamiętać że minus daje minus. Program sam to zrobi :) Jednak osobiście dobrze o tym wiem. Problem polega na czymś innym. User może wpisać punkty w kolejności jakiej chce. Niekoniecznie te wpisane jeden po drugiej muszą tworzyć wspólnego boku. Teraz trzeba by je jakość posegregować by tak było. Punkt1 tworzy z punktem3 jedynie przekątną - one są dłuższe niż boki. Bok = a, przekątna= a* pierwiastek z 2. float dlugosc_boku( int x1, int y1, int x2, int y2 ) { float bok = sqrt(( x1 - x2 ) *( x1 - x2 ) +( y1 - y2 ) *( y1 - y2 ) ); return bok; }
bool przydziel_boki() { a = dlugosc_boku( wierzcholki[ 0 ][ 0 ], wierzcholki[ 0 ][ 1 ], wierzcholki[ 1 ][ 0 ], wierzcholki[ 1 ][ 1 ] ); b = dlugosc_boku( wierzcholki[ 1 ][ 0 ], wierzcholki[ 1 ][ 1 ], wierzcholki[ 2 ][ 0 ], wierzcholki[ 2 ][ 1 ] ); c = dlugosc_boku( wierzcholki[ 2 ][ 0 ], wierzcholki[ 2 ][ 1 ], wierzcholki[ 3 ][ 0 ], wierzcholki[ 3 ][ 1 ] ); d = dlugosc_boku( wierzcholki[ 3 ][ 0 ], wierzcholki[ 3 ][ 1 ], wierzcholki[ 0 ][ 0 ], wierzcholki[ 0 ][ 1 ] ); e = dlugosc_boku( wierzcholki[ 1 ][ 0 ], wierzcholki[ 1 ][ 1 ], wierzcholki[ 3 ][ 0 ], wierzcholki[ 3 ][ 1 ] ); f = dlugosc_boku( wierzcholki[ 2 ][ 0 ], wierzcholki[ 2 ][ 1 ], wierzcholki[ 0 ][ 0 ], wierzcholki[ 0 ][ 1 ] ); if( a == b && b == c && c == d && d == a && e == f ) return true; else return false; }
Przykład praktyczny, mam punkty: (-1,1),(1,1),(-1,1),(1,-1) Jeśli tak wklepie punkty gdy mnie spyta, wszystko ok. Ale gdy już: (-1,1),(1,1),(1,-1),(-1,1) - 2 ostatnie zamienione, tworzy cuda. Jest na to jakiś gotowy algorytm? |
|
withelm |
» 2012-11-11 19:15:14 sortowanie kątowe |
|
cyklopek11 |
» 2012-11-11 19:21:48 wiktor12348 widzę, że chcesz się bawić geometrią analityczną w programowaniu. Dlatego przypomnij sobie co mówił Twój nauczyciel z matematyki oraz Twój nauczyciel z informatyki na temat wielokątów. W kartezjańskim układzie współrzędnych wielokąty mogą być wklęsłe lub wypukłe. O ile zaimplementowanie wielokątów wypukłych w programie jest trywialne, o tyle zaimplementowanie wielokątów wklęsłych to już wyższa szkoła obliczeń. Dlatego też każda szanująca się biblioteka implementuje wielokąty wklęsłe jako sume wielokątów wypukłych (np. biblioteka box2D). Zyskuje się wtedy na wydajności. Ponieważ przy większej ilości punktów niż 3 możemy z nich zbudować wielokąt zarówno wypukły jak i wklęsły, to trzeba jakoś dać znać programowi, że mamy na myśli wielokąt wypukły. Wymusza to podawanie współrzędnych punktów tworzących wielokąt w kierunku zgodnym lub przeciwnym do kierunku ruchu wskazówek zegara. Tak ma (miała, dawno się nią nie bawiłem) to zaimplementowana wspomniana biblioteka box2D. Program byłby w stanie sam z podanych w dowolnej kolejności określić połączenia pomiędzy nimi aby dały wielokąt wypukły (i jeśli jest to możliwe to również wklęsły). Nawet nie wyobrażasz sobie ile jest z tym roboty (chyba, że są jakieś biblioteki do tego nie używałem, nie wiem). Dlatego najlepiej podawać punkty w konwencji zgodnej lub przeciwnej w stosunku do ruchu wskazówek zegara. Wtedy taki program napisać to "pikuś". W przypadku twojego programu (z kwadratami) aby za dużo nie kombinować zrób tak: 1.) Nie określaj danych punktów do danego boku. 2.) Niech użytkownik wprowadzi punkty w dowolnej kolejności jakiej chce. 3.) Zapisz je do zmiennych 4.) oblicz wszystkie możliwe odległości pomiędzy punktami (niektóre będą się powtarzać więc musisz to przemyśleć w swoim algorytmie) 5.) Otrzymane sześć różnych odległości porównaj w następujący sposób: jeśli cztery z nich są równe jakiejś liczbie a i dodatkowo dwa pozostałe równe jakiejś liczbie b to punkty tworzą kwadrat. Koniec.
Gdy będziesz chciał bawić się na innych wielokątach niż kwadrat, to musisz pamiętać o wielokątach wklęsłych.
|
|
wiktor12348 Temat założony przez niniejszego użytkownika |
» 2012-11-11 19:51:53 Szczerze, domyślałem się że trzeba by się naliczyć by przesortować to, także rezygnuję. Ostatnia metoda nie jest głupia, nawet nad nią myślałem. Ale chyba napisze: "Wpisuj punkty w kierunku przeciwnym do kierunku ruchu wskazówek zegara".
Dzięki :) |
|
« 1 » |