Написать ** С ++ Даны два прямоугольника, стороны которых параллельны или...

0 голосов
54 просмотров

Написать на С ++
Даны два прямоугольника, стороны которых параллельны или перпендикулярны осям координат. Известны координаты левого нижнего угла каждого из них и длины их сторон. Один из прямоугольников назовем первым, второй - вторым.
а) Определить, принадлежат все точки первого прямоугольника второго.
б) Определить, принадлежат все точки одного из прямоугольников другому.
в) Определить, пересекаются эти прямоугольники.


Информатика (819 баллов) | 54 просмотров
0

редактор ответов ужасен. ответ https://pastebin.com/UrKAvFCk

Дан 1 ответ
0 голосов
Правильный ответ

Лучше скопировать код в текстовый файл - не уверен что тут он нормально будет читаться (много комментариев)
/*  Рассматривать будем независимо координаты X (с шириной) и Y (с высотой) * *  Варианты взаимного расположения одной координаты: * * 1) CD левее AB *            A       B *            |-------| *  |--------| *  C        D * * 2) CD пересекает слева AB *            A       B *            |-------| *     |--------| *     C        D * * 3) CD внутри AB *            A       B *            |-------| *             |-----| *             C     D * * 4) AB внутри CD *            A       B *            |-------| *           |---------| *           C         D * * 5) CD пересекает справа AB *            A       B *            |-------| *               |--------| *               C        D * * 6) CD правее AB *            A       B *            |-------| *                      |--------| *                      C        D */

/*****************************************************************************//*  Вспомогательная функция  inside_coord() определяет, что координата первого  прямоугольника лежит полностью внутри второго.
  Параметры: координата и размер первого прямоугольника             координата и размер второго прямоугольника
  Возвращает: 1 если координата первого лежит полностью внутри второго или              0 если не полностью или вообще за пределами.  Фактически определяет имеем ли мы вариант 4 (см. выше).*/int inside_coord (int coord1, int size1, int coord2, int size2){   int A = coord1, B = coord1 + size1;   int C = coord2, D = coord2 + size2;
   /* проверяем вариант 4 */   if ((A >= C) && (B <= D)) {     return 1;   }   else  {     return 0;   }}<br>/*****************************************************************************//*  Вспомогательная функция  intersect_coord() определяет, что координаты не пересекаются.  Параметры: координата и размер первого прямоугольника             координата и размер второго прямоугольника
  Возвращает: 1 если не пересекаются, 0 если хоть как-то              пересекаются.  Фактически определяет имеем ли мы вариант 1 или 6 (см. выше).*/int intersect_coord (int coord1, int size1, int coord2, int size2){   int A = coord1, B = coord1 + size1;   int C = coord2, D = coord2 + size2;
   /* проверяем вариант 1 или вариант 6 */   if ((D <= A) || (C >= B)) {     return 1;   }   /* проверяем вариант 6 */   else if (C >= B)  {     return 1;   }   else  {     return 0;   }}
/*****************************************************************************/
/* Переменные содержащие координаты (x, y, ширина, высота) первого прямоугольника: */int x1, y1, width1, height1;/* Переменные содержащие координаты (x, y, ширина, высота) второго прямоугольника: */int x2, y2, width2, height2;

/*****************************************************************************//* функция проверяющая, что все точки первого внутри второго * возвращает 1, если это так, 0 если не так. */int is_first_inside_second (void){int x_inside, y_inside;  /* проверка, что x полностью внутри */  x_inside = inside_coord (x1, width1, x2, width2);  /* проверка, что y полностью внутри */  y_inside = inside_coord (y1, height1, y2, height2);
  if ((x_inside) && (y_inside))  {    /* если x внутри И y внутри, то весь прямоугольник внутри */    return 1;  }  else  {    return 0;  }}
/*****************************************************************************//* функция проверяющая, что все точки второго внутри первого * возвращает 1, если это так, 0 если не так. */int is_second_inside_first (void){int x_inside, y_inside;  /* проверка, что x полностью внутри */  x_inside = inside_coord (x2, width2, x1, width1);  /* проверка, что y полностью внутри */  y_inside = inside_coord (y2, height2, y1, height1);
  if ((x_inside) && (y_inside))  {    /* если x внутри И y внутри, то весь прямоугольник внутри */    return 1;  }  else  {    return 0;  }}
/*****************************************************************************//* функция проверяющая, что все точки одного внутри второго * возвращает 1, если это так, 0 если не так. */int is_any_inside_any (void){  /* проверка что первый внутри второго или второй внутри первого */  if (is_first_inside_second() || is_second_inside_first())  {    return 1;  }  else  {    return 0;  }}
/*****************************************************************************//* функция проверяющая, что прямоугольники пересекаются * возвращает 1, если это так, 0 если не так. */int is_intersection (void){int x_intersect, y_intersect;  /* проверка, что x вообще пересекаются хоть как-то */  x_intersect = intersect_coord (x1, width1, x2, width2);  /* проверка, что y вообще пересекаются хоть как-то */  y_intersect = intersect_coord (y1, height1, y2, height2);
  if ((x_intersect) && (y_intersect))  {    /* если x пересекаются И y пересекаются, прямоугольники пересекаются */    return 1;  }  else  {    return 0;  }}

(1.8k баллов)
0

не, не помогает. Ну и как вот тут постить код?

0

так чуть лучше: https://pastebin.com/17jHNnvB

0

прошу прощения, ошибка в конце, условие наоборот.

0

исправленный вариант: https://pastebin.com/UrKAvFCk

0

огромное спасибо!)

0

строки 92-95 - лишние, лучше их удалить