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

Ответы 6

  • так чуть лучше: https://pastebin.com/17jHNnvB
  • прошу прощения, ошибка в конце, условие наоборот.
  • исправленный вариант: https://pastebin.com/UrKAvFCk
  • огромное спасибо!)
  • строки 92-95 - лишние, лучше их удалить
  • Лучше скопировать код в текстовый файл - не уверен что тут он нормально будет читаться (много комментариев)/*  Рассматривать будем независимо координаты 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;   }}/*****************************************************************************//*  Вспомогательная функция  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;  }}
  • Добавить свой ответ

Еще вопросы

Войти через Google

или

Забыли пароль?

У меня нет аккаунта, я хочу Зарегистрироваться

How much to ban the user?
1 hour 1 day 100 years