Функция проверки двух треугольников на поглощение на плоскости - 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 в противном случае.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д