С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
v8
0 / 0 / 0
Регистрация: 08.02.2020
Сообщений: 3

Определить, лежат ли точки внутри треугольника

12.02.2020, 10:43. Показов 4942. Ответов 70
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Даны координаты вершин треугольника и координаты двух точек. Определить, лежат
ли они внутри треугольника. Для решения задачи разработайте функции для случаев
двумерного и трехмерного пространств.

Есть код, но нужны разъяснения, как он работает


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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <iostream>
#include <math.h>
int funct (float s,float s1)
{
if (fabs(s)==3) return 1;
     else if (s1 == 0)
     return 0;
    else return -1;
 
}
int funct (float x1,float y1, float x2, float y2, float x, float y)
{
float k;
k=(x1-x)*(y2-y1) - (x2-x1)*(y1-y);
if (k>0) return 1;
else return -1;
}
int funct (float a1,float a2, float b1, float b2, float c1, float c2, float x1, float y1,float x2,float y2)
{
float s,s1,k;
    s = funct (a1,a2,b1,b2,x1,y1)+funct(b1,b2,c1,c2,x1,y1)+funct(c1,c2,a1,a2,x1,y1);
    s1 = funct (a1,a2,b1,b2,x1,y1)*funct(b1,b2,c1,c2,x1,y1)*funct(c1,c2,a1,a2,x1,y1);
   // printf("%d\n", s);
   k=funct(s,s1);
   s = funct (a1,a2,b1,b2,x2,y2)+funct(b1,b2,c1,c2,x2,y2)+funct(c1,c2,a1,a2,x2,y2);
   s1 = funct (a1,a2,b1,b2,x2,y2)*funct(b1,b2,c1,c2,x2,y2)*funct(c1,c2,a1,a2,x2,y2);
   k=k+funct(s,s1);
   return k;
}
//трехмерное
int det(int x0,int y0,int z0,float x1,float y1,float z1,float x2,float y2,float z2,float x,float y,float z)
{
return (x-x0)*((y1-y0)*(z2-z0)-(z1-z0)*(y2-y0))-(y-y0)*((x1-x0)*(z2-z0)-(z1-z0)*(x2-x0))+(z-z0)*((x1-x0)*(y2-y0)-(x2-x0)*(y1-y0));
}
int funct (float a1,float a2, float a3, float b1, float b2, float b3, float c1, float c2, float c3, float x1, float y1, float z1, float x2,float y2, float z2)
{
    if ((det(a1,a2,a3,b1,b2,b3,c1,c2,c3,x1,y1,z1)+det(a1,a2,a3,b1,b2,b3,c1,c2,c3,x2,y2,z2))==0)
    return funct(a1,a2,b1,b2,c1,c2,x1,y1,x2,y2);
    else return 0;
}
 
using namespace std;
int main()
{
setlocale(LC_ALL, "rus");
float a1,a2,b1,b2,c1,c2, a3,b3,c3,x1,y1,z1, x2,y2,z2;
int k;
    cout<<"Введите координаты вершин треугольника на плоскости"<<endl;
    cout<<"A: ";
    cin>>a1>>a2;
    cout<<"B: ";
    cin>>b1>>b2;
    cout<<"C: ";
    cin>>c1>>c2;
int f=1,p=0;
while (f!=0)
{
cout<<"1. Ввести координаты точек (для двумерного пространства) "<<endl;
cout<<"2. Ввести координаты точек (для трехмерного пространства) "<<endl;
cout<<"3. Ввести координаты вершин"<<endl;
cout<<"0. Выход "<<endl;
cin>>f;
    if (f==1)
    {
    setlocale(LC_ALL, "rus");
 
    cout<<"Введите координаты первой точки"<<endl;
    cin>>x1>>y1;
 
    cout<<"Введите координаты второй точки"<<endl;
    cin>>x2>>y2;
 
    k=funct(a1,a2,b1,b2,c1,c2,x1,y1,x2,y2);
    if (k==2) cout<<"Лежат"<<endl;
    else cout<<"Не лежат"<<endl;
    //cin.get();
    }
    if (f==2)
    {
    if (p==0)
    {
    cout<<"Введите координаты вершин по оси z"<<endl;
    cout<<"A:";
    cin>>a3;
    cout<<"B:";
    cin>>b3;
    cout<<"C:";
    cin>>c3;
    p++;
    }
    cout<<"Введите координаты первой точки"<<endl;
 
    cin>>x1>>y1>>z1;
    cout<<"Введите координаты второй точки"<<endl;
 
    cin>>x2>>y2>>z2;
    k=funct(a1,a2,a3,b1,b2,b3,c1,c2,c3,x1,y1,z1,x2,y2,z2);
    if (k==2) cout<<"Лежат"<<endl;
    else cout<<"Не лежат"<<endl;
    //cout<<k<<endl;
    }
 
    if (f==3)
    {
    cout<<"Введите координаты вершин треугольника на плоскости"<<endl;
    cout<<"A: ";
    cin>>a1>>a2;
    cout<<"B: ";
    cin>>b1>>b2;
    cout<<"C: ";
    cin>>c1>>c2;
    p=0;
    }
}
    //int d;
    //cin>>d;
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.02.2020, 10:43
Ответы с готовыми решениями:

Определить 3 точки, являющиеся вершинами треугольника, для которых разность точек вне е го и внутри является минимальной.
В одномерном массиве с четным количеством элементов(2n) находятся координаты n точек плоскости.Они распологаются в следующем порядке:x1...

Заданы две точки (х1, у1), (х2, у2). Определить, лежат ли обе точки относительно заданной прямой в одной полуплоскости
Заданы две точки (х1, у1), (х2, у2) и прямая ax+by+c=0. Определить, лежат ли обе точки относительно прямой в одной полуплоскости. ...

Определить лежат ли точки на заданной прямой
Заданы точки А(a1,a2) и В(b1,b2). Определить, лежат ли они на прямой y=ax+b. Запрещено создавать темы с бессмысленными названиями вроде...

70
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
12.02.2020, 11:12
Цитата Сообщение от v8 Посмотреть сообщение
Есть код, но нужны разъяснения, как он работает
Код настолько чудовищен, что даже если он и работает, разъяснять его нет ни желания, ни смысла.
Цитата Сообщение от v8 Посмотреть сообщение
трехмерного пространств.
А вот это как? Что значит "лежит внутри трехмерного треугольника"?
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
12.02.2020, 12:13
Цитата Сообщение от Байт Посмотреть сообщение
Что значит "лежит внутри трехмерного треугольника"?
Байт, где Вы прочитали об этом?

Добавлено через 10 минут
v8, просто рассматривает случай для треугольника принадлежащий плоскости в пространстве.
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
12.02.2020, 13:27
Цитата Сообщение от повар1 Посмотреть сообщение
Байт, где Вы прочитали об этом?
В условии, очевидно:
Цитата Сообщение от v8 Посмотреть сообщение
лежат ли они внутри треугольника. Для решения задачи разработайте функции для случаев
двумерного и трехмерного пространств.
Цитата Сообщение от повар1 Посмотреть сообщение
v8, просто рассматривает случай для треугольника принадлежащий плоскости в пространстве.
Любой треугольник принадлежит плоскости в пространстве, вопрос-то не в этом. Отловить попадание точки в треугольник на плоскости легко. Но вот отловить попадание трехмерной точки в плоскость можно лишь приблизительно. Отсюда и вопрос что ТС понимает под попаданием трехмерной точки в трехмерный треугольник. Может, точность нужно задать?
Цитата Сообщение от v8 Посмотреть сообщение
C++
1
2
3
int funct (float s,float s1)
int funct (float x1,float y1, float x2, float y2, float x, float y)
int funct (float a1,float a2, float b1, float b2, float c1, float c2, float x1, float y1,float x2,float y2)
Что за наркоман это писал?
Цитата Сообщение от v8 Посмотреть сообщение
Есть код, но нужны разъяснения, как он работает
Значит, код писали не вы. Тогда лучше выкиньте это недоразумение и напишите самостоятельно. Но перед этим написуйте на бумажке как оно должно выглядеть и к каким формулам сводиться.
Я бы решал через параллельный перенос угла треугольника в ноль, а потом проецирование радиус-вектора точки на стороны треугольника. Если обе проекции положительные и их сумма меньше 1/2, точка лежит в треугольнике.
В принципе, тот же принцип можно применить и в объеме, но дополнительно придется проецировать на нормаль - длина этой проекции должна быть меньше заданной точности.
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
12.02.2020, 14:13
COKPOWEHEU, Из определения треугольник это геометрическая фигура, образованная тремя отрезками, которые соединяют три точки, не лежащие на одной прямой. Аксиома о плоскости, заданной тремя точками: Через три различные точки в пространстве проходит одна и только одна плоскость. Ну и где здесь трехмерный треугольник.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Но вот отловить попадание трехмерной точки в плоскость можно лишь приблизительно.
Не верное утверждение. Точка или принадлежит плоскости или нет. Учите начертательную геометрию.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
12.02.2020, 14:55
COKPOWEHEU, На плоскости я бы решал так. Точка должна лежать по ту же сторону от стороны (простите за тавтологию), что и вершина, этой стороне не принадлежащая. признак того, что 2 точки лежат по одну сторону от прямой прост - они должны давать один знак при подстановке в уравнение прямой. А вот эту "однозначность" можно проверить через знак произведения.

Не по теме:

COKPOWEHEU, спорить с вашим оппонентом я бы не стал. Уж больно он умен! И не скрывает этого.

0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
12.02.2020, 15:04
Байт, объяснили бы что означает ваш трехмерный треугольник.
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
12.02.2020, 15:17
Цитата Сообщение от повар1 Посмотреть сообщение
Ну и где здесь трехмерный треугольник
Если координаты каждой точки фигуры задаются тремя числами - она трехмерная, даже если сама объема не имеет.
Цитата Сообщение от повар1 Посмотреть сообщение
Не верное утверждение. Точка или принадлежит плоскости или нет. Учите начертательную геометрию.
Да неужели?
Нет, я, конечно, рад, что вы уже проходите в школе начертательную геометрию. Осталось дождаться, когда расскажут об иррациональных числах, а заодно о машинной точности.

Добавлено через 8 минут
Цитата Сообщение от Байт Посмотреть сообщение
знак при подстановке в уравнение прямой
Что-то с ходу не получается сообразить. Какую из записей уравнения прямой вы имеете в виду?
Мой-то вариант с проектированием решается через два скалярных произведения и два вычисления длины, то есть 12 умножений, 9 сложений, 2 извлечения корня и 3 сравнения. Для трехмерного случая.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
12.02.2020, 15:20
Треугольник ABC и точка P
Вариант1 на плоскости:
Подсчитать количество пересечений со сторонами треугольника луча [{P.x, P.y}, {+https://www.cyberforum.ru/cgi-bin/latex.cgi?\infty, P.y});
Если нечетное - внутри, иначе снаружи;
Вариант2 на плоскости:
dot(nor(A-P), nor(B-P)) + dot(nor(A-P), nor(C-P)) <= 0, где dot - скалярное произведение, nor - нормаль(направление прямой)
(случай, когда P совпадает с одной из вершин, рассмотреть отдельно).
Вариан1 в пространстве:
Спроецировать треугольник и точку на координатные плоскости и рассмотреть все три случая на плоскости
Вариант2 в пространстве:
Вариант2 на плоскости плюс
dot(nor(A-P), nor(cross(B-A, C-A) == +-1, где cross - векторное произведение.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
12.02.2020, 15:29
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Для трехмерного случая.
Для 3-х мерного я вообще задачу не понимаю, и решать ее не берусь.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Какую из записей уравнения прямой вы имеете в виду?
Общую. Ax + By + C = 0
C++
1
if ((A*x1+B*y1+C)*(A*x2+B*y2+C) < 0) ... // по разные стороны
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
12.02.2020, 15:49
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
когда расскажут об иррациональных числах
Задачка такая есть: имеется идеальный диск массой 1кг. Его делят на три равные части. По вашей теории вес каждой части получается 0,3333(3)кг (т.е. его разделить невозможно). Но диск имеет форму круга, и его спокойно можно разделить на три равные части разрезав идеально под 120 градусов каждую часть. И вы еще будете утверждать что там бесконечная тройка в периоде? Так же и на плоскости в пространстве каждая точка имеет однозначную координату, а не какие-то там " в периоде"
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
12.02.2020, 16:25
Цитата Сообщение от v8 Посмотреть сообщение
но нужны разъяснения, как он работает
Цитата Сообщение от v8 Посмотреть сообщение
funct
- то о чем я говорил в варианте1 для плоскости - подсчет пересечений
Цитата Сообщение от v8 Посмотреть сообщение
det
- вроде как нахождение ориентированного объема параллепипеда, через детерминант(но я не уверен, этот код читать - глаза сломаешь, не говоря уже о голове)

Добавлено через 19 минут

Не по теме:

Цитата Сообщение от повар1 Посмотреть сообщение
Не верное утверждение. Точка или принадлежит плоскости или нет. Учите начертательную геометрию.
Я думаю COKPOWEHEU имел ввиду другое.
Цитата одного преподавателя программирования:
если мне нужно будет написать код, который будет крутиться на, скажем, самолёте, и этот код должен будет проверять принадлежность точки полигону, я никогда не сяду на этот самолёт. Это на удивление сложная проблема, если мы хотим её решить надёжно.

0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
12.02.2020, 16:34
Цитата Сообщение от повар1 Посмотреть сообщение
каждая точка имеет однозначную координату
Однозначную-то однозначную, но приближенную. И далеко не факт, что значение координат будет точно соответствовать ожидаемым.
Можно говорить только о нахождении в некоторых пределах.
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
12.02.2020, 16:52
Цитата Сообщение от повар1 Посмотреть сообщение
имеется идеальный диск массой 1кг. Его делят на три равные части. По вашей теории вес каждой части получается 0,3333(3)кг (т.е. его разделить невозможно). Но диск имеет форму круга, и его спокойно можно разделить на три равные части разрезав идеально под 120 градусов каждую часть.
Ваще тут какое-то противоречие между математикой и физикой, и оно должно как-то разрешаться. Может быть невозможно разрезать идеально точно на 3 части - одна всегда будет на единичку больше, хоть на 1 атом.

Добавлено через 10 минут
По теме - для начала хорошо бы научиться определять, пересекаются ли 2 линии. Как быть с пикселями? Допустим есть 4 пикселя: 1,2 и точно под ними 3,4. Одна линия пройдёт через 1-4, а вторая через 2-3 - и вот линии пересекаются, но точек с одинаковыми координатами у них нет.
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
12.02.2020, 21:04
liv, Составляем уравнение плоскости по трем точкам по формуле
https://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{vmatrix} (x-x0)    (x-x1)    (x-x2) \\  (y-y0)    (y-y1)    (y-y2) \\  (z-z0)    (z-z1)    (z-z2) \end{vmatrix}=0,
Раскрываем определитель и допустим получаем уравнение плоскости 5x-y+3z-7=0. Проверяем принадлежность точки плоскости подставив в уравнение ее координаты. Если тождество равно точка принадлежит плоскости, в противоположном случае нет. И где здесь приближенные?
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
12.02.2020, 21:39
повар1, с точки зрения математики все правильно.
А вот с точки зрения машинного представления не все так красиво.
Можно говорить только с точностью до некоторого эпсилон.
Или Вы хотите сказать, что float и double - точное представление чисел?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
12.02.2020, 21:44
COKPOWEHEU, признаюсь, мой метод не очень хорош, когда точка лежит на одной из прямой, проходящих через стороны. Этот случай надо исследовать отдельно. Писать параметрическое уравнение отрезка и так далее...
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
12.02.2020, 21:48
liv, А почему бы не взять координаты в int? Допустим есть 2.3см. Всегда можно записать 23мм. От этого ведь ничего не измениться.
0
12.02.2020, 21:48

Не по теме:

liv, не стоит. Если некто так уверен в своей правоте... Ни мне, ни вам, ни даже уважаемому COKPOWEHEU переубедить его не удастся. Пусть его...

0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
12.02.2020, 21:53
Уважаемый Байт, Вы так и не раскрыли секрет Вашего трехмерного треугольника.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.02.2020, 21:53
Помогаю со студенческими работами здесь

Определить, лежат ли точки на одной прямой
ВСЕМ ПРИВЕТ!!!!!!!!ПОМОГИТЕ КТО-НИБУДЬ СПРАВИТЬСЯ С ЗАДАЧЕЙ НА С++.рЕШИТЕ ПОЖАЛУЙСТА ВОТ УСЛОВИЕ- &quot;Заданы три точки на плоскости: M с...

Определить лежат ли три точки на одной прямой
Добро времени суток уважаемые программисты.Суть такова.Нужно,чтобы я вводил координаты,а программа выдавала мне лежат ли они на одной...

Заданы точки a(a1,a2) и b(b1,b2). Определить, лежат ли они на прямой y=ax+b
Заданы точки А(a1,a2) и В(b1,b2). Определить, лежат ли они на прямой y=ax+b. Помогите пожалуйста :\

Определить лежат ли точки А и В по одну сторону от прямой
Даны четыре вещественных числа x, y, x1, y1, представляющие собой координаты точек А и В. Плоскость разделяется надвое прямой x = y....

Определить лежат ли две точки в одной координатной четверти
Даны координаты двух точек на плоскости, требуется определить, лежат ли они в одной координатной четверти или нет (все координаты отличны...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru