Функция проверки двух треугольников на поглощение на плоскости - C (СИ)
Формулировка задачи:
Доброго всем вечера! Очень нужна помощь! Необходимо написать функцию проверки двух треугольников на поглощение в R2
Входные данные: 6 точек, по 3 вершины каждый треугольник.
Выходные: через return: 1, если один находится полностью внутри другого, и 0 в противном случае.
Подскажите, пожалуйста, как это можно осуществить?
Решение задачи: «Функция проверки двух треугольников на поглощение на плоскости»
textual
Листинг программы
#include <stdio.h> #define set_triangle(t, x0,y0, x1,y1, x2,y2)\ (t).A.x = (x0), (t).A.y = (y0),\ (t).B.x = (x1), (t).B.y = (y1),\ (t).C.x = (x2), (t).C.y = (y2)\ typedef struct { int x, y; } point; typedef struct { point A, B, C; } triangle; int is_ptriangle(const point* p, const triangle* tr); int is_in_triangle(const triangle* tr1, const triangle* tr2); int main(void){ triangle tr1, tr2; //равнобедренный треугольник в экранных координатах set_triangle(tr1, 100,220, 200,100, 300,220); //прямоугольный треугольник в экранных координатах set_triangle(tr2, 90,10, 400,250, 90,250); if(is_in_triangle(&tr1, &tr2)) puts("Yes."); else puts("No!"); return 0; } // принадлежность точки треугольнику(обход вершин по часовой стрелке) int is_ptriangle(const point* p, const triangle* tr){ int r = (p->x-tr->A.x)*(tr->A.y-tr->B.y) - (p->y-tr->A.y)*(tr->A.x-tr->B.x); if(r < 0) return 0; r = (p->x-tr->B.x)*(tr->B.y-tr->C.y) - (p->y-tr->B.y)*(tr->B.x-tr->C.x); if(r < 0) return 0; r = (p->x-tr->C.x)*(tr->C.y-tr->A.y) - (p->y-tr->C.y)*(tr->C.x-tr->A.x); return (r >= 0); } //проверка вхождения треугольника в треугольник int is_in_triangle(const triangle* tr1, const triangle* tr2){ int r; r = is_ptriangle(&tr1->A, tr2) && is_ptriangle(&tr1->B, tr2) && is_ptriangle(&tr1->C, tr2); if(! r){ r = is_ptriangle(&tr2->A, tr1) && is_ptriangle(&tr2->B, tr1) && is_ptriangle(&tr2->C, tr1); } return r; }
Объяснение кода листинга программы
- Создание структуры point для представления точки в двумерном пространстве.
- Создание структуры triangle для представления треугольника, используя структуру point.
- Объявление функции is_ptriangle для проверки принадлежности точки треугольнику.
- Объявление функции is_in_triangle для проверки вхождения одного треугольника в другой.
- Задание двух треугольников в экранных координатах.
- Проверка вхождения первого треугольника во второй с помощью функции is_in_triangle.
- Вывод результата проверки в консоль.
- Возвращение 0 в случае, если точка принадлежит треугольнику, и 1 в противном случае.
- Проверка принадлежности каждой вершины треугольника второму треугольнику, начиная с вершины A.
- Проверка всех трех вершин треугольника во втором треугольнике.
- Если точка принадлежит одному из треугольников, проверка принадлежности второму треугольнику, начиная с другой вершины первого треугольника.
- Возвращение 1, если точка принадлежит обоим треугольникам, и 0 в противном случае.
- Если точка принадлежит одному из треугольников, проверка принадлежности второму треугольнику, начиная с другой вершины первого треугольника.
- Возвращение 1, если точка принадлежит обоим треугольникам, и 0 в противном случае.
- Возвращение результата проверки вхождения первого треугольника во второй.
- Если первый треугольник полностью содержится во втором, проверка вхождения второго треугольника в первый.
- Возвращение 1, если второй треугольник полностью содержится в первом, и 0 в противном случае.
- Если второй треугольник полностью содержится в первом, проверка вхождения первого треугольника во второй.
- Возвращение 1, если первый треугольник полностью содержится во втором, и 0 в противном случае.
- Возвращение 1, если второй треугольник полностью содержится в первом, и 0 в противном случае.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д