AngrySkarpeta Temat założony przez niniejszego użytkownika |
[C++] Zamiatanie po kącie, dla kompletnego laika » 2014-05-27 20:10:15 Witam, Wiem że może to być dość upierdliwie, ale pilnie potrzebuje pomocy, otóż absolutnie nie wyobrażam sobie jak miałoby by wyglądać "zamiatanie po kącie" w kodzie, znam niby podstawy teoretyczne, ale jestem raczej laikiem jeżeli chodzi o programowanie a potrzebuje tego na zaliczenie, nie oczekuje napisania za mnie programu (bez przesady) ale pomocy w zrozumieniu jak to powinno wyglądać i dlaczego. Algorytm zamiatania wykorzystać muszę w zadaniu 10 pod tym linkiem http://www.wfis.uni.lodz.pl/staff/tgwizdalla/files/problemy_zal_13_14.pdf mam nadzieje że wykorzystanie go tutaj jest poprawne (Prowadzący powiedział że "być może" -.-). Póki co napisałem klasę dla tego zagadnienia, i byłbym wdzięczny jakby ktoś spojrzał czy nie narobiłem jakichś głupot (co było by, wstyd się przyznać ale bardzo w moim stylu), oraz za każdą podpowiedź w kwestii "jak zacząć". Postaram się dziś, albo jutro wstawić jeszcze efekty mojej "rozkminy" wraz z kolegą, który jest w te klocki trochę lepszy niż ja ;-). Z góry dziękuje wszystkim którzy zechcą mi pomóc ;-) #include <iostream> #include <cstdlib> #include <fstream> #include <string> #include <math.h> class Swiatynia { public: int NW_x, NW_y, SE_x, SE_y, NE_x, NE_y, SW_x, SW_y; char Kierunek; float Oltarz_x, Oltarz_y, Sciana_N, Sciana_S, Sciana_W, Sciana_E; float Drzwi_N_x1, Drzwi_N_x2, Drzwi_N_y1, Drzwi_N_y2, Drzwi_S_x1, Drzwi_S_x2, Drzwi_S_y1, Drzwi_S_y2, Drzwi_W_x1, Drzwi_W_x2, Drzwi_W_y1, Drzwi_W_y2, Drzwi_E_x1, Drzwi_E_x2, Drzwi_E_y1, Drzwi_E_y2; Swiatynia() { NW_x = NW_y = SE_x = SE_y = 0; Kierunek = NULL; } Swiatynia( int Nw_x, int Nw_y, int Se_x, int Se_y, char kierunek ) { NW_x = Nw_x; NW_y = Nw_y; SE_x = Se_x; SE_y = Se_y; Kierunek = kierunek; Oltarz_x =(( Nw_x + Se_x ) / 2 ); Oltarz_y =(( Nw_y + Se_y ) / 2 ); NE_x = SE_x; NE_y = NW_y; SW_x = NW_x; SW_y = SE_y; Sciana_N = sqrt((( NE_x - NW_x ) ^ 2 ) -(( NE_y - NW_y ) ^ 2 ) ); Sciana_S = sqrt((( SE_x - SW_x ) ^ 2 ) -(( SE_y - SW_y ) ^ 2 ) ); Sciana_W = sqrt((( NW_x - SW_x ) ^ 2 ) -(( NW_y - SW_y ) ^ 2 ) ); Sciana_E = sqrt((( NE_x - SE_x ) ^ 2 ) -(( NE_y - SE_y ) ^ 2 ) ); Drzwi_N_y1 = Drzwi_N_y2 = NW_y; Drzwi_N_x1 =(( NW_x + NE_x ) / 2 ) -( 0.25 *( Sciana_N ) ); Drzwi_N_x2 =(( NW_x + NE_x ) / 2 ) +( 0.25 *( Sciana_N ) ); Drzwi_S_y1 = Drzwi_S_y2 = SE_y; Drzwi_S_x1 =(( SW_x + SE_x ) / 2 ) -( 0.25 *( Sciana_S ) ); Drzwi_S_x2 =(( SW_x + SE_x ) / 2 ) +( 0.25 *( Sciana_S ) ); Drzwi_W_x1 = Drzwi_W_x2 = SW_x; Drzwi_W_y1 =(( SW_x + NW_x ) / 2 ) -( 0.25 *( Sciana_W ) ); Drzwi_W_y1 =(( SW_x + NW_x ) / 2 ) +( 0.25 *( Sciana_W ) ); Drzwi_E_x1 = Drzwi_E_x2 = SE_x; Drzwi_E_y1 =(( SE_y + NE_y ) / 2 ) -( 0.25 *( Sciana_E ) ); Drzwi_E_y1 =(( SE_y + NE_y ) / 2 ) -( 0.25 *( Sciana_E ) ); } };
using namespace std; Swiatynia * Tablica[ 100 ]; int main() { int Ile_Swiatyn, Nw_x, Nw_y, Se_x, Se_y; char kierunek; cout << " Program przyjmuje plik o nazwie 'wejsciowe.txt'" << endl; ifstream wejsciowe; wejsciowe.open( "wejsciowe.txt" ); wejsciowe >> Ile_Swiatyn; cout << Ile_Swiatyn << endl; for( int i = 0; i < Ile_Swiatyn; i++ ) { wejsciowe >> Nw_x; wejsciowe >> Nw_y; wejsciowe >> Se_x; wejsciowe >> Se_y; wejsciowe >> kierunek; Tablica[ i ] = new Swiatynia( Nw_x, Nw_y, Se_x, Se_y, kierunek ); } for( int i = 0; i < Ile_Swiatyn; i++ ) { cout << Tablica[ i ]->NW_x << " " << Tablica[ i ]->NW_y << " " << Tablica[ i ]->SE_x << " " << Tablica[ i ]->SE_y << " " << Tablica[ i ]->Kierunek << " " << Tablica[ i ]->Oltarz_x << " " << Tablica[ i ]->Oltarz_y << endl; } cout <<( Tablica[ 0 ]->Drzwi_E_x1 ); wejsciowe.close(); return 0; }
|
|
pekfos |
» 2014-05-27 20:16:34 byłbym wdzięczny jakby ktoś spojrzał czy nie narobiłem jakichś głupot |
Sciana_N = sqrt((( NE_x - NW_x ) ^ 2 ) -(( NE_y - NW_y ) ^ 2 ) );
|
Na pierwszy rzut oka, nie ma tu niczego gorszego, niż te 'potęgowanie'. |
|
AngrySkarpeta Temat założony przez niniejszego użytkownika |
» 2014-05-27 20:20:59 Ok, dopiero poczytałem że użyć by wypadało "pow". Dziękuje ;-) To mogło być powodem dla którego w przypadku niektórych punktów program wyświetlał "nan" ;-) Poprawiłem, jednak niektóre wartości nadal mam oznaczone jako "nan", orientuje się ktoś jaki może być powód? #include <iostream> #include <cstdlib> #include <fstream> #include <string> #include <math.h> class Swiatynia { public: int NW_x, NW_y, SE_x, SE_y, NE_x, NE_y, SW_x, SW_y; char Kierunek; float Oltarz_x, Oltarz_y, Sciana_N, Sciana_S, Sciana_W, Sciana_E; float Drzwi_N_x1, Drzwi_N_x2, Drzwi_N_y1, Drzwi_N_y2, Drzwi_S_x1, Drzwi_S_x2, Drzwi_S_y1, Drzwi_S_y2, Drzwi_W_x1, Drzwi_W_x2, Drzwi_W_y1, Drzwi_W_y2, Drzwi_E_x1, Drzwi_E_x2, Drzwi_E_y1, Drzwi_E_y2; Swiatynia() { NW_x = NW_y = SE_x = SE_y = 0; Kierunek = NULL; } Swiatynia( int Nw_x, int Nw_y, int Se_x, int Se_y, char kierunek ) { NW_x = Nw_x; NW_y = Nw_y; SE_x = Se_x; SE_y = Se_y; Kierunek = kierunek; Oltarz_x =(( Nw_x + Se_x ) / 2 ); Oltarz_y =(( Nw_y + Se_y ) / 2 ); NE_x = SE_x; NE_y = NW_y; SW_x = NW_x; SW_y = SE_y; Sciana_N = sqrt(( pow( NE_x - NW_x, 2 ) ) -( pow( NE_y - NW_y, 2 ) ) ); Sciana_S = sqrt(( pow( SE_x - SW_x, 2 ) ) -( pow( SE_y - SW_y, 2 ) ) ); Sciana_W = sqrt(( pow( NW_x - SW_x, 2 ) ) -( pow( NW_y - SW_y, 2 ) ) ); Sciana_E = sqrt(( pow( NE_x - SE_x, 2 ) ) -( pow( NE_y - SE_y, 2 ) ) ); Drzwi_N_y1 = Drzwi_N_y2 = NW_y; Drzwi_N_x1 =(( NW_x + NE_x ) / 2 ) -( 0.25 *( Sciana_N ) ); Drzwi_N_x2 =(( NW_x + NE_x ) / 2 ) +( 0.25 *( Sciana_N ) ); Drzwi_S_y1 = Drzwi_S_y2 = SE_y; Drzwi_S_x1 =(( SW_x + SE_x ) / 2 ) -( 0.25 *( Sciana_S ) ); Drzwi_S_x2 =(( SW_x + SE_x ) / 2 ) +( 0.25 *( Sciana_S ) ); Drzwi_W_x1 = Drzwi_W_x2 = SW_x; Drzwi_W_y1 =(( SW_x + NW_x ) / 2 ) -( 0.25 *( Sciana_W ) ); Drzwi_W_y1 =(( SW_x + NW_x ) / 2 ) +( 0.25 *( Sciana_W ) ); Drzwi_E_x1 = Drzwi_E_x2 = SE_x; Drzwi_E_y1 =(( SE_y + NE_y ) / 2 ) -( 0.25 *( Sciana_E ) ); Drzwi_E_y1 =(( SE_y + NE_y ) / 2 ) -( 0.25 *( Sciana_E ) ); } };
using namespace std; Swiatynia * Tablica[ 100 ]; int main() { int Ile_Swiatyn, Nw_x, Nw_y, Se_x, Se_y; char kierunek; cout << " Program przyjmuje plik o nazwie 'wejsciowe.txt'" << endl; ifstream wejsciowe; wejsciowe.open( "wejsciowe.txt" ); wejsciowe >> Ile_Swiatyn; cout << Ile_Swiatyn << endl; for( int i = 0; i < Ile_Swiatyn; i++ ) { wejsciowe >> Nw_x; wejsciowe >> Nw_y; wejsciowe >> Se_x; wejsciowe >> Se_y; wejsciowe >> kierunek; Tablica[ i ] = new Swiatynia( Nw_x, Nw_y, Se_x, Se_y, kierunek ); } for( int i = 0; i < Ile_Swiatyn; i++ ) { cout << Tablica[ i ]->NW_x << " " << Tablica[ i ]->NW_y << " " << Tablica[ i ]->SE_x << " " << Tablica[ i ]->SE_y << " " << Tablica[ i ]->Kierunek << " " << Tablica[ i ]->Oltarz_x << " " << Tablica[ i ]->Oltarz_y << endl; } cout <<( Tablica[ 0 ]->Drzwi_E_y1 ); wejsciowe.close(); return 0; }
_________________________ EDIT: Ok, w sumie nic z "rozkminiania" nie wyszło. Nie mam pojęcia jak się zabrać za "zamiatanie" niby wiem na czym polega algorytm, jednak nigdzie nie mogę znaleźć jak wygląda coś takiego w kodzie x.x |
|
AngrySkarpeta Temat założony przez niniejszego użytkownika |
» 2014-05-31 18:41:57 A może orientuje się ktoś jak zrobić to zadanie bez algorytmu zamiatania? Wiem jak sprawdzić czy dwa odcinki się przecinają, ale nie wiem jak sprawdzić, czy w "obszarze widoczności" wszystko jest zasłonięte przez ściany. |
|
« 1 » |