Функция проверки двух треугольников на поглощение на плоскости - 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 в противном случае.