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

Wpisanie trojkata w kwadrat

Ostatnio zmodyfikowano 2015-06-03 11:12
Autor Wiadomość
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:

C/C++
#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; //zdefiniowanie zmiennych
    unsigned short int znak;
   
   
    cout << "Program do sprawdzania mozliwosci wpisania trojkat w kwadrat" << endl << endl;
    do
    {
        // menu
        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:
            {
                //wprowadzanie danych: dlugosci bokow trojkata, dlugosc boku kwadratu
                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 ); // przekatna kwadratu
                f = sqrt(( c * c ) -( d * d ) ); // dlugosc potrzeba do sprawdzenia czy dany trojkat mozna wpisac w podany kwadrat
                g = sqrt(( a * a ) -( d * d ) ); // dlugosc potrzeba do sprawdzenia czy dany trojkat mozna wpisac w podany kwadrat
                h = sqrt((( d - f ) *( d - f ) ) +(( d - g ) *( d - g ) ) ); // dlugosc potrzeba do sprawdzenia czy dany trojkat mozna wpisac w podany kwadrat
               
               
                if(( a <= 0 ) ||( b <= 0 ) ||( c <= 0 ) ||( a + b <= c ) ||( a + c <= b ) ||( b + c <= a ) ) //sprawdzenie warunku na utworzenie trojkata o podanych bokach
                {
                    cout << "Z podanych bokow nie da sie utworzyc trojkata" << endl << endl;
                   
                }
                else
                {
                    if(( a > e ) ||( b > e ) ||( c > e ) ) //sprawdzenie pierwszego warunku (dlugosc najdluzszego boku musi byc krotsza lub rowna przekatnej kwadratu)
                    {
                        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 ) ) ) ) // sprawdzenie drugiego warunku ((dlugosc najdluzszego boku musi byc krotsza lub rowna przekatnej kwadratu i dwa pozostale boki krotsze od boku kwadratu)
                        {
                            cout << "Dany trojkat nie zmiesci sie w kwadracie o podanej dlugosci boku." << endl << endl;
                        }
                        else
                        {
                            if(( f > d ) &&( g > d ) ) //sprawdzenie trzeciego warunku (zaleznosci geometryczne)
                            {
                                cout << "Dany trojkat nie zmiesci sie w kwadracie o podanej dlugosci boku." << endl << endl;
                            }
                            else
                            {
                                if( b < h ) //sprawdzenie czwartego warunku (zaleznosci geometryczne)
                                {
                                    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 ); // zamkniecie programu po wybraniu odpowiedniej opcji
            } break;
            default:
            {
                cout << "Wybrano zla opcje" << endl << endl;
            }
        }
    } while( getch() != 27 );
   
   
   
   
    return 0;
}
P-133119
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




P-133123
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  
P-133130
« 1 »
  Strona 1 z 1