Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 23.12.2013
Сообщений: 15

Пересечение треугольников

19.07.2017, 11:12. Показов 6364. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, задумался над такой задачей:
Проверить пересекаются ли 2 треугольника. 6 координат задаются пользователем (именно с консоли, типа: Введите 1 координаты, введите 2), программа пишет да/нет. (дополнительных условий нет, можно сделать как хочется)
Помогите пожалуйста, я только начинаю программировать и хотелось бы максимально просто))
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.07.2017, 11:12
Ответы с готовыми решениями:

Пересечение треугольников в 3d
Вот например 2 треугольника: (для примера) struct Point { int X; int Y; int Z; };

Пересечение треугольников
Надо определить, пересекаютя ли треугольники. Наличие общей грани нельзя считать пересечением, но если один треугольник лежит внутри...

Пересечение треугольников
Здравствуйте! Подскажите, пожалуйста, как узнать пересекается треугольник или нет с другими треугольниками. Вот данные: struct...

5
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,238
19.07.2017, 12:19
посмотрите ссылки внизу страницы
В частности
Пересечение треугольников
0
68 / 51 / 27
Регистрация: 27.04.2015
Сообщений: 203
19.07.2017, 12:37
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
#include <iostream>
 
using namespace std;
 
bool check_point(double x[3], double y[3], double x0, double y0) {//проверяем принадлежность к треугольнику точки (x0;y0)
    double a = (x[0] - x0)*(y[1] - y[0]) - (x[1] - x[0])*(y[0] - y0);
    double b = (x[1] - x0)*(y[2] - y[1]) - (x[2] - x[1])*(y[1] - y0);
    double c = (x[2] - x0)*(y[0] - y[2]) - (x[0] - x[2])*(y[2] - y0);
    if (a*b*c == 0) {
        return 0;
    }
    return ((signbit(a) ^ signbit (b)) || (signbit(a) ^ signbit(c)));
}
 
int main()
{
    setlocale(0, "");
    double x1[3], y1[3], x2[3], y2[3];
    for (auto i = 0; i < 3; i++) {//первый треугольник
        cout << "введите координаты точки " << i+1 << " первого треугольника: ";
        cin >> x1[i] >> y1[i];
        cout << "введите координаты точки " << i + 1 << " второго треугольника: ";
        cin >> x2[i] >> y2[i];
    }
    for (auto i = 0; i < 3; i++) {
        if (!check_point(x1, y1, x2[i], y2[i])) {
            cout << "Треугольники пересикаются!" << endl;
            break;
        }
    }
    system("pause");
    return 0;
}
Похожим образом решал. Если какая-либо из трех точек второго треугольника лежит в первом или на его грани, то программа указывает на пересечение.
0
0 / 0 / 0
Регистрация: 23.12.2013
Сообщений: 15
19.07.2017, 13:08  [ТС]
Спасибо огромное, не могли бы вы еще пояснить что значит "signbit", а то у меня во всех компиляторах:
[Error] 'signbit' was not declared in this scope.

Добавлено через 1 минуту
YarRainbow, Спасибо огромное, не могли бы вы еще пояснить что значит "signbit", а то у меня во всех компиляторах:
[Error] 'signbit' was not declared in this scope.
0
68 / 51 / 27
Регистрация: 27.04.2015
Сообщений: 203
19.07.2017, 13:15
signbit() - это функция, которая возвращает true, если в нее передано отрицательное число. Добавьте в начале #include <cmath> и тогда всё заработает.

Добавлено через 5 минут
PS Если вопрос решен - используйте кнопки под сообщениями на форуме, чтобы отметить "лучший ответ" и считать тему закрытой
1
 Аватар для Геомеханик
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
19.07.2017, 14:34
Лучший ответ Сообщение было отмечено zss как решение

Решение

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>
 
struct point {
    int x, y;
    point(void):x(0), y(0){}
    point(int _x, int _y):x(_x), y(_y){}
};
 
struct triangle {
    point ds[3]; 
    triangle(void){}
    triangle(const point& a, const point& b, const point& c){
        ds[0] = a, ds[1] = b, ds[2] = c;
    }
};
 
bool is_point_to_triangle(const point& p, const triangle& t);
bool is_intersect_line(const point& a1, const point& a2, const point& b1, const point& b2);
bool is_intersect_triangle(const triangle& a, const triangle& b);
 
int main(void){
    //задание точек по часовой стрелке CW
    triangle a(point(100, 50),  point(150, 100), point(60, 100));
    triangle b(point(150, 150), point(250, 260), point(40, 260));
 
    if(is_intersect_triangle(a, b))
        std::cout << "Yes.";
    else
        std::cout << "No!";
    std::cout << std::endl;
    std::cin.get();
    return 0;
}
 
//пересечение треугольников 
bool is_intersect_triangle(const triangle& a, const triangle& b){
    for(int p = 0; p < 3; ++p){
        if(is_point_to_triangle(a.ds[p], b) || is_point_to_triangle(b.ds[p], a))
            return true;
    }
 
    for(int i = 0; i < 3; ++i){
        for(int j = 0; j < 3; ++j){
            if(is_intersect_line(a.ds[i], a.ds[(i + 1) % 3], b.ds[j], b.ds[(j + 1) % 3]))
                return true;
        }
    }
    return false;
}
 
//пересечение точки с треугольником с обходом по часовой стрелке CW
bool is_point_to_triangle(const point& p, const triangle& t){
    int k, j;
    for(int i = 0; i < 3; ++i){
        j = (i + 1) % 3;
        k = (p.x - t.ds[i].x) * (t.ds[i].y - t.ds[j].y) - (p.y - t.ds[i].y) * (t.ds[i].x - t.ds[j].x);
        if(k < 0)
            return false;
    }
    return true;
}
 
//пересечение линий
bool is_intersect_line(const point& a1, const point& a2, const point& b1, const point& b2){
    point c;
    point b(a2.x - a1.x, a2.y - a1.y);
    point d(b2.x - b1.x, b2.y - b1.y);
 
    int dot = b.x * d.y - b.y * d.x;
    if(dot == 0)
        return false;
 
    c.x = b1.x - a1.x;
    c.y = b1.y - a1.y;
    float t = static_cast<float>(c.x * d.y - c.y * d.x) / dot;
    if((t < 0.0f) || (t > 1.0f))
        return false;
 
    t = static_cast<float>(c.x * b.y - c.y * b.x) / dot;
    return !((t < 0.0f) || (t > 1.0f));
}
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.07.2017, 14:34
Помогаю со студенческими работами здесь

Определить пересечение треугольников
Помогите определить пересечение треугольников уже неделю сижу class Point { public: float x, y; Point(float _x = 0, float _y =...

Как определить пересечение 2-х треугольников в трехмерном пространстве?
Собсно сабж) Какие есть идеи?

Дано н прямоугольных треугольников с а и б катетами, причем а + б = 9. Составить программу, которая вычисляет суммарную площадь этих треугольников
Дано н прямоугольных треугольников с а и б катетами, причем а + б = 9. Составить программу, которая вычисляет суммарную площадь этих...

Пересечение двух прямых и проверка на пересечение
Доброго времени суток слизал функцию проверки отсюда:/segments_intersection_checking на всякий случай у меня она выглядит так: int...

Пересечение двух треугольников
Здравствуйте. Помогите пожалуйста с решением задачи, а конкретнее: Есть два треугольника(один треугольник движется на встречу другому...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru