Форум программистов, компьютерный форум CyberForum.ru

Точка в треугольнике - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 90, средняя оценка - 4.93
Непрограммистка
0 / 0 / 0
Регистрация: 15.09.2010
Сообщений: 45
29.12.2010, 18:24     Точка в треугольнике #1
Помогите!
даны три вершины треугольника с координатами(коорд вводятся с клавиатуры) А(х1,y1) B(х2,y2) и С(х3,y3). И вводятся координаты другой точки Д(х4,y4)-и нужно определить принадлежит эта точка треугольнику или нет!А перед этим еще проверить возможен ли треугольник с такими точками.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2010, 18:24     Точка в треугольнике
Посмотрите здесь:

C++ Лежит ли точка в круге и треугольнике
C++ нахождение всех углов в треугольнике
Треугольник в треугольнике C++
Дана точка М(x, y). Присвоить z = 1, если точка принадлежит окружности с радиусом R и центром в точке (a, b) и z = 0 в противном случае. C++
C++ Даны отрезки [a, b] и [c, d] и точка A с координатой х. Определить, принадлежит ли данная точка одному из этих отрезков, обоим или лежит вне их
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mayonez
29.12.2010, 22:35     Точка в треугольнике
  #21

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
Mayonez, к сожалению, когда рассчитывают траектории космических кораблей, пользуются именно тем способом сравнения, который я указал...
поэтому и случается столько нестчастных случаев

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
29.12.2010, 22:37
  #22

Не по теме:

Mayonez, я был уверен, что вы ответите именно так

Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
29.12.2010, 22:45     Точка в треугольнике #23
Сообщение было отмечено автором темы, экспертом или модератором как ответ
пошутил...
silent_1991, извините если что не так, ну а если серйозно, то
Помогите!
даны три вершины треугольника с координатами(коорд вводятся с клавиатуры) А(х1,y1) B(х2,y2) и С(х3,y3). И вводятся координаты другой точки Д(х4,y4)-и нужно определить принадлежит эта точка треугольнику или нет!А перед этим еще проверить возможен ли треугольник с такими точками.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <cmath>
using namespace std;
 
struct point
{
   int x;
   int y;
};
 
int area(point a, point b, point c)
{
   return abs((a.x - c.x)*(b.y - c.y) + (b.x-c.x)*(c.y-a.y));
}
 
int main()
{
   /////////////////////////////////////////////////////////////////////////////
   point a, b, c, d;
   cout << "Введите сначала координаты вершин треугольника, а затем "
        << "координаты точки:" << endl;
   cin >> a.x >> a.y;
   cin >> b.x >> b.y;
   cin >> c.x >> c.y;
   cin >> d.x >> d.y;
   /////////////////////////////////////////////////////////////////////////////
   if (area(a, b, c))
   {
      if (area(a, b, c) == area(a, b, d) + area(a, d, c) + area(b, d, c))
            cout << "Точка находится внутри треугольника\n";
      else 
            cout << "Точка находится вне треугольника\n";
   }
   else
      cout << "Треугольник не существует\n";
   /////////////////////////////////////////////////////////////////////////////
   return 0;
}
silent_1991
29.12.2010, 22:51
  #24

Не по теме:

Цитата Сообщение от 'Mayonez' Посмотреть сообщение
пошутил...
Я понял)))

rekryt
1 / 1 / 0
Регистрация: 29.12.2010
Сообщений: 4
29.12.2010, 22:54     Точка в треугольнике #25
фокус!
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
29.12.2010, 22:56     Точка в треугольнике #26
Цитата Сообщение от rekryt Посмотреть сообщение
фокус!
первое сообщение, да?
Непрограммистка
0 / 0 / 0
Регистрация: 15.09.2010
Сообщений: 45
02.01.2011, 20:41  [ТС]     Точка в треугольнике #27
А можно прокомментировать строчки, плиз!
Цитата Сообщение от Mayonez Посмотреть сообщение
пошутил...
silent_1991, извините если что не так, ну а если серйозно, то

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <cmath>
using namespace std;
 
struct point
{
   int x;
   int y;
};
 
int area(point a, point b, point c)
{
   return abs((a.x - c.x)*(b.y - c.y) + (b.x-c.x)*(c.y-a.y));
}
 
int main()
{
   /////////////////////////////////////////////////////////////////////////////
   point a, b, c, d;
   cout << "Введите сначала координаты вершин треугольника, а затем "
        << "координаты точки:" << endl;
   cin >> a.x >> a.y;
   cin >> b.x >> b.y;
   cin >> c.x >> c.y;
   cin >> d.x >> d.y;
   /////////////////////////////////////////////////////////////////////////////
   if (area(a, b, c))
   {
      if (area(a, b, c) == area(a, b, d) + area(a, d, c) + area(b, d, c))
            cout << "Точка находится внутри треугольника\n";
      else 
            cout << "Точка находится вне треугольника\n";
   }
   else
      cout << "Треугольник не существует\n";
   /////////////////////////////////////////////////////////////////////////////
   return 0;
}
RepoMen
 Аватар для RepoMen
13 / 2 / 1
Регистрация: 24.11.2010
Сообщений: 10
09.01.2011, 16:47     Точка в треугольнике #28
Цитата Сообщение от Непрограммистка Посмотреть сообщение
А можно прокомментировать строчки, плиз!
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <cmath>
using namespace std;
 
//структура "ТОЧКА"
struct point
{
   int x; //координата точки по Х
   int y; //координата точки по У
};
//функция, которая видимо находит площадь
int area(point a, point b, point c)
{
   return abs((a.x - c.x)*(b.y - c.y) + (b.x-c.x)*(c.y-a.y));
}
 
int main()
{
   /////////////////////////////////////////////////////////////////////////////
   point a, b, c, d; //четыре точки
   cout << "Введите сначала координаты вершин треугольника, а затем "
        << "координаты точки:" << endl;
   cin >> a.x >> a.y; //получаем координаты точек по очереди
   cin >> b.x >> b.y;
   cin >> c.x >> c.y;
   cin >> d.x >> d.y;
   /////////////////////////////////////////////////////////////////////////////
   if (area(a, b, c))
   {
   //если площадь первого треугольника (координаты указаны в скобках)
   //равна сумме площадей остальных 3, то...
      if (area(a, b, c) == area(a, b, d) + area(a, d, c) + area(b, d, c))
            cout << "Точка находится внутри треугольника\n";
      else 
            cout << "Точка находится вне треугольника\n";
   }
   //если площадь нулевая, значит...
   else
      cout << "Треугольник не существует\n";
   /////////////////////////////////////////////////////////////////////////////
   return 0;
}
Добавлено через 10 секунд
Цитата Сообщение от Непрограммистка Посмотреть сообщение
А можно прокомментировать строчки, плиз!
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <cmath>
using namespace std;
 
//структура "ТОЧКА"
struct point
{
   int x; //координата точки по Х
   int y; //координата точки по У
};
//функция, которая видимо находит площадь
int area(point a, point b, point c)
{
   return abs((a.x - c.x)*(b.y - c.y) + (b.x-c.x)*(c.y-a.y));
}
 
int main()
{
   /////////////////////////////////////////////////////////////////////////////
   point a, b, c, d; //четыре точки
   cout << "Введите сначала координаты вершин треугольника, а затем "
        << "координаты точки:" << endl;
   cin >> a.x >> a.y; //получаем координаты точек по очереди
   cin >> b.x >> b.y;
   cin >> c.x >> c.y;
   cin >> d.x >> d.y;
   /////////////////////////////////////////////////////////////////////////////
   if (area(a, b, c))
   {
   //если площадь первого треугольника (координаты указаны в скобках)
   //равна сумме площадей остальных 3, то...
      if (area(a, b, c) == area(a, b, d) + area(a, d, c) + area(b, d, c))
            cout << "Точка находится внутри треугольника\n";
      else 
            cout << "Точка находится вне треугольника\n";
   }
   //если площадь нулевая, значит...
   else
      cout << "Треугольник не существует\n";
   /////////////////////////////////////////////////////////////////////////////
   return 0;
}
Непрограммистка
0 / 0 / 0
Регистрация: 15.09.2010
Сообщений: 45
10.01.2011, 13:57  [ТС]     Точка в треугольнике #29
Мне бы без структур и функций программку нужно!
Мне ее в visual c++ писать!
Lena _t
 Аватар для Lena _t
0 / 0 / 0
Регистрация: 25.04.2011
Сообщений: 32
20.05.2011, 17:38     Точка в треугольнике #30
Цитата Сообщение от Непрограммистка Посмотреть сообщение
Мне бы без структур и функций программку нужно!
Мне ее в visual c++ писать!
Вот мне тоже надо такую программку .Помогите
Lena _t
 Аватар для Lena _t
0 / 0 / 0
Регистрация: 25.04.2011
Сообщений: 32
21.05.2011, 22:10     Точка в треугольнике #31
Цитата Сообщение от Lena _t Посмотреть сообщение
Вот мне тоже надо такую программку .Помогите
Попробую так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <windows.h>
#include<iostream>
using namespace std;
void main ()
{SetConsoleOutputCP(1251);
int x,y,n,m,t,z,k,q,w,e,h,f,y,h1,h2,h3,p,a,s,d,g,l ;//где x,y-А   n,m-Б  t,z-С  k,l-D  //
cin>>x;
cin>>y;
cin>>n;
cin>>m;
cin>>t;
cin>>z;
cin>>k;
cin>>l;
//Найдем аб//
q=sqrt(float ((x-n)*(x-n)+(y-m)*(y-m)));
//Найдем ас//
w=sqrt(float ((x-t)*(x-t)+(y-z)*(y-z)));
//Найдем бс//
e=sqrt(float ((n-t)*(n-t)+(m-z)*(m-z)));
//Найдем бд//
f=sqrt(float ((n-k)*(n-k)+(m-l)*(m-l)));
//Найдем дс//
y=sqrt(float ((k-t)*(k-t)+(l-z)*(l-z)));
//Найдем ад//
p=sqrt(float ((x-k)*(x-k)+(y-l)*(y-l)));
 
h=((q+w+e)/2);
h1=((q+f+p)/2);
h2=((w+y+p)/2);
h3=((f+y+e)/2);
 
//Найдем площадь абс//
a=sqrt(float(h*(h-q)*(h-w)*(h-e)));
//Найдем площадь абд//
s=sqrt(float(h1*(h1-q)*(h1-f)*(h1-p)));
//Найдем площадь адс//
d=sqrt(float(h2*(h2-y)*(h2-w)*(h2-p)));
//Найдем площадь бсд//
g=sqrt(float(h3*(h3-f)*(h3-y)*(h3-e)));
 
if(a=s+d+g  ( cout<<"Точка лежит в треугольнике"<<endl));
else cout<<"Точка не лежит в треугольнике"<<endl;
 
 
}
 Комментарий модератора 
Используйте теги форматирования кода!
yekka
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
22.05.2011, 13:27     Точка в треугольнике #32
если у нас есть три вершины A, B, C, и нам надо проверить точку D на принадлежность к этому треугольнику, то делать надо так.
Допустим, возьмем точки A и B и проверим, лежит ли точка D по ту же сторону от прямой AB, что и С или нет. Если нет, то D не может принадлежать треугольнику. Аналогично проверяем по двум остальным парам вершин. Если все три проверки пройдены, то точка лежит внутри треугольника.

Какие тут площади могут быть?!

Добавлено через 14 часов 34 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
 
const int n = 3; //Число вершин в треугольнике
 
struct point {  //Точка и координаты.
  double x;
  double y;
};
 
class line {  //Прямая, заданная уравнением F(x,y)=ax+by+c
  double a;
  double b;
  double c;
public:
  line(void) {};
  line(const point &, const point &);
  double F(point A) const;  //Подставляет координаты точки А в уравнение 
                            //и возвращает результат
};
 
line::line(const point & A, const point & B) {
  a = B.y - A.y;
  b = A.x - B.x;
  c = -(a*A.x + b*A.y);
}
 
double line::F(point A) const {
  return (a*A.x + b*A.y + c);
}
 
int main(void) {
  using std::cin;
  using std::cout;
 
  point points[n]; //Массив из точек-вершин треугольника
  cout << "Введите координаты точек:\n";
  for (int i = 0; i < n; ++i) {
    cin >> points[i].x >> points[i].y;
  }
  
  line lines[n]; //Массив прямых-ребер треугольника
  //Ребра создаются по соседним точкам.
  //Но последнее ребро должно создаваться по первой и последней точкам
  for (int i = 0; i < (n-1); ++i) {
    lines[i] = line(points[i], points[i+1]);
  }
  lines[n-1] = line(points[n-1], points[0]);
 
  //Проверяем, не лежат ли точки на одной прямой.
  if (lines[0].F(points[n-1]) == 0) {
    cout << "Точки лежат на одной прямой\n";
    return 0;
  }
  
  cout << "Введите координаты точки:\n";
  point D; //Точка, чью принадлежность треугольнику будем проверять
  while (cin >> D.x && cin >> D.y) {
    bool flag = false; //true - точка лежит вне треугольника и false - если нет
 
    //Проверяем, лежат ли точки C и D по одну сторону от прямой AB
    //В этом случае произведение должно быть положительным
    //или 0 - если D лежит на прямой AB
    if (lines[0].F(D)*lines[0].F(points[n-1]) < 0) {
      flag = true;
    }
    for (int i = 1; i < n; ++i) {
      if (lines[i].F(D)*lines[i].F(points[i-1]) < 0) 
    flag = true;
    }
 
    if (flag) {
      cout << "Точка лежит за пределами треугольника\n";
    } else {
      cout << "Точка лежит внутри треугольника\n";
    }
    
    cout << "Введите координаты точки:\n";
  }
 
  return 0;
}
При этом в коде нет ни одного деления и ни одного извлечения корня, что избавляет от проблем с округлением
Lena _t
 Аватар для Lena _t
