• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czy punkt P leży wewnątrz trójkąta?

VPS Starter Arubacloud
0 głosów
3,701 wizyt
pytanie zadane 4 grudnia 2016 w C# przez Imerators Nowicjusz (150 p.)

Witajcie,

mam problem z zadaniem w C#. Męczę się już z nim z 3 godziny. crying Trochę matematyki i człowiek się gubi.

Dany jest trójkąt o współrzędnych A=(-4,4), B=(4,-2), C=(6,6).
- Wczytaj od użytkownika współrzędne punktu P=(x,y).
- Wypisz na ekranie informację czy punkt P leży wewnątrz, na zewnątrz, czy też na boku trójkąta ABC.
Wskazówka: Wyznacz proste AB,AC i BC oraz sprawdź położenie punktu P względem wyznaczonych prostych.

A tu wstawiam końcowy kod, który napisałem i który nie działa:

using System;

namespace Zadanie_3
{
    class Program
    {
        static void Main(string[] args)
        {
            const int x1 = -4, y1 = 4;
            const int x2 = 4, y2 = -2;
            const int x3 = 6, y3 = 6;

            int x, y;
            Console.Write("Podaj współrzędną x: ");
            x = Convert.ToInt32(Console.ReadLine());
            Console.Write("Podaj współrzędną y: ");
            y = Convert.ToInt32(Console.ReadLine());

            double AB = (y-y1)*(x2-x1)-(y2-y1)*(x-x1);
            double AC = (y-y1)*(x3-x1)-(y3-y1)*(x-x1);
            double BC = (y-4)*(x3-x2)-(y3-y2)*(x-x2);

            //Jeśli wszystkie te trzy wyrażenia są dodatnie, to (a, b) leży wewnątrz trójkąta ABC.
            if ((AB > 0) && (AC > 0) && (BC > 0)) Console.WriteLine("Punkt P leży |wewnątrz| trójkąta ABC.");
            //Jeśli żadne z tych wyrażen nie jest zerem, ale choć jedno jest ujemne, to (a, b) leży na zewnątrz ABC.
            else if (((AB != 0) && (AC != 0) && (BC != 0)) && ((AB < 0) || (AC < 0) || (BC < 0))) Console.WriteLine("Punkt P leży |na zewnątrz| trójkąta ABC.");
            //Jeśli jedno z tych trzech wyrażeń jest równe 0, to albo trókąt jest odcinkiem, albo(a, b) leży na odpowiednim boku trójkąta.
            if ((AB == 0) || (AC == 0) || (BC == 0)) Console.WriteLine("Punkt P leży |na boku| trójkąta ABC.");

            Console.ReadKey();
        }
    }
}

Dziękuję za wskazówki!

Pozdrawiam

2 odpowiedzi

+2 głosów
odpowiedź 4 grudnia 2016 przez Benek Szeryf (90,690 p.)
wybrane 4 grudnia 2016 przez Imerators
 
Najlepsza

Niezrozumiałe jest dla mnie to, w jaki sposób wyznaczasz równania prostych. Prostą można przedstawić w postaci równania:

y = Ax + B

A, B to współczynniki prostej (nie mylić z punktami A,B z treści zadania). Aby je wyznaczyć, wystarczy znajomość współrzędnych dwóch punktów, które na niej leżą:

y1 = Ax1 + B
y2 = Ax2 + B

A = (y2 - y1/x2 -x1)
B = y1 - (y2 - y1/x2 -x1)x1

Wystarczyło odjąć stronami dwa pierwsze równania i trochę poprzekształcać. Teraz musisz wyznaczyć trzy pary współczynników tych prostych:

y = A_AB * x + B_AB
y = A_AC * x + B_AC
y = A_BC * x + B_BC

Następnie należy dowiedzieć się, jak ten trójkąt wygląda, by wyznaczyć warunki tak, by określić wnętrze trójkąta. I tak, jak sobie to narysujesz i umieścisz dowolny punkt P(x0,y0) wewnątrz trójkąta, to zobaczysz, że muszą zachodzić warunki:

y0 > (A_AB * x0 + B_AB) && y0 < (A_AC * x0 + B_AC) && y0 > (A_BC * x0 + B_BC)

Jeśli punkt P będzie leżał na brzegu trójkąta, to następujący warunek zwróci prawdę:

y0 == (A_AB * x0 + B_AB) || y0 == (A_AC * x0 + B_AC) || y0 == (A_BC * x0 + B_BC)

Jeśli żaden z dwóch powyższych warunków nie zwróci prawdy, to znaczy że punkt leży poza trójkątem.

Niestety brakuje LaTexa na tym forum, by przedstawić wzory w czytelniejszej postaci.

komentarz 4 grudnia 2016 przez Imerators Nowicjusz (150 p.)

Dziękuję za odpowiedź, Benek. :)
Zadanie nabrało już dla mnie sensu, chociaż dalej nie mogę trafić w punkt wewnątrz trójkąta z jakiegoś powodu. Cały czas wyskakuje, że jest na zewnątrz.

            const int x1 = -4, y1 = 4;
            const int x2 = 4, y2 = -2;
            const int x3 = 6, y3 = 6;

            int x0, y0;
            Console.Write("Podaj współrzędną x: ");
            x0 = Convert.ToInt32(Console.ReadLine());
            Console.Write("Podaj współrzędną y: ");
            y0 = Convert.ToInt32(Console.ReadLine());

            double A_AB = (y2 - y1 / x2 - x1);
            double B_AB = (y1 - (y2 - y1 / x2 - x1) * x1);

            double A_AC = (y3 - y1 / x3 - x1);
            double B_AC = (y1 - (y3 - y1 / x3 - x1) * x1);

            double A_BC = (y3 - y2 / x3 - x2);
            double B_BC = (y2 - (y3 - y2 / x3 - x2) * x2);

            if ((y0 > (A_AB * x0 + B_AB) && y0 < (A_AC * x0 + B_AC) && y0 > (A_BC * x0 + B_BC))) Console.WriteLine("Punkt leży |wewnątrz| trójkąta.");
            else if (y0 == (A_AB * x0 + B_AB) || y0 == (A_AC * x0 + B_AC) || y0 == (A_BC * x0 + B_BC)) Console.WriteLine("Punkt leży |na boku| trójkąta.");
            else Console.WriteLine("Punkt leży |na zewnątrz| trójkąta.");

            Console.ReadKey(true);

Wszystko się zgadza?

komentarz 4 grudnia 2016 przez Benek Szeryf (90,690 p.)

Pogrupuj wyrażenia w nawiasy wewnątrz instrukcji if () :

if ((...) && (...) && (...))

Ponadto DRY (Don't repeat yourself) w liniach 12, 15, 18. W linijkach 11, 14, 17 już wyznaczyłeś współczynniki kierunkowe A prostych, powinieneś wykorzystać te zmienne.

+2 głosów
odpowiedź 4 grudnia 2016 przez playerony Pasjonat (15,240 p.)

Podobne pytania

0 głosów
0 odpowiedzi 467 wizyt
0 głosów
2 odpowiedzi 412 wizyt
pytanie zadane 30 czerwca 2019 w Inne języki przez Davidelo18 Użytkownik (660 p.)
0 głosów
1 odpowiedź 643 wizyt

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...