Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 18.12.2022
Сообщений: 4

На квадратном столе разместить прямоугольную скатерть с максимальной площадью

13.06.2023, 14:59. Показов 2345. Ответов 44

Студворк — интернет-сервис помощи студентам
Добрый день, смысл задачи такой: есть квадратный стол, есть прямоугольная скатерть, которая не может покрыть весь стол. Нам нужно найти максимальную площадь покрытия. У квадрата и прямоугольника одинаковый центр. Более того, наибольшая длина скатерти меньше диагонали квадрата. На вход подаются сторона квадрата и стороны прямоугольника. Я не рассматриваю случай, когда скатерть помещается внутри стола. Я так понимаю, что прямоугольник нужно крутить, и где-то от 0 до 45 градусов. Но у меня нет идеи как это осуществить. Есть ограничения по времени и памяти: 1с и 256мб.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.06.2023, 14:59
Ответы с готовыми решениями:

Найти треугольники с максимальной с максимальной и и минимальной площадью
На плоскости задано N четырех угольников координатами своих вершин вершин, X Y, найти треугольники с максимальной с максимальной и и...

Разместить в динамической памяти прямоугольную матрицу
Здравствуйте! Очень нужно решение задачи. Ибо с С++ не дружу. Заранее спасибо! Условие: Разместить в динамической памяти...

Найти треугольники с максимальной площадью
Задача: Дано 3n точек на плоскости, причем никакие три из них не лежат на одной прямой. Построить множество n треугольников с вершинами в...

44
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
14.06.2023, 13:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от gunslinger Посмотреть сообщение
Геометрия, брутфорс, погрешность + кадр анимации
Формулу вывести (площади перекрытия от угла) лично не сумел. Пичаль.

Тупой бротфорс показал такие же результаты: макс. площадь при 45. Надо же... интуитивно не совсем это очевидно.

Кликните здесь для просмотра всего текста
Небольшое пояснение:
а) кручу квадрат, не прямоугольник
б) поточечно считаю площадь только в половине координатной сетки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <cmath>
 
// A - сторона квадрата
// B, C - размеры прямоугольника
int calcS(int A, int B, int C, double alfa)
{
    alfa = alfa / 90 * M_PI / 2;  // на входе угол в градусах, для удобства
    A /=  2;
    B /=  2;
 
    int S = 0;
    
    const int range = std::max(std::max(B, C) * 1.0, sqrt(2.) * A) + 1;
    
    for (int x = -range; x <= range; x++)
        for (int y = 0; y <= range; y++)
        {
            if (abs(x) < C && abs(y) < B)   // если попадаем в прямоугольник
            {
                if (abs(x * cos(alfa) + y * sin(alfa)) < A)
                    if (abs(-x * sin(alfa) + y * cos(alfa)) < A)     // если попадаем в квадрат
                        S++;
            }
        }
 
    return S * 2;
}
 
 
int main()
{
    int A = 350;
    int B = 80;
    int C = 400;
    
    int maxS = 0;
    double maxAlfa = -1;
    for (double alfa = 0; alfa < 90; alfa += 0.2)
    {
        std::cout<<"Calc alfa=" << alfa << " ...\n";
        int S = calcS(A, B, C, alfa);
        if (S > maxS)
        {
            maxS = S;
            maxAlfa = alfa;
        }
        std::cout<<" ... S=" << S << " maxS=" << maxS << " maxAlfa" << maxAlfa << '\n';
    }
 
    return 0;
}
1
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
14.06.2023, 13:58
Цитата Сообщение от KSergey9 Посмотреть сообщение
Формулу вывести (площади перекрытия от угла) лично не сумел. Пичаль.
Я и не хотел (или да, не смог). Больше интересовало доказательство того, почему и при каком угле площадь максимальна (для исходных условий задачи). Но до этого я не дошел. Хотя и не особо оно мне, в принципе, нужно.
Насчет 450 я высказывал предположения. Потом решил "перебором" проверить, чтобы убедиться.