0 / 0 / 0
Регистрация: 25.04.2011
Сообщений: 32
22.05.2011, 16:03     Точка в треугольнике #33
Цитата Сообщение от yekka Посмотреть сообщение
если у нас есть три вершины A, B, C, и нам надо проверить точку D на принадлежность к этому треугольнику, то делать надо так.
Допустим, возьмем точки A и B и проверим, лежит ли точка D по ту же сторону от прямой AB, что и С или нет. Если нет, то D не может принадлежать треугольнику. Аналогично проверяем по двум остальным парам вершин. Если все три проверки пройдены, то точка лежит внутри треугольника.

Какие тут площади могут быть?!

Добавлено через 14 часов 34 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
 
const int n = 3; //Число вершин в треугольнике
 
struct point {  //Точка и координаты.
  double x;
  double y;
};
 
class line {  //Прямая, заданная уравнением F(x,y)=ax+by+c
  double a;
  double b;
  double c;
public:
  line(void) {};
  line(const point &, const point &);
  double F(point A) const;  //Подставляет координаты точки А в уравнение 
                            //и возвращает результат
};
 
line::line(const point & A, const point & B) {
  a = B.y - A.y;
  b = A.x - B.x;
  c = -(a*A.x + b*A.y);
}
 
double line::F(point A) const {
  return (a*A.x + b*A.y + c);
}
 
int main(void) {
  using std::cin;
  using std::cout;
 
  point points[n]; //Массив из точек-вершин треугольника
  cout << "Введите координаты точек:\n";
  for (int i = 0; i < n; ++i) {
    cin >> points[i].x >> points[i].y;
  }
  
  line lines[n]; //Массив прямых-ребер треугольника
  //Ребра создаются по соседним точкам.
  //Но последнее ребро должно создаваться по первой и последней точкам
  for (int i = 0; i < (n-1); ++i) {
    lines[i] = line(points[i], points[i+1]);
  }
  lines[n-1] = line(points[n-1], points[0]);
 
  //Проверяем, не лежат ли точки на одной прямой.
  if (lines[0].F(points[n-1]) == 0) {
    cout << "Точки лежат на одной прямой\n";
    return 0;
  }
  
  cout << "Введите координаты точки:\n";
  point D; //Точка, чью принадлежность треугольнику будем проверять
  while (cin >> D.x && cin >> D.y) {
    bool flag = false; //true - точка лежит вне треугольника и false - если нет
 
    //Проверяем, лежат ли точки C и D по одну сторону от прямой AB
    //В этом случае произведение должно быть положительным
    //или 0 - если D лежит на прямой AB
    if (lines[0].F(D)*lines[0].F(points[n-1]) < 0) {
      flag = true;
    }
    for (int i = 1; i < n; ++i) {
      if (lines[i].F(D)*lines[i].F(points[i-1]) < 0) 
    flag = true;
    }
 
    if (flag) {
      cout << "Точка лежит за пределами треугольника\n";
    } else {
      cout << "Точка лежит внутри треугольника\n";
    }
    
    cout << "Введите координаты точки:\n";
  }
 
  return 0;
}
При этом в коде нет ни одного деления и ни одного извлечения корня, что избавляет от проблем с округлением
У меня все правильно работает и решение этой задачи можно делать многими способами ,а мне нравится свой больше
Alx_t
0 / 0 / 0
Регистрация: 22.05.2011
Сообщений: 3
22.05.2011, 16:06     Точка в треугольнике #34
не особо вчитывался в переписку....но вроде алгоритм- нахождение площадей 3 тр-ков(2 исходных точек и взятой) если сумма 3 = сумме исходного- точка принадлежит
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2011, 20:56     Точка в треугольнике
Еще ссылки по теме:

C++ Определить, находится ли точка в треугольнике
Найти углы в треугольнике C++
C++ Определить и напечатать, находится ли точка в треугольнике

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Lena _t
 Аватар для Lena _t
0 / 0 / 0
Регистрация: 25.04.2011
Сообщений: 32
16.06.2011, 20:56     Точка в треугольнике #35
Цитата Сообщение от Alx_t Посмотреть сообщение
не особо вчитывался в переписку....но вроде алгоритм- нахождение площадей 3 тр-ков(2 исходных точек и взятой) если сумма 3 = сумме исходного- точка принадлежит
Ну да
Yandex
Объявления
16.06.2011, 20:56     Точка в треугольнике
Ответ Создать тему
Опции темы

Текущее время: 10:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru