Twoim celem jest ustalenie, czy dany punkt 2D X znajduje się w obszarze trójkąta o danych wierzchołkach A, B, C.
Napisz funkcję, która przyjmuje współrzędne punktu testowego X i trzech wierzchołków trójkąta (czyli w sumie 8 współrzędnych) i zwraca True, jeśli punkt znajduje się w tym trójkącie, i False, jeśli leży na zewnątrz.
Nie martw się o przypadki krawędzi. Jeśli punkt leży na granicy trójkąta (krawędzi lub wierzchołka) lub trójkąt jest w rzeczywistości segmentem linii, kod może zrobić wszystko, w tym awarię. Nie martw się także o stabilność numeryczną lub precyzję zmiennoprzecinkową.
Twój kod musi być nazwaną funkcją. Fragmenty kodu nie będą akceptowane.
Wygrywa niewiele postaci.
Wejście:
Osiem liczb rzeczywistych reprezentujących współrzędne. Liczby będą się mieścić w zakresie (-1,1)
.
Dokładny format wejściowy jest elastyczny. Możesz na przykład wziąć osiem liczb, listę ośmiu liczb, listę czterech punktów podanych przez krotkę, macierz 2 * 4, cztery liczby zespolone, dwie listy współrzędnych xi współrzędnych y, i tak dalej.
Dane wejściowe muszą być tylko liczbami w pewnym kontenerze, bez dodatkowych danych. Nie można użyć danych wejściowych do wykonania żadnego wstępnego przetwarzania, ani nie można wymagać żadnych ograniczeń na danych wejściowych, takich jak wymóg podawania punktów we współrzędnej rosnącej y. Twój wkład musi dopuszczać dowolne osiem współrzędnych (chociaż twój kod może zachowywać się arbitralnie we wspomnianych wcześniej przypadkach krawędzi).
Podaj swój format wejściowy.
Wynik:
Odpowiedni Boolean True
/ False
, odpowiedni numer 1
/ 0
lub analogi w Twoim języku.
Przypadki testowe
Dane wejściowe otrzymują listę [X,A,B,C]
czterech krotek, najpierw punkt testowy, a następnie trzy wierzchołki trójkąta. Pogrupowałem je w tych, których wyniki powinny być, True
i tych, które powinny False
.
True
instancje:
[(-0.31961, -0.12646), (0.38478, 0.37419), (-0.30613, -0.59754), (-0.85548, 0.6633)]
[(-0.87427, -0.00831), (0.78829, 0.60409), (-0.90904, -0.13856), (-0.80685, 0.48468)]
[(0.28997, -0.03668), (-0.28362, 0.42831), (0.39332, -0.07474), (-0.48694, -0.10497)]
[(-0.07783, 0.04415), (-0.34355, -0.07161), (0.59105, -0.93145), (0.29402, 0.90334)]
[(0.36107, 0.05389), (0.27103, 0.47754), (-0.00341, -0.79472), (0.82549, -0.29028)]
[(-0.01655, -0.20437), (-0.36194, -0.90281), (-0.26515, -0.4172), (0.36181, 0.51683)]
[(-0.12198, -0.45897), (-0.35128, -0.85405), (0.84566, 0.99364), (0.13767, 0.78618)]
[(-0.03847, -0.81531), (-0.18704, -0.33282), (-0.95717, -0.6337), (0.10976, -0.88374)]
[(0.07904, -0.06245), (0.95181, -0.84223), (-0.75583, -0.34406), (0.16785, 0.87519)]
[(-0.33485, 0.53875), (-0.25173, 0.51317), (-0.62441, -0.90698), (-0.47925, 0.74832)]
False
instancje:
[(-0.99103, 0.43842), (0.78128, -0.10985), (-0.84714, -0.20558), (-0.08925, -0.78608)]
[(0.15087, -0.56212), (-0.87374, -0.3787), (0.86403, 0.60374), (0.01392, 0.84362)]
[(0.1114, 0.66496), (-0.92633, 0.27408), (0.92439, 0.43692), (0.8298, -0.29647)]
[(0.87786, -0.8594), (-0.42283, -0.97999), (0.58659, -0.327), (-0.22656, 0.80896)]
[(0.43525, -0.8923), (0.86119, 0.78278), (-0.01348, 0.98093), (-0.56244, -0.75129)]
[(-0.73365, 0.28332), (0.63263, 0.17177), (-0.38398, -0.43497), (-0.31123, 0.73168)]
[(-0.57694, -0.87713), (-0.93622, 0.89397), (0.93117, 0.40775), (0.2323, -0.30718)]
[(0.91059, 0.75966), (0.60118, 0.73186), (0.32178, 0.88296), (-0.90087, -0.26367)]
[(0.3463, -0.89397), (0.99108, 0.13557), (0.50122, -0.8724), (0.43385, 0.00167)]
[(0.88121, 0.36469), (-0.29829, 0.21429), (0.31395, 0.2734), (0.43267, -0.78192)]