Warunek istnienia trójkąta jest spełniony, gdy najdłuższy odcinek jest krótszy od sumy dwóch pozostałych. Zakładając że i to najkrótsze odcinki, musi zajść nierówność:
Jeżeli nie chcemy wyznaczać najkrótszych odcinków, możemy ułożyć układ trzech nierówności:
Powyższy układ jest łatwiejszy do zaimplementowania. Nie musimy przejmować się kolejnością wprowadzanych długości bądź ich sortowaniem.
Funkcja realizująca sprawdzanie warunku istnienia trójkąta w języku C++:
1
2
3
4
5
bool czyTrojkatIstnieje(double a, double b, double c) {
return (a + b > c) &&
(a + c > b) &&
(b + c > a);
}
różnoboczny - trójkąt o trzech bokach różnej długości
równoramienny - trójkąt o dwóch bokach (ramionach) tej samej długości
równoboczny - trójkąt o trzech bokach tej samej długości
ostrokątny - trójkąt o trzech kątach ostrych
prostokątny - trójkąt z jednym kątem prostym
rozwartokątny - trójkąt z jednym kątem rozwartym
Wychodząc z twierdzenia cosinusów, możemy ustalić rodzaj trójkąta na podstawie długości jego boków:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <iostream>
#include <algorithm>
using namespace std;
enum KlasyfikacjaBoki {
roznoboczny,
rownoramienny,
rownoboczny
};
enum KlasyfikacjaKaty {
ostrokatny,
prostokatny,
rozwartokatny
};
class Trojkat {
double m_a, m_b, m_c;
KlasyfikacjaBoki klasyfikujBoki();
KlasyfikacjaKaty klasyfikujKaty();
public:
// Konstruktor przyjmujący długości boków trójkąta
Trojkat(double a, double b, double c);
// Metoda wyświetlająca informacje o trójkącie
void info();
};
Trojkat::Trojkat(double a, double b, double c) : m_a(a), m_b(b), m_c(c) {
// Sortowanie długości boków rosnąco
if(m_a > m_b) swap(m_a, m_b);
if(m_a > m_c) swap(m_a, m_c);
if(m_b > m_c) swap(m_b, m_c);
// Wyświetl informacje o trójkącie
info();
}
KlasyfikacjaBoki Trojkat::klasyfikujBoki() {
// Jeżeli trójkąt ma wszystkie boki rózne to jest różnoboczny
if(m_a != m_b && m_a != m_c && m_b != m_c) return roznoboczny;
// Jeżli trójkąt ma parę takich samych boków (a i b lub b i c)
if(m_a == m_b || m_b == m_c) {
// Jeżeli trójkąt ma rózne boki a i c to jest równoramienny,
// wówczas ramiona są parą boków a i b lub b i c
if(m_a != m_c) return rownoramienny;
// W przeciwnym wypadku jest równoboczny (a == b == c)
else return rownoboczny;
}
}
KlasyfikacjaKaty Trojkat::klasyfikujKaty() {
const double sumaKwadratow = m_a * m_a + m_b * m_b;
const double kwadratC = m_c * m_c;
// Zależności wynikające z twierdzenia cosinusów:
// Jeżeli suma kwadratów a i b jest większa od kwadratu c to jest ostrokątny
if(sumaKwadratow > kwadratC) return ostrokatny;
// Jeżeli suma kwadratów a i b jest równa kwadratowi c to jest prostokątny
if(sumaKwadratow == kwadratC) return prostokatny;
// W przeciwnym wypadku jest rozwartokątny
else return rozwartokatny;
}
void Trojkat::info() {
cout << "Trójkąt o bokach "
<< m_a << ", "
<< m_b << ", "
<< m_c << " ";
// Jeżeli trójkąt nie istnieje, wypisz odpowiedni tekst
if(m_a + m_b <= m_c) {
cout << "nie istnieje" << endl;
return;
}
// W przeciwnym wypadku określ rodzaj trójkąta
// W zależności od zwróconej wartości przez metody klasyfikuj*
// wyświetl odpowiedni tekst
switch(klasyfikujBoki()) {
case roznoboczny:
cout << "różnoboczny";
break;
case rownoramienny:
cout << "równoramienny";
break;
case rownoboczny:
cout << "równoboczny";
break;
}
cout << " i ";
switch(klasyfikujKaty()) {
case ostrokatny:
cout << "ostrokątny";
break;
case prostokatny:
cout << "prostokątny";
break;
case rozwartokatny:
cout << "rozwartokątny";
break;
}
cout << endl;
}
int main() {
// Sprawdzamy poprawność algorytmu dla różnych trójkątów
Trojkat(7, 3.5, 3.5);
Trojkat(4, 5, 6);
Trojkat(5, 3, 4);
Trojkat(12, 8, 5);
Trojkat(12, 16, 12);
Trojkat(4, 4, 6);
Trojkat(3, 3, 3);
}