Witam. Mam problem z jednym zadaniem. Mianowicie chodzi o to, aby na podstawie podanych wspolrzednych x i y wierzcholkow trójkąta określić czy drugi trójkąt jest wpisany w pierwszy. Na razie napisałem coś takiego, jednak dla wszystkich danych zwraca tak
:(. http://pastebin.com/eVTAJDmN
Dzięki za pomoc.
czy drugi trójkąt jest wpisany w pierwszy.
Czyli czy wszystkie wierzchołki trójkąta drugiego są wewnątrz trójkąta pierwszego. A to czy punkt znajduje się wewnątrz trójkąta testuje się bardzo prosto:
bool isPointInsideTriangle(const Point triangle[3], const Point &c) {
int notPlus(0), notMinus(0);
for (int i=1; i<=3; ++i) {
const Point &a= triangle[i%3];
const Point &b= triangle[i-1];
double x = (c.x-a.x)*(b.y-a.y)-(c.y-a.y)*(b.x-a.x);
if (x<=0) notPlus++;
if (x>=0) notMinus++;
}
return (notPlus==3) || (notMinus==3);
}
Prosta sprawa:
Policz czy wszystkie 3 wierzchołki trójkąta sprawdzanego leżą po "lewej" stronie (zakładając kierunek boków trójkąta przeciwny do ruchu wskazówej zegara) każdego z boków trójkąta zewnętrznego. Jeśli tak to trójkąt jest wewnątrz.
edit: w sumie to to samo co napisał kolega wyżej ;)
Dzięki Wam za podpowiedzi. Kombinuję i kombinuję jak skorzystać z tej funkcji podanej przez Marka. Rozumiem, że jako pierwszy parametr podaję tablicę z wierzcholkami trójkąta, a jako drugi parametr punkt, który chcę sprawdzić. Tylko, że do każdego punktu mam dwie wspolrzedne, nie za bardzo rozumiem jak je przekazać do funkcji :(
Dzięki za wskazówkę, teraz mam taki kod, jednak występuję błąd podczas kompilacji.
#include <stdio.h>
#include <iostream>
#include <cmath>
typedef struct { double x; double y; } Point;
using namespace std;
bool isPointInsideTriangle(const Point triangle[3], const Point &c)
{
int notPlus(0), notMinus(0);
for (int i=1; i<=3; ++i) {
const Point &a= triangle[i%3];
const Point &c= triangle[i-1];
double x = (c.x-a.x)*(b.y-a.y)-(c.y-a.y)*(b.x-a.x);
if (x<=0) notPlus++;
if (x>=0) notMinus++;
}
return (notPlus==3) || (notMinus==3);
}
int main()
{
double xa, ya, xb, yb, xc, yc;
cin >> xa >> ya >> xb >> yb >> xc >> yc;
Point a;
a.x = xa; a.y = ya;
Point b;
b.x = xb; b.y = yb;
Point c;
c.x = xc; c.y = yc;
Point triangle[3] = {a, b, c};
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
double xa2, ya2, xb2, yb2, xc2, yc2;
cin >> xa2 >> ya2 >> xb2 >> yb2 >> xc2 >> yc2;
Point aa;
aa.x = xa2; aa.y = ya2;
Point bb;
bb.x = xb2; bb.y = yb2;
Point cc;
cc.x = xc2; cc.y = yc2;
if (isPointInsideTriangle(triangle, aa)==true && isPointInsideTriangle(triangle, bb)==true && isPointInsideTriangle(triangle, cc)==true)
{
cout << "tak\n";
}
else
{
cout << "nie\n";
}
}
}
In function 'bool isPointInsideTriangle(const Point*, const Point&)':
33 31 [Error] 'b' was not declared in this scope
A czego z tego błędu nie rozumiesz?
Błąd rozumiem, tylko niezbyt wiem, gdzie dorzucić deklarację b. Po prostu jako int na początku funkcji?
Teraz już wiesz, dlaczego korzystanie z gotowców bez ich zrozumienia jest złe.
Przyjrzyj się, jakie typy mają zmienne a
oraz c
...
Wstawiłem
const Point &b= triangle[i-2]; a także potem const Point &b= triangle[i];
jednak teraz mam błędne wyniki tak samo jak przypadku mojej pierwszej wersji.. :(
Naucz się stosować tablicę i własny rozum. Po co tyle pisania skoro dane można czytać tak
bool readTriangle(Point triangle[3]) {
for(int i=0; i<3; ++i)
cin >> triangle[i].x >> triangle[i].y;
return cin.good();
}
// a potem:
Point tr1[3],tr2[3];
readTriangle(tr1);
readTriangle(tr2);
Przepraszam za to zamieszanie, poszedłem ślepo za kodem. Tak, znalazłem błąd, zamiast &c powinno być &b. Teraz zdaje się być poprawnie.
@MarekR22 tego ostatniego Twojego kodu jeszcze nie rozumiem, szczerze to pierwszy raz się spotykam z własnymi strukturami i nie wiem do końca jak funkcjonują. Zawsze rozwiązywałem prostsze problemy, programuję od niedawna, sorry za te moje perfidne pomyłki.
Dzięki za pomoc.