Punkty w trójkącie

0

Mam następujące zadanko:

https://pl.spoj.pl/problems/T_PINTR/

A oto moje rozwiazanie:

#include <iostream>
#include <math.h>
#include <string>
using namespace std;

int gdzie_lezy(double x1, double y1, double x2, double y2, double x3, double y3, double x, double y);
int prosta(double x1, double y1, double x2, double y2, double x, double y);

int main()
{
double x1, y1, x2, y2, x3, y3, x, y;
while(true)
{
cin >> x1;
cin >> y1;
cin >> x2;
cin >> y2;
cin >> x3;
cin >> y3;
cin >> x;
cin >> y;

            if (x1 == 0 && y1 == 0 && x2 == 0 && y2 == 0 && x3 == 0 && y3 == 0 && x == 0 && y == 0)
            {
                    break;
            }
            else
            {
                    gdzie_lezy( x1,  y1,  x2,  y2,  x3, y3,  x,  y);
            }
    }
    return 0;

}

int gdzie_lezy(double x1, double y1, double x2, double y2, double x3, double y3, double x, double y)
{
int a = prosta(x1, y1, x2, y2, x, y);
int b = prosta(x1, y1, x3, y3, x, y);
int c = prosta(x2, y2, x3, y3, x, y);
int test_a = prosta(x1, y1, x2, y2, x3, y3);
int test_b = prosta(x1, y1, x3, y3, x2, y2);
int test_c = prosta(x2, y2, x3, y3, x1, y1);

    if(a == 0 or b == 0 or c == 0)
    {
            cout << "E" << endl;
            return 0;
    }
   
    // sprawdzamy czy punkt oraz trzeci wierzchołek leżą po tej samej stronie prostej wyznaczanej przez pozostałe dwa punkty trójkąta
    if (test_a * a <0 or test_b * b <0 or test_c * c <0)
    {
            cout << "O" << endl;
            return 0;       
    }       
    else
    {
            cout << "I" << endl;
            return 0;
    }

}

int prosta(double x1,double y1,double x2,double y2,double x,double y)
{
int a,b;
if (x1 > x2)
{
a = x2;
b = x1;
}
else
{
a = x1;
b = x2;
}

    if(((y2-y1)/(x2-x1) * x + y1 - x1*(y2-y1)/(x2-x1)) == y && x >= a && x <= b)
    {       
            // punkt leży na krawędzi
            return 0;
    }

    if( (y2-y1)/(x2-x1) * (x - x1) + y1  > y)
    {
            // punkt leży pod prostą
            return -1;
    }
    else
    {
            // punkt leży nad prostą
            return 1;
    }

}

Poproszę o korektę.

0

http://cezet.host.sk/?page_id=61

funkcja

 bool __fastcall n2disPointinTriangle(textpoint P, textpoint P1,textpoint P2,textpoint P3)
0

Nie ma to jak bezmyślnie wszędzie fastcall sadzić, naprawdę trzeba być kretynem z wypalonym trawą mózgiem.

0

Nie gwarantuje, że jest dobrze, ale przynajmniej filozofia kodu powinna być przejrzysta i zrozumiała.
W każdym razie za pomocą iloczynu wektorowego ustalany jest kierunek wektorów w trójkącie (by było lewoskrętnie), a następnie sprawdzane jest czy punkt znajduje się po lewej stornie każdego wektora (boku).

struct point {
      int x,y;

      bool zero() {
           return x==0 && y==0;
      }
}

struct vector {
       int dx,dy;

       vector(const &point p1, const point &p2) {
              dx = p2.x-p1.x;
              dy = p2.y-p1.y;
       }

      bool zero() {
           return dx==0 && dy==0;
      }

      void revers() {
           dx=-dx;
           dy=-dy;
      }
}

int multiplyVect(const vector &a, const vector &b) {
    return a.dx*b.dy-a.dy*b.dx;
}

main()
{
     point p1;
     point p2;
     point p3;
     point p;

     while(cin >> p1.x >> p1.y 
               >> p2.x >> p2.y
               >> p3.x >> p3.y
               >> p.x >> p.y) {

          if (p1.zero()  && p2.zero() && p3.zero() && p.zero()) {
              break;
          }
          vector a(p1, p2), b(p2, p3), c(p3, p1);

          if (multiplyVect(a,b)<0) {
                a.revers();
                b.revers();
                c.revers();
          }

          int ax, bx, cx;

          ax = multiplyVect(a, vector(p1,p));
          bx = multiplyVect(b, vector(p2,p));
          cx = multiplyVect(c, vector(p3,p));
         
          if (ax<0 || bx<0 || cx<0) {
               cout << "O" << endl;
               continue;
          }

          if (ax==0 || bx==0 || cx==0) {
               cout << "E" << endl;
               continue;
          }
          cout << "I" << endl;
     }
}
0

wiele rozumiem, ale dajcie mi jeden powod dla ktorego nie powinienem wywalic watku, gdzie autor prosi o rozwiazanie zadania, pewnie zaliczeniowego bo semestr sie chyli ku koncowi; zadania z systemu auto-sprawdzajcego, dzieki ktoremu ma sie nauczyc czytac tresc zadania, pisac poprawny kod i nauczyc szukac algorytmow w literaturze; w dodatku systemu z 'mojego' wydzialu? jeszcze zeby autor przynajmniej cokolwiek opisal, ale nie, tutaj tylko sru-link, sru-kod, sru-poprawciemi. IMHO, no to sru-kosz.
comments?
ETA: 1 dzien.

1 użytkowników online, w tym zalogowanych: 0, gości: 1