Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Определить принадлежит ли точка треугольнику


Автор: Vasya2904 12.12.2013, 20:38
Доброе время суток! Нужно определить принадлежит ли точка треугольнику. Треугольник задан((3;1)(3;5)(6;2)), точка вводится(x0, y,). Использую решение через векторное произведнеие(http://www.cyberforum.ru/mathematics/thread8234.html), но считается не правильно. Вот код:
Код
#include<iostream>
#include<windows.h>
using namespace std;
int main()
{
setlocale (0, "");
int x0, x1, x2, x3, y0, y1, y2, y3, x, y, z;
double ur1, ur2, ur3;
cout << "Введите координаты: ";
cin >> x0 >> y0;
ur1 =((3 - x0) * (5 - 1)) - ((3 - 3) * (1 - y0));
ur2 = ((3 - x0) * (2 - 5)) - ((6 - 3) * (5 - y0));
ur3 = ((6 - x0) * (1 - 2)) - ((3 - 6) * (2 - y0));
bool a = (ur1 > 0);
bool b = (ur2 > 0);
bool c = (ur3 > 0);
if ((a && b && c) || (!a && !b && !c))
cout << "Точка внутри треугольника";
else if ((ur1 == 0) || (ur2 == 0) || (ur3 == 0))
cout << "Точка на стороне ";
else cout << "Точка снаружи ";
cin.get();
cin.get();
}

Что не так? Спасибо. 

Модератор: не забываем пользоваться кнопочкой "Код"

Автор: smalcom 12.12.2013, 22:47
Цитата

Что не так?

1. выглядит как мусорник
2. "что не так" и "не работает" из лексикона бухгалтеров.

вам скорее всего сюда http://forum.vingrad.ru/forum/Vingrad-help-center.html

Автор: rudolfninja 13.12.2013, 09:44
Вот рабочий код:
Код

class point
{
    int m_x;
    int m_y;
public:
    point() {m_x = 0, m_y = 0;}
    point(int x, int y) {m_x = x, m_y = y;}
    ~point() {m_x = 0, m_y = 0;}

    int x() {return m_x;}
    int y() {return m_y;}
};

bool isInTriangle(point pt1, point pt2, point pt3, point test);

int main()
{
point pt1(3, 1), pt2(3, 5), pt3(6, 2);
int x0, y0;
std::cout << "Input test point coordinates: ";
std::cin >> x0 >> y0;
point test(x0, y0);

if(isInTriangle(pt1, pt2, pt3, test))
    std::cout << "Inside\n";
else
    std::cout << "Outside\n";

return 0;
}

bool isInTriangle(point pt1, point pt2, point pt3, point test)
{
    int a = (pt1.x() - test.x()) * (pt2.y() - pt1.y()) - (pt2.x() - pt1.x()) * (pt1.y() - test.y());
    int b = (pt2.x() - test.x()) * (pt3.y() - pt2.y()) - (pt3.x() - pt2.x()) * (pt2.y() - test.y());
    int c = (pt3.x() - test.x()) * (pt1.y() - pt3.y()) - (pt1.x() - pt3.x()) * (pt3.y() - test.y());
 
    if ((a >= 0 && b >= 0 && c >= 0) || (a <= 0 && b <= 0 && c <= 0))
        return true;
    else
        return false;
}

Если точка принадлежит треугольнику, то функция isInTriangle возвращает true, иначе false. Под "принадлежит" понимается, что она либо лежит внутри треугольника, либо на одной из его сторон. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)