szukanie zaawansowane
 [ Posty: 6 ] 
Autor Wiadomość
Mężczyzna Offline
PostNapisane: 29 sie 2018, o 11:59 
Użytkownik
Avatar użytkownika

Posty: 21
Lokalizacja: Wrocław
Witam, mam oto takie zadanie:

Przekazana do funkcji checkOrth() tablica points[4][2] zawiera współrzędne czterech punktów. Przez pierwsze dwa punkty przechodzi jedna prosta, przez dwa kolejne punkty - druga.
Funkcja powinna zwrócić wartość true jeżeli proste przecinają się pod kątem prostym lub false - w przeciwnym razie.

No i zabrałem się tak:
Dwie proste są prostopadłe wtedy, gdy iloczyn ich współczynników kierunkowych jest równy -1. Teraz zostaje nam znaleźć współczynniki tych dwóch prostych i sprawdzić, czy ich iloczyn jest równy -1. Żeby je znaleźć tworzymy układ równań dla pierwszej i drugiej prostej. Dla pierwszej mamy:
\begin{cases} y _{1} = a _{1}x _{1} + b  \\ y _{2} = a _{1}x _{2} + b \end{cases}
Z tego wyznaczamy a _{1} i mamy:
a _{1} =  \frac{y _{2}-y _{1}}{x _{2}-x _{1} }
gdzie y _{1} to wartość y pierwszego punktu, a x _{1} to wartość x pierwszego punktu itd.
No i analogicznie wyznaczamy drugi współczynnik kierunkowy:
a _{2} =  \frac{y _{4}-y _{3}}{x _{4}-x _{3} }

Teraz wystarczy sprawdzić, czy a _{1} \cdot a _{2}=-1, czyli czy \frac{(y _{2}-y _{1})  (y _{4}-y _{3}) }{(x _{2}-x _{1}) (x _{4}-x _{3})}=-1
Kod:
1
2
3
4
5
6
7
8
9
10
11
12
13
bool checkOrth( int points[4][2] )
{
   int x = points[1][0]-points[0][0]; //x2-x1
   int y = points[2][0]-points[3][0]; //x4-x3
   int z = points[1][1]-points[0][1]; //y2-y1
   int c = points[3][1]-points[2][1]; //y4-y3
       
   if ( (z*c)/(x*y) == -1) {
      return true;
   } else {
      return false;
   }
}


I teraz pytanie: co jest nie tak? Wydaje mi się, że wszystko zrobiłem dobrze, ale niestety tak nie jest. Z góry dzięki za podpowiedź
Uniwersytet Wrocławski Instytut Matematyczny - rekrutacja 2019
Góra
Mężczyzna Offline
PostNapisane: 29 sie 2018, o 15:22 
Użytkownik
Avatar użytkownika

Posty: 3051
Lokalizacja: Radom
Nie wiem co dokładnie jestźle, ale na pewno zamiast ( (z*c)/(x*y) == -1)

napisz (z*c)==-(x*y) dzielenei intów to nie jest dobry pomysł
Góra
Mężczyzna Offline
PostNapisane: 29 sie 2018, o 15:54 
Moderator

Posty: 2762
Lokalizacja: Seattle, WA
Lepiej byłoby użyć iloczynu skalarnego wektorów.
Góra
Mężczyzna Offline
PostNapisane: 29 sie 2018, o 17:09 
Użytkownik
Avatar użytkownika

Posty: 3360
Lokalizacja: Krk
Linia numer 4.
Góra
Mężczyzna Offline
PostNapisane: 29 sie 2018, o 17:21 
Użytkownik
Avatar użytkownika

Posty: 21
Lokalizacja: Wrocław
mortan517 napisał(a):
Linia numer 4.

O kurczaki. Tak głupi błąd. Po zamianie dwóch liczb w 4 linii wszystko działa idealnie. Dziękuję bardzo
Góra
Mężczyzna Online
PostNapisane: 30 sie 2018, o 04:05 
Użytkownik

Posty: 16193
Lokalizacja: Bydgoszcz
Ciekawe co wyjdzie z tego algorytmu gdy x3=x4 ;)
Góra
Mężczyzna Offline
PostNapisane: 1 paź 2018, o 18:28 
Użytkownik

Posty: 946
Lokalizacja: Wrocław
On jakieś głupoty wylicza.

Warunek prostopadłość wektorów u i v: u.v = 0, a nie jakieś -1.
Góra
Utwórz nowy temat Odpowiedz w temacie  [ Posty: 6 ] 


 Zobacz podobne tematy
 Tytuł tematu   Autor   Odpowiedzi 
 [Bash] Sprawdzanie czy plik istnieje  Mat.Monia  5
 [C]sprawdzanie wielkości liter  edek86  12
 [Mathematica] sumowanie dwóch tablic, sprawdzanie indeksów  olqers91  2
 Sprawdzanie częstości występowania znaków c++  macmika  7
 [Bazy Danych] Wyznaczanie kluczy, sprawdzanie 2PN i 3PN  taktofon  2
 
Atom [Regulamin Forum] [Instrukcja LaTeX-a] [Poradnik] [F.A.Q.] [Reklama] [Kontakt]
Copyright (C) Karpatka.pl