Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Współrzędne figury i sprawdzenie czy jest kwadratem

Ostatnio zmodyfikowano 2012-11-11 19:51
Autor Wiadomość
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ć?
P-68992
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.
P-69010
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.

C/C++
float dlugosc_boku( int x1, int y1, int x2, int y2 )
{
    float bok = sqrt(( x1 - x2 ) *( x1 - x2 ) +( y1 - y2 ) *( y1 - y2 ) );
    return bok;
}

C/C++
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 ] );
    //przekatne
    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?
P-69011
withelm
» 2012-11-11 19:15:14
sortowanie kątowe
P-69012
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.
P-69013
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 :)
P-69015
« 1 »
  Strona 1 z 1