Najprostszym sposobem na sprawdzanie czy wybrany punkt leży wewnątrz trójkąta polega na narysowaniu go i zaznaczeniu punktów. Jednak tego typu rozwiązywanie problemu dla komputera oznaczałoby zużycie dodatkowej mocy na narysowanie. Co więcej później dalej by nie wiedział czy leży wewnątrz czy nie, bo nie umie analizować obrazków! Najprostszym sposobem jest rozpisanie formuł matematycznych.
Dany jest trójkąt T, który został opisany przez współrzędnej wszystkich trzech wierzchołków: (x1, y1), (x1, y1), (x1, y1). Dany jest punkt P = (xp, yp). Zadanie polega na stwierdzeniu czy punkt P leży wewnątrz trójkąta T.
Jednym z najprotszych sposobów na sprawdzenie czy punkt leży wewnątrz trójkąta jest podzielenie go na trzy podobszary tak jak zostało to przedstawione poniżej:
Sumując wszystkie te trzy obszary suma powinna się równać polu trójkąta wyjściowego. Jeśli tak nie jest to znaczy, że punkt leży poza trójkątem. Potrzebna jest tutaj formuła na wyliczanie pola trójkąta na podstawie jego współrzędnych. Wzór wygląda następująco: T∆ = 0.5·|x1(y2 - y3) + x2(y3 - y1 + x3(y1 - y2))| co zapisane w postaci funkcji Obszar() przedstawia się następująco:
Wtedy funkcja sprawdzająca czy punkt jest w środku będzie polegać na wyliczeniu wszystkich kolejnych trójkątów, a następnie porównanie z polem trójkąta niepodzielonego na obszary. Przykładowa implementacja wygląda następująco:
Wyliczany jest najpierw (2.) obszar całego trójkąta, a potem (3. - 5.) podobszarów i (6.) wynikiem jest porównanie sumy podobszarów do obszaru głównego. Warto zauważyć, że problemem może się tutaj okazać, że dane w komputerze są przechowywane w postaci przybliżonej.
Sprawdzanie obszaru za każdym razem jest metodą prostą, ale nieefektywną. Proces ten można przyśpieszyć używając wpółrzędnych barycentrycznych. Przepis na znalezienie czy punkt jest w środku trójkąta jest wtedy następujący:
Na początek przekształć punkty względem punktu A w następujący sposób: B = B - A, C = C - A, P = P - A. Następnie wylicz d = x2y3-x3y2. Teraz pozostaje sprawdzić czy następujące wartości znajdują się w przedziale [0, d]:
Program realizujący to zadanie przedstawia się następująco:
W programie kolejno są wyliczane: (2. - 4.) kolejne przesunięcia poszczególnych punktów, (5.) skalar d oraz (6. - 8.) wartości barycentrycznych wag. Na koniec (9.) wynikiem jest koniunkcja wszystkich warunków.
Pomocnicza funkcja zakres zwraca wartość logiczną prawda wtedy i tylko wtedy, gdy podana wartość val leży w zakresie [min, max].
W celu przetestowania funkcji można skorzystać z poniższej funkcji main(), która wczyta od użytkownika potrzebne dane, a następnie wypisze na ekran informację czy punkt leży wewnątrz trójkąta:
Napisz funkcji narysujTrojkat(), która przyjmie sześć argumentów parami określające współrzędne wierzchołków trójkąta. Program powinien narysować fragment trójkąta mieszczący się pierwszej ćwiartce układu współrzędnych dla wartości x i y mniejszych od 10.
Oto przykładowanie wywołanie funkcji narysujTrojkat() dla punktów: (0, 2), (10, 2) oraz (5, 7).