И касаемо формул - код к той картинке из поста №17 не выложил, исправляюсь.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
  int SquareSide = 6, RectSide1 = 2, RectSide2 = 8;
  int shift = 150, mult = 50;
  Canvas->Rectangle(shift - 1, shift - 1, shift + mult * SquareSide + 1, shift + mult * SquareSide + 1);
 
  double angle = atan2(RectSide1, RectSide2);
  double angle_minus = angle - atan(1) / 45 * Tag, angle_plus = angle + atan(1) / 45 * Tag;
  double cos_minus = cos(angle_minus), cos_plus = cos(angle_plus);
  double sin_minus = sin(angle_minus), sin_plus = sin(angle_plus);
 
  int center_x = shift + SquareSide * mult / 2, center_y = center_x;
 
  double MaxRectSide = (RectSide1 > RectSide2) ? RectSide1 : RectSide2;
  double MinRectSide = (RectSide1 < RectSide2) ? RectSide1 : RectSide2;
  double RectDiag = hypot(MaxRectSide, MinRectSide) * mult / 2;
 
  Canvas->MoveTo(center_x - RectDiag * cos_minus - 1, center_y - RectDiag * sin_minus - 1);
  Canvas->LineTo(center_x - RectDiag * cos_plus - 1, center_y + RectDiag * sin_plus + 1);
  Canvas->LineTo(center_x + RectDiag * cos_minus + 1, center_y + RectDiag * sin_minus + 1);
  Canvas->LineTo(center_x + RectDiag * cos_plus + 1, center_y - RectDiag * sin_plus - 1);
  Canvas->LineTo(center_x - RectDiag * cos_minus - 1, center_y - RectDiag * sin_minus - 1);
 
  Canvas->Brush->Color = clGreen;
  int x = shift + mult * SquareSide / 2, y = x;
  Canvas->FloodFill(x, y, Canvas->Pixels[x][y], fsSurface);
 
  double count = 0;
  for (int i = shift - 1; i <= shift + mult * SquareSide + 1; i++)
    for (int j = shift - 1; j <= shift + mult * SquareSide + 1; j++)
      if (Canvas->Pixels[i][j] == clGreen)
        count++;
 
  Canvas->Brush->Color = Color;
 
  double area = count / mult / mult;
  static double max_area = 0, tmp_angle = 0;
 
  if (Tag == 50)
    Tag = 0;
  Tag++;
 
  if (area > max_area)
  {
    max_area = area;
    tmp_angle = Tag;
  }
 
  Label->Caption = "Area = " + String(area) + ", angle = " + String(Tag);
  Label2->Caption = "MaxArea = " + String(max_area) + " (angle = " + String(tmp_angle) + ")";
0
14.06.2023, 14:04

Не по теме:

Цитата Сообщение от gunslinger Посмотреть сообщение
код к той картинке из поста №17
А, билдер... на билдере и я умею рисовать...
ну это так, мне просто было любопытно как рисовано

0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6289 / 3013 / 1051
Регистрация: 01.06.2021
Сообщений: 11,398
14.06.2023, 14:29
gunslinger, но ведь не всегда угол 45 градусов дает макс площадь. Например, если стороны прямоугольника равны стороне квадрата, то лучше не поворачивать:



1
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
14.06.2023, 14:37
KSergey9, предвзятое отношение я вижу. Зачем рисовать в консоли, если есть более удобные средства?
И "чат жпт" в билдер не встроен (плюс в России жпт заблочен, да мне он вряд ли нужен в любом случае). Код приходится (хотя никто не заставляет) самому писать.

Насчет формул - в посте №13 я вывел формулу для 450. Так как на 99% уверен, что это ответ к задаче (не забывая, что иногда поворот не нужен, это я тоже учел), зачем нужна общая формула, зависящая от угла? Ну и доказательство условия(-ий) максимума площади - это по идее в другой раздел форума.

Плюс из серии "критикуешь - предлагай". Где общие формулы (площади от угла) без "ручного" подсчета пикселей для любых допустимых условиями входных данных? Где доказательство, что площадь максимальна при 450 (или 00)? Либо я слепой, либо просьба ткнуть носом.
Благодарю за внимание (старался быть сдержанным, в интернете мне это не сложно, есть время думать, когда пишешь).

Добавлено через 1 минуту
Royal_X, я тут уточнил, что, скорей всего, макс. площадь при 450 или 00.

