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

Объяснение кода листинга программы

  1. Создание структуры point для представления точки в двумерном пространстве.
  2. Создание структуры triangle для представления треугольника, используя структуру point.
  3. Объявление функции is_ptriangle для проверки принадлежности точки треугольнику.
  4. Объявление функции is_in_triangle для проверки вхождения одного треугольника в другой.
  5. Задание двух треугольников в экранных координатах.
  6. Проверка вхождения первого треугольника во второй с помощью функции is_in_triangle.
  7. Вывод результата проверки в консоль.
  8. Возвращение 0 в случае, если точка принадлежит треугольнику, и 1 в противном случае.
  9. Проверка принадлежности каждой вершины треугольника второму треугольнику, начиная с вершины A.
  10. Проверка всех трех вершин треугольника во втором треугольнике.
  11. Если точка принадлежит одному из треугольников, проверка принадлежности второму треугольнику, начиная с другой вершины первого треугольника.
  12. Возвращение 1, если точка принадлежит обоим треугольникам, и 0 в противном случае.
  13. Если точка принадлежит одному из треугольников, проверка принадлежности второму треугольнику, начиная с другой вершины первого треугольника.
  14. Возвращение 1, если точка принадлежит обоим треугольникам, и 0 в противном случае.
  15. Возвращение результата проверки вхождения первого треугольника во второй.
  16. Если первый треугольник полностью содержится во втором, проверка вхождения второго треугольника в первый.
  17. Возвращение 1, если второй треугольник полностью содержится в первом, и 0 в противном случае.
  18. Если второй треугольник полностью содержится в первом, проверка вхождения первого треугольника во второй.
  19. Возвращение 1, если первый треугольник полностью содержится во втором, и 0 в противном случае.
  20. Возвращение 1, если второй треугольник полностью содержится в первом, и 0 в противном случае.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5
Похожие ответы