Polozenie trojkatow wzgledem siebie.

0

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.

1

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);
}
1

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 ;)

0

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 :(

0

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

0

A czego z tego błędu nie rozumiesz?

0

Błąd rozumiem, tylko niezbyt wiem, gdzie dorzucić deklarację b. Po prostu jako int na początku funkcji?

1

Teraz już wiesz, dlaczego korzystanie z gotowców bez ich zrozumienia jest złe.
Przyjrzyj się, jakie typy mają zmienne a oraz c...

0

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.. :(

1

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);
0

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.

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