Добавлено через 2 минуты
В посте №13 использовал это в коде. Но "открыто" об этом почему-то не говорил (наверно, думал, что это очевидно, или вообще не думал).
Если не 00, то 450.

Добавлено через 2 минуты
C++
33
34
35
36
37
38
39
40
  // площадь прямогольника (ПП) внутри квадрата = ПП - 4 площади ВТ
  double InnerRectSquare = RectSide1 * RectSide2 - 4 * TriangleSquare;
 
  // площадь прямоугольника при угле поворота = 0 градусов
  double RectSquare = SquareSide * MinRectSide;
 
  // выводим максимальное из InnerRectSquare и RectSquare значение
  return (InnerRectSquare > RectSquare) ? InnerRectSquare : RectSquare;
Там же старался учесть "особые" случаи (тот же пост №13 или ранее №10).
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6289 / 3013 / 1051
Регистрация: 01.06.2021
Сообщений: 11,398
14.06.2023, 14:39
gunslinger, т.е. ты считаешь и при 0° и при 45°, но выводишь ту площадь, что больше?
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
14.06.2023, 14:42
Цитата Сообщение от Royal_X Посмотреть сообщение
но ведь не всегда угол 45 градусов дает макс площадь. Например, если стороны прямоугольника равны стороне квадрата, то лучше не поворачивать:
Очевидный случай, когда квадрат полностью укладывается в прямоугольник или прямоугольник в квадрат - обсуждать смысла нет ввиду очевидности.

Поэтому обсуждаем лишь менее очевидный случай частичного перекрытия.
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
14.06.2023, 14:47
Royal_X, получается так. Это я в тот момент не был достаточно уверен, что при 450 площадь может быть больше.
Можно подкорректировать.

Но уже тогда я учитывал, что прямоугольник можно не поворачивать (если он изначально полностью помещается внутри квадрата и прочие частные случаи).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  double MaxRectSide = (RectSide1 > RectSide2) ? RectSide1 : RectSide2;
  double MinRectSide = (RectSide1 < RectSide2) ? RectSide1 : RectSide2;
  double RectDiag = hypot(MaxRectSide, MinRectSide), SquareDiag = hypot(SquareSide, SquareSide);
 
  // если наибольшая сторона прямоугольника не больше стороны квадрата
  if (MaxRectSide <= SquareSide)
    return RectSide1 * RectSide2;  // весь прямоугольник внутри квадрата
 
  // если наименьшая сторона прямоугольника не меньше стороны квадрата
  if (MinRectSide >= SquareSide)
    return SquareSide * SquareSide;  // весь квадрат внутри прямоугольника
 
  // если наибольшая сторона прямоугольника не меньше диагонали квадрата
  if (MaxRectSide >= SquareDiag)
    return -1;  // возвращаем -1
В конце тогда можно просто выводить InnerRectSquare (если до него дело доходит после проверок) и "забить" на RectSquare.
1
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
14.06.2023, 14:50
Цитата Сообщение от gunslinger Посмотреть сообщение
Плюс из серии "критикуешь - предлагай".
С добрым утром!
Я ж написал: ни шмагла.

Где вы увидели критику - даже и не знаю.

Да, изначально тон у меня был другой, но я было решил, что это очередной студент вуза мается с лабой.
А коль скоро речь про "переквалификацию в сознательном возрасте" (такой я вывод сделал из ваших пояснений), то я и написал сразу, что смысла возиться с такой задачей не вижу никакого, к программированию она отношения не имеет. (при этом сам упоролся, да )
Вот рядом есть темка
Создать класс реализующий самосортирующийся массив
вот она хороша, она про программизьм как раз, тут есть смысл поупражняться. (даже не смотря на наличие готовых или почти готовых решений в С++, что уже весьма изящно показано в той теме).
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6289 / 3013 / 1051
Регистрация: 01.06.2021
Сообщений: 11,398
14.06.2023, 14:56
Цитата Сообщение от KSergey9 Посмотреть сообщение
смысла возиться с такой задачей нет никакого, к программированию она отношения не имеет
почему не имеет? программирование тесно связано с математикой. Конечно, программисту не обязательно знать какие-то узкоспециализированные темы из высшей математики, но в данной теме не тот случай, тут обычная школьная математика.
И мне интересны алгоритмы для вычисления данной макс площади, ибо только у меня уже несколько различных идей...
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
14.06.2023, 15:02
Цитата Сообщение от Royal_X Посмотреть сообщение
программирование тесно связано с математикой.
Дико зависит от точки в пространстве для применения программирования и функциональных обязанностей.
Вынесение общих множителей за скобки и т.п. уровень знаний точно нельзя считать за применение математики, на мой взгляд.

Цитата Сообщение от Royal_X Посмотреть сообщение
алгоритмы для вычисления данной макс площади, ибо только у меня уже несколько различных идей...
А поделитесь разными алгоритмами, плиз? идеями достаточно. Для понимания о чем речь, ибо у меня только 2 идеи.
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
14.06.2023, 15:08
KSergey9, мне казалось, что камни летят в мой огород. Хоть это не принципиально.
Насчет "темы рядом" - я и (код в стиле) ООП не совместимы с рождения (когда учился в ПТУ ВУЗе, ООП не особо понимал, в итоге так и не наверстал).

Пока не забыл, условие задачи "максимальная сторона прямоугольника должна быть меньше диагонали квадрата" вполне можно свести к условию "...должна быть не больше...". Почему там равенства быть не должно - не понимаю.
Почему не должно быть больше - понятно, расчет площади от этого изменится, так как меньшие стороны прямоугольника могут (и будут) в какой-то момент поворота выходить за углы квадрата.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6289 / 3013 / 1051
Регистрация: 01.06.2021
Сообщений: 11,398
14.06.2023, 15:14
KSergey9, ну вот самый правильный и точный алгоритм - это если будем всё считать по формулам.
Но есть и ленивый метод - вычисление площади методом Монте-Карло: бросаем на квадрат рандомные точки. Площадь покрытой части тогда будет равна s = S * m / n, где S это площадь квадрата, m это точки которые попали в прямоугольник, n количество точек, брошенных в квадрат. Чем больше будет n, тем точнее результат. Всё это реализуется достаточно просто. Нужно всего лишь написать bool функцию, которая проверяет попадает ли точка в прямоугольник, и если попадает, то ++m.
1
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
14.06.2023, 15:17

Не по теме:

Цитата Сообщение от gunslinger Посмотреть сообщение
ООП не совместимы с рождения
А что там можно не понимать?
Спросите (в новой теме?), наверняка растолкуют.
Боюсь, что вы слишком себя ограничиваете этим, тем более в рамках С++
Ну если это профессия, а не вспомогательные навыки на фоне основной деятельности.



Цитата Сообщение от gunslinger Посмотреть сообщение
условие задачи "максимальная сторона прямоугольника должна быть меньше диагонали квадрата" вполне можно свести к условию "...должна быть не больше...". Почему там равенства быть не должно - не понимаю.
Вам не понятно условие задачи и текст в нём, или не понятная чья-то реплика на это счёт?
Или код в приведенной мною программе?

Добавлено через 1 минуту
Royal_X, но это как раз те самые 2 идеи, которые есть у меня.
(только вместо Монте-Карло я реализовал полный перебор по сетке)

А еще?
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
14.06.2023, 15:18
KSergey9, программирование - это не моя профессия (уже давно).

По условию задачи - это просто мысли вслух.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6289 / 3013 / 1051
Регистрация: 01.06.2021
Сообщений: 11,398
14.06.2023, 15:35
Цитата Сообщение от gunslinger Посмотреть сообщение
Почему там равенства быть не должно - не понимаю.
Потому что условие писал идиот
какая разница, у меня максимальная сторона прямоугольника a * sqrt(2) или a * sqrt(2) - 1e-100.
А еще лучше, если максимальная сторона прямоугольника a * sqrt(2) - геометрическая точка.

Добавлено через 11 минут
Цитата Сообщение от KSergey9 Посмотреть сообщение
А еще?
еще, искомую площадь можно считать как площадь многоугольника по координатам по формуле Гаусса. Но сперва нужно найти координаты точек пересечения квадрата и прямоугольника. Кстати, я на форуме писал много раз код пересечения двух отрезков, заданных координатами.
1
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
14.06.2023, 15:40
Кстати, если макс. сторона прямоугольника будет больше диагонали квадрата, то, кроме "других формул" расчета площади, может (теоретически, но это не точно) перестать работать "идея" про 450. Однако тут уже другая история.
Цитата Сообщение от Royal_X Посмотреть сообщение
А еще лучше, если максимальная сторона прямоугольника a * sqrt(2) - геометрическая точка.
Что здесь подразумевается под "геометрической точкой"? Не очень понимаю.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
14.06.2023, 15:44
Цитата Сообщение от gunslinger Посмотреть сообщение
если макс. сторона будет больше диагонали квадрата,
может (теоретически, но это не точно) перестать работать "идея" про 450. Однако тут уже другая история.
Не, всё равно 45, проверял
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6289 / 3013 / 1051
Регистрация: 01.06.2021
Сообщений: 11,398
14.06.2023, 15:54
Цитата Сообщение от gunslinger Посмотреть сообщение
Что здесь подразумевается под "геометрической точкой"?
В геометрии точка это фундаментальный объект. Например, толщина окружности это точка, ибо окружность по сути это множество точек, равноудалённых от некой заданной точки. Или вот, например, радиус открытого и закрытого круга отличается на одну геометрическую точку.

Добавлено через 7 минут
Цитата Сообщение от KSergey9 Посмотреть сообщение
Не, всё равно 45, проверял
Вспомнил одну задачку на смекалку на эту тему.

Некто хочет перевезти в автобусе трубу длиной 2,5 м. Но в автобусе разрешено перевезти вещи, габариты (длина, ширина или высота) которых не превышают 2 м. Как ему решить данную проблему?
1
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
14.06.2023, 15:57
Цитата Сообщение от Royal_X Посмотреть сообщение
Как ему решить данную проблему?
На крыше!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.06.2023, 15:57

Найти прямоугольник с максимальной площадью.
Здравствуйте! Помогите, пожалуйста с заданием.. Максимальная площадь прямоугольника. Имеется последовательность размеров прямоугольников,...

Определить координаты треугольника с максимальной площадью
Задано 20 точек, лежащих на плоскости. Определить координаты треугольника с максимальной площадью.

Вывести название цилиндра с максимальной площадью
Должно вывести название цилиндра с максимальной площей, вместо этого ничего. ...

Определить координаты треугольника с максимальной площадью
писала на ощупь,потому что в vba-полный чайник помогите найти ошибки Задание (язык программирования-vba): Задано 20 точек,...

Вывести на печать координаты треугольника с максимальной площадью
Найти семиугольник с координатами вершин (x1, y1), (x2, y2), …, (x7, y7). Вывести на печать координаты треугольника с максимальной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 5
anaschu 26.06.2026
ПЛАН РАЗРАБОТКИ математической модели сукцессии микоризных систем Переход AM → EcM (Endo + ErM) · Шумилов А. С. · ИФХиБПП РАН · Пущино · 2026 . . .
сукцессия 4
anaschu 25.06.2026
Более детализированный план разработки План доработки модели динамики микоризных симбиозов (EcM с гистерезисом) Цель: Реализовать логику переключения между эрикоидным (ErM) и эктомикоризным. . .
сукцессия 3
anaschu 25.06.2026
Примерный план работ по модели
сукцессия 2
anaschu 25.06.2026
параметризировочная калибровочная таблица будущей модели
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал Материалы для обсуждения с МГСУ · 2026 Рисунки внутри приложенного ворд файла. Что за. . .
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
27. Планы на разработку функциональных требований к строительству внутри модели пищеблока (или не только его?)
anaschu 22.06.2026
Что уже реализовано и даёт конфликты «бесплатно» Самый простой конфликт уже работает — конфликт за ресурс-работника. Заданий больше, чем доступных поваров → очередь в queue1. Это прямое отражение. . .
26. мед мат модель.Какие типы конфликтов функциональных требований можно рассчитать через ДЕС-моделирование (СМО) в AnyLogic?
anaschu 22.06.2026
Что ДЕС/ СМО умеет считать напрямую: Конфликты за ресурсы (очереди, узкие места). Несколько типов агентов (повара, учителя, рабочие, пациенты) претендуют на один ресурс (лифт, вход, коридор,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru