Wpisanie trojkata w kwadrat
Ostatnio zmodyfikowano 2015-06-03 11:12
kubem25 Temat założony przez niniejszego użytkownika |
Wpisanie trojkata w kwadrat » 2015-06-03 00:00:05 Mam do wykonania takie zadanie: Napisz program, który wczyta długość boku kwadratu oraz trzy długości boków trójkąta następnie stwierdzi, czy podany trójkąt da się umieścić wewnątrz zadanego kwadratu (uwzględniając także możliwość obrócenia trójkąta). Dodatkowo (+1 pkt) program może podawać, jaki jest potrzebny kąt obrotu trójkąta zakładając, że pierwszy z jego podanych boków był przed obrotem równoległy do dolnego boku kwadratu. Mam napisany kod, jednak po dokladnych obliczeniach okazuje sie ze zalozenia stworzone przeze mnie sa zle. Ma ktos z was jakis pomysl na zalozenia dla tego zadania? Z gory dziekuje za pomoc. Moj kod wyglada w nastepujacy sposob: #include "stdafx.h" #include <iostream> #include <conio.h> #include <math.h> using namespace std;
int _tmain( int argc, _TCHAR * argv[] ) { float a, b, c, d, e, f, g, h; unsigned short int znak; cout << "Program do sprawdzania mozliwosci wpisania trojkat w kwadrat" << endl << endl; do { cout << "Co chcesz zrobic?" << endl; cout << "1. Zbadaj czy trojkat zmiesci sie w kwadrat" << endl; cout << "2. Zamknij pogram" << endl; cin >> znak; switch( znak ) { case 1: { cout << "Podaj dlugosc pierwszego z bokow trojkata: "; cin >> a; cout << "Podaj dlugosc drugiego z bokow trojkata: "; cin >> b; cout << "Podaj dlugosc trzeciego z bokow trojkata: "; cin >> c; cout << "Podaj dlugosc boku kwadratu: "; cin >> d; e = sqrt( d * d * 2 ); f = sqrt(( c * c ) -( d * d ) ); g = sqrt(( a * a ) -( d * d ) ); h = sqrt((( d - f ) *( d - f ) ) +(( d - g ) *( d - g ) ) ); if(( a <= 0 ) ||( b <= 0 ) ||( c <= 0 ) ||( a + b <= c ) ||( a + c <= b ) ||( b + c <= a ) ) { cout << "Z podanych bokow nie da sie utworzyc trojkata" << endl << endl; } else { if(( a > e ) ||( b > e ) ||( c > e ) ) { cout << "Dany trojkat nie zmiesci sie w kwadracie o podanej dlugosci boku." << endl << endl; } else { if((( a == e ) &&(( b > d ) ||( c > d ) ) ) ||(( b == e ) &&(( a > d ) ||( c > d ) ) ) ||(( c == e ) &&(( b > d ) ||( a > d ) ) ) ) { cout << "Dany trojkat nie zmiesci sie w kwadracie o podanej dlugosci boku." << endl << endl; } else { if(( f > d ) &&( g > d ) ) { cout << "Dany trojkat nie zmiesci sie w kwadracie o podanej dlugosci boku." << endl << endl; } else { if( b < h ) { cout << "Dany trojkat nie zmiesci sie w kwadracie o podanej dlugosci boku." << endl << endl; } else { cout << "Dany trojkat zmiesci sie w kwadracie o podanej dlugosci boku." << endl << endl; } } } } } } break; case 2: { exit( 0 ); } break; default: { cout << "Wybrano zla opcje" << endl << endl; } } } while( getch() != 27 ); return 0; }
|
|
darko202 |
» 2015-06-03 09:13:28 jeśli chodzi o założenia do tego zadania to trzeba uwzględnić 3 przypadki
a. najdłuższy bok trójkąta jest <= od boku kwadratu - trójkąt daje się wpisać i można go obracać
b. najdłuższy bok trójkąta > boku kwadratu i <= przekątnej kwadratu ? są różne podprzypadki niektóre trójkąty daje się wpisać, a inne nie ale wiemy, ze trójkąta nie możemy obrócić o 360stopni
c. najdłuższy bok trójkąta jest > od przekątnej kwadratu - trójkąt nie da się wpisać w kwadrat
jak rozwiązać punkt b ?
zał. K = bok kwadratu BT1 >= BT2 >= BT3 > 0 boki trójkąta od największego
popatrzmy jak byśmy to na narysowali - najpierw kwadrat, wierzchołki (0,0), (0,K), (K,K), (K,0) - punkt (0,0) pierwszy wierzchołek trójkąta - z punktu (0,0) cyrklem zataczamy koło o promieniu BT1 i szukamy punktu przecięcia z prostą y = K (powinna leżeć między punktami ((K,K), (K,0)) - punkt (W2x, W2y) - z punkt (W2x, W2y) zataczamy koło o promieniu BT2 - z punkt (0, 0) zataczamy koło o promieniu BT3 - przecięcie to trzeci wierzchołek trójkąta (w3x, w3y)
- sprawdzamy wierzchołek leży w kwadracie lub poza nim - jaki warunek w3x > K lub w3y < 0 a jak to zrobić programistycznie - skorzystajmy z geometrii analitycznej kwadrat to figura powstała z przecięcia prostych y=0, x=0, y=K, x=K
pierwszy wierzchołek trójkąta umieścimy w punkcie (0,0) to 2 wierzchołek leży na prostej y = K i okręgu x^2 + y^2 = BT1 ten punkt łatwo znaleźć rozwiązanie układ dwóch równań
analogicznie dla trzeciego wierzchołka tu będą równania dwóch okręgów
(x - w2x)^2 + (y - w2y)^2 = BT2^2 x^2 + y^2 = BT3 rozwiązanie układu dwóch równań kwadratowych
na koniec sprawdzenie warunku w3x > K lub w3y < 0
|
|
Piastlis |
» 2015-06-03 11:12:41 Gdzieś zagiął mój wcześniejszy post.... Ogólnie zgadzam się z darko202 ale punkt b. rozbiłbym na 2 przypadki. b1. Najdłuższy bok jest krótszy lub równy od przekątnej. Jeżeli przeciwległy kąt jest prosty lub rozwarty to ok. b2. Wyobraź sobie taką konstrukcję: układ współrzędnych i linia pod kątem 45 stopni.Wierzchołki trójkąta na osi x,y i na tej lini. Trzeba przeliczyć 3 przypadki gdy na tej lini pod kątem jest każdy wierzchołek trójkąta.
W sumie dla programu wystarczy tylko b. Zawiera wszystkie inne przypadki |
|
« 1 » |