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

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

12.02.2020, 10:43. Показов 5335. Ответов 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
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,310
13.02.2020, 23:08
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от liv Посмотреть сообщение
А в следующий раз, надо будет проверить точку с координатами, у которых 6 и более знаков после точки.
Писать новую программу? Да и умножение, например, двух 6-значных чисел приведет к выходу из разрядной сетки int32_t...
Приходим к int64_t ? Потом к int128_t?
Числа с запятой "закончатся" точно так-же, как и целые. Никакого выигрыша в точности это не даёт. Умножение 2-х чисел с 5-ю знаками после запятой приведёт к округлению.
0
 Аватар для COKPOWEHEU
4057 / 2692 / 432
Регистрация: 09.09.2017
Сообщений: 12,006
14.02.2020, 10:21
В чисел с плавающей точкой больше диапазон. То есть и при делении получается не ноль, а маленькое, но конечное число. И при расчете нет необходимости приводить к какому-то конкретному диапазону. Скажем, в физике можно все расстояния мерить в метрах. Ну и что, что размер атома порядка 10-13, а размер галактики порядка 1020 - точность одинаковая что там, что там.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,310
14.02.2020, 11:18
А что там с третьим измерением? Треугольник в объёме это будет треугольная призма. Третья координата - длина призмы. И проверка сведётся к пустяку: если точка попадает в треугольник на плоскости - она попадёт и в призму, если третья координата точки меньше длины призмы. Так?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
14.02.2020, 11:27
Цитата Сообщение от alexu_007 Посмотреть сообщение
Треугольник в объёме это будет треугольная призма.
Скорее, тетраэдр (пирамида).
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,310
14.02.2020, 11:35
Почему пирамида? Если двигать плоскость с треугольником в третьем измерении, получится призма. Чтобы получить треугольную пирамиду, нужно двигать две точки треугольника (основание) а третья точка (вершина) должна стоять на месте.

Как бы, если в двух измерениях квадрат, в трёх - куб (но не пирамида).
0
 Аватар для COKPOWEHEU
4057 / 2692 / 432
Регистрация: 09.09.2017
Сообщений: 12,006
14.02.2020, 12:51
Цитата Сообщение от alexu_007 Посмотреть сообщение
Треугольник в объёме это будет треугольная призма.
Треугольник в любом пространстве остается треугольником, просто потому что у него три угла. (другое дело, что если размерность пространства меньше 2, он становится вырожденным).
Цитата Сообщение от alexu_007 Посмотреть сообщение
Почему пирамида? Если двигать плоскость с треугольником в третьем измерении, получится призма.
Ну ведь при переходе от одномерного пространства к двухмерному мы получили не квадрат, а треугольник. То есть не пользовались параллельным переносом, а добавили одну вершину. По тому же принципу можно из треугольника сделать тетраэдр. Правда, какое отношение это имеет к задаче неизвестно.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
14.02.2020, 20:41
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
какое отношение это имеет к задаче
Никакого. Разговор перешел давно уже в другие плоскости.
Но по-поводу "призмы" осмелюсь провести такую цепочку. Что есть простейшее после точки в одномерном случае? Конечно, отрезок. То, что определяется двумя точками. В двумерном случае этим является треугольник (3 точки) В трехмерном (4 точки), угадаете с двух раз... правильно - тетраэдр. В других областях математики (топологии, например) эти штука называются симплексом (simp - простой), и это понятие позволяет создавать весьма продуктивные теории.
Можно отрезок обобщить иначе. В двумерности - квадрат. В трехмерности - куб. И так далее.
Но "призма" - это непродуктивное спутывание этих цепочек обобщения.

Добавлено через 7 минут
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
при переходе от одномерного пространства к двухмерному мы получили не квадрат, а треугольник. То есть не пользовались параллельным переносом, а добавили одну вершину.
Вот. Золотые слова. То есть ежели мы от отрезка перешли к треугольнику - дальше только тетраэдр. А ежели к квадрату, следующий - куб.
Это просто разные пути обобщения понятий. Линейный и экспотенциальный.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,310
14.02.2020, 23:23
Цитата Сообщение от Байт Посмотреть сообщение
То есть ежели мы от отрезка перешли к треугольнику - дальше только тетраэдр. А ежели к квадрату, следующий - куб.
А с чего вы взяли, что нужно вообще переходить от чего-то к чему-то: точка - линия - квадрат - куб? Есть система координат, двумерная x и y, два луча, идущие из одной точки (координатная сетка). В этих координатах тупо рисуем (а не получаем из чего-либо) плоский треугольник. Затем добавляем третье измерение z - третий луч, идущий из той же точки. Сдвигаем свою нарисованную на плоскости фигуру на величину z и получаем объём. То есть для трёхмерного треугольника достаточно координат 4-х точек: A B C и D. Добавляется всего одна координата.

По теме:
Миниатюры
Определить, лежат ли точки внутри треугольника  
0
 Аватар для COKPOWEHEU
4057 / 2692 / 432
Регистрация: 09.09.2017
Сообщений: 12,006
15.02.2020, 08:35
Цитата Сообщение от alexu_007 Посмотреть сообщение
А с чего вы взяли, что нужно вообще переходить от чего-то к чему-то
Это не нам, это кое-кого не устраивает обычный трехмерный треугольник и он придумывает наиболее похожую фигуру, но обладающую объемом. Какое отношение это имеет к задаче никто не знает. Но исходную задачу вроде обсудили, почему бы не пофилософствовать...
Цитата Сообщение от alexu_007 Посмотреть сообщение
Сдвигаем свою нарисованную на плоскости фигуру на величину z и получаем объём.
Но принцип построения треугольника был другой. Там добавился некомпланарный предыдущим вектор и на полученных точках построили фигуру, без всяких параллельных переносов.
Если бы параллельный перенос применялся, треугольника бы не получилось, был бы параллелограмм, а потом параллелепипед.
То есть треугольная призма - никак.
Хотя если речь идет о геометрическом представлении расчета попадания точки в треугольник с учетом погрешности, можно и призму "нарисовать", толщина как раз и будет соответствовать погрешности. Можно еще "надеть" цилиндры на ребра. Либо оставить треугольник плоским, а точку заменить на сферу диаметром равным погрешности.
Цитата Сообщение от alexu_007 Посмотреть сообщение
То есть для трёхмерного треугольника достаточно координат 4-х точек
Для треугольника по определению необходимо три и только три координаты. Если их другое количество - это уже не треугольник.
Цитата Сообщение от alexu_007 Посмотреть сообщение
достаточно координат 4-х точек: A B C и D. Добавляется всего одна координата.
А какую фигуру можно построить по 4 точкам, не лежащим в одной плоскости? (подсказка: не призму, ей хотя бы 6 точек нужно).
1
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,310
15.02.2020, 09:10
Ну ладно. Не буду продолжать спорить о том, в чём сам плохо разбираюсь.

Я просто хотел узнать, будет ли достаточно для решения задачи в трёх измерениях простого параллельного переноса треугольника, или там нужны уже совсем другие более сложные формулы? Собственно, мне и это не очень надо - я не пишу курсовую или там по работе нужно. Просто интересно.
0
 Аватар для COKPOWEHEU
4057 / 2692 / 432
Регистрация: 09.09.2017
Сообщений: 12,006
15.02.2020, 10:24
Для решения задачи в трех измерениях вообще не нужно этих извращений. Вон повар1 предложил решение в целых числах, я в самом начале предложил алгоритм через скалярные произведения. Зачем вам эта призма вообще нужна была?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.02.2020, 10:24

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
71
Ответ Создать тему
Новые блоги и статьи
Remote Connection Manager
DevAlt 21.06.2026
Написал для себя небольшую прилагу: https:/ / github. com/ altbodhi/ ReConMan По итогу пришел к мысли, что DU не дружат с существующими технологиями. От сериализации до отображения в реляционную. . .
Администрация Хабра удаляет новые энрегоэфективные алгоритмы, которые не западной школы кода, и вовсе никак не сгенерировавны.
Hrethgir 20.06.2026
Делается это, как замечено, при правках - при объявлении концептуальных отличий в алгоримах. Делается это, по линейке событий - после дополнения публикации основными отличиями от основных западных. . .
Процесс ориентированная диалектика (не новость - просто системное обновление, философия).
Hrethgir 20.06.2026
Однажды один участник в своём блоге, на этом форуме, сделал запись "О языках замолвите слово". Понимая, что язык - важная вещь, я решил хорошо подумать, прежде чем сказать, и сказал то, что вы видите. . .
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru