• 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?

0 głosów
1,320 wizyt
pytanie zadane 4 grudnia 2016 w C# i .NET 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

+3 głosów
odpowiedź 4 grudnia 2016 przez Benek Maniak (71,580 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 Maniak (71,580 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,260 p.)

Podobne pytania

0 głosów
0 odpowiedzi 73 wizyt
0 głosów
2 odpowiedzi 130 wizyt
pytanie zadane 30 czerwca w Inne języki przez Davidelo18 Użytkownik (560 p.)
0 głosów
1 odpowiedź 86 wizyt
Porady nie od parady
Pytania na temat serwisu SPOJ należy zadawać z odpowiednią kategorią dotyczącą tej strony.SPOJ

64,868 zapytań

111,331 odpowiedzi

234,217 komentarzy

46,733 pasjonatów

Przeglądających: 229
Pasjonatów: 5 Gości: 224

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...