dwa prostokąty

Wielokąty (n>3). Okręgi. Inne figury płaskie. Zadania i twierdzenia z nimi związane. Geometria rzutowa na płaszczyżnie.
lolwat
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 23 sie 2010, o 14:56
Płeć: Mężczyzna
Lokalizacja: Wrocław

dwa prostokąty

Post autor: lolwat » 23 sie 2010, o 15:12

Zadanie zaczerpnięte z pl.spoj.pl(nie, jego rozwiązanie nie jest nic warte ;) ).

Dane są dwa prostokąty na płaszczyźnie. Czy drugi można tak ustawić, aby zmieścił się w pierwszym(nie stykając się z nim)?

Mamy dane długości boków obu prostokątów.

[url=http://img576.imageshack.us/i/lolbe.png/][img]http://img576.imageshack.us/img576/9965/lolbe.th.png[/img][/url]

Uploaded with [url=http://imageshack.us]ImageShack.us[/url]

W wyniku serii niefortunnych obliczeń wyszedł mi następujący wielomian:
[latex](1+ \frac{a^{2}}{b^{2}} )e^{2} - 4ae + a^{2} + b^{2} - c^{2}[/latex]
Następnie wyliczam sobie e(a tym samym i e') i sprawdzam czy długość boku "c" drugiego prostokąta nie przekracza ram wyznaczonych przez Pitagorasa.

Gdzie popełniam błąd?

Z góry dziękuję za wszelkie przejawy zainteresowania tym problemem ;d.

Satirev
Użytkownik
Użytkownik
Posty: 22
Rejestracja: 10 sie 2010, o 00:57
Płeć: Mężczyzna
Lokalizacja: Poznań

dwa prostokąty

Post autor: Satirev » 23 sie 2010, o 16:53

Słuszna koncepcja (z tym obliczaniem e i e') ale ten wielomian jest niepotrzebny. Ułóż sobie warunki, takie jak: porównywanie odpowiednich boków prostokątów, porównanie przekątnych prostokątów itp. aż dojdziesz do momentu w którym z twierdzenia pitagorasa obliczysz e i e'. Następnie obliczysz maksylaną przeciwprostokątna powstałą na bazie e i e', którą porównasz z bokiem c i to sio. Jeśli nie wyraziłem się klarownie i przejrzyście, to przepraszam. Ewentualnie mogę wkleić kod swojego programu.

lolwat
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 23 sie 2010, o 14:56
Płeć: Mężczyzna
Lokalizacja: Wrocław

dwa prostokąty

Post autor: lolwat » 23 sie 2010, o 17:16

Wybacz, nie wspomniałem. Porównywanie boków trójkątów oczywiście zachodzi dużo wcześniej, dopiero później próbuję upchać drugi prostokąt po przekątnej ;).
Obliczenie maksymalnego możliwego boku c, w oparciu o e i e' to oczywiście już nie problem. Jedyny problem na jaki natrafiłem to obliczenie e(a tym samym i e') - staram się tu wykorzystać podobieństwo trójkątów - z tej idei narodził się wspomniany wielomian.
Niestety nie wiem jak inaczej policzyć e. Za wszelką pomoc(łącznie z fragmentami kodu) serdeczne Bóg zapłać ;).

Satirev
Użytkownik
Użytkownik
Posty: 22
Rejestracja: 10 sie 2010, o 00:57
Płeć: Mężczyzna
Lokalizacja: Poznań

dwa prostokąty

Post autor: Satirev » 23 sie 2010, o 17:26

narysowałbym schematyczny rysunek ale mi się nie chce, więc wkleje fragment kodu, który mam nadzieję Ci się przyda:

Kod: Zaznacz cały

//tutaj główne warunki...
if (Y < B)
			//jeśli przekątna mniejszego prostokąta jest mniejsza od B
          cout<<"TAK"<<endl; 
        else
          if (Y > X)
           //jeśli przekątna mniejszego prostokąta jest większa od przekątnej większego prostokąta
            cout<<"NIE"<<endl;
          else//jesli nie jest większa
          {
            //przyprostokątna leżąca na boku A
			W=sqrt(Y*Y - B*B);
			//pierwsza przyprostokątna malutkiego trójkąta
			L = (A-W)/2;
			 //przyprostokątna leżąca na boku B
			Z = sqrt(Y*Y-A*A);
			//druga przyprostokątna malutkiego trójkąta
			K=(B-Z)/2;
			//przeciwprostokątna malutkiego trójkąta
            DMax = sqrt(L * L + K * K);
			
			/* jeśli dł. krótszego boku drugiego prostokąta jest większa, bądź równa przeciwprostokątnej malutkiego trójkąta */
            if (D >= DMax)
              cout<<"NIE"<<endl;
            else // jeśli jest mniejsza
              cout<<"TAK"<<endl;
          }
//tutaj zamykanie odpowiednich modułów i zwrócenie zera
Wybacz, że inne oznaczenia zmiennych.

lolwat
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 23 sie 2010, o 14:56
Płeć: Mężczyzna
Lokalizacja: Wrocław

dwa prostokąty

Post autor: lolwat » 23 sie 2010, o 19:57

Początkowo przedstawiony kod nie działał dla mnie poprawnie(podejrzewałem "główne warunki"). Jak się okazało słusznie . Do głównych warunków dodałem jeden którego nie miałem

Kod: Zaznacz cały


if((ldouble)a/b < (ldouble)c/d){
	std::cout<<"NIE"<<std::endl;
	continue;
}
I od razu zaakceptowany . Dziękuję za pomoc i pozdrawiam!

Satirev
Użytkownik
Użytkownik
Posty: 22
Rejestracja: 10 sie 2010, o 00:57
Płeć: Mężczyzna
Lokalizacja: Poznań

dwa prostokąty

Post autor: Satirev » 23 sie 2010, o 22:43

Nie ma za co. Huh, ja mam więcej "głównych" warunków Z czystej ciekawości jaki czas wykonywalny programu uzyskałeś?

lolwat
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 23 sie 2010, o 14:56
Płeć: Mężczyzna
Lokalizacja: Wrocław

dwa prostokąty

Post autor: lolwat » 24 sie 2010, o 10:37

Głównych warunków oczywiście jest więcej . Podałem ten którego brakowało. Po oczyszczeniu kodu uzyskałem 0.04s.

Satirev
Użytkownik
Użytkownik
Posty: 22
Rejestracja: 10 sie 2010, o 00:57
Płeć: Mężczyzna
Lokalizacja: Poznań

dwa prostokąty

Post autor: Satirev » 24 sie 2010, o 11:39

O ja...w takim wypadku chyba muszę poszukac informacji o skracaniu kodu, bo mój aktualny czas to wstyd

ODPOWIEDZ