На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Вписать прямоугольник в прямоугольник
    Есть прямоугольник. Угол наклона 0 и не изменяется. Размеры его известны.
    Есть другой прямоугольник с известными размерами и углом (угол может быть произвольный).
    Его необходимо вписать в первый сохраняя пропорции. Так чтобы углы вписаного лежали на сторонах внешнего.
    Буду благодарен за помощь.
      Наверное сначала нужно проверить больше ли 1 прямоугольник (в который вписываем) 2 прямоугольника (который вписываем).

      Затем вероятно проверить если углы совпадают (короче фигуры в одинаковым положениях поскольку фатичеки разница максимуму в 159 градусов - из расчета что прямоугольник поворачиваться по центру).
      Сообщение отредактировано: PIKSEL_IT -
        А разве прямоугольник всегда можно вписать в другой прямоугольник? Пусть есть узкий прямоугольник и широкий, немного повенутый. Никак не впишешь широкий в узкий так, чтобы и пропорции сохранить и все вершины на сторонах оказались.
        Сообщение отредактировано: Yakudza -
          Цитата PIKSEL_IT @
          Наверное сначала нужно проверить больше ли 1 прямоугольник (в который вписываем) 2 прямоугольника (который вписываем).

          Собственно, мне и нужно изменить размеры 2-го прямоугольника (который вписываем) так чтобы он вписался в первый.
          Цитата Yakudza @
          А разве прямоугольник всегда можно вписать в другой прямоугольник? Пусть есть узкий прямоугольник и широкий, немного повенутый. Никак не впишешь широкий в узкий так, чтобы и пропорции сохранить и все вершины на сторонах оказались.

          Да, важное замечание. Значит берем для начала упрощенный вариант - предположим что его можно вписать.
            Надо всё же доопределить задачу. Что именно, какие параметры сохранять (или поддерживать в неких пределах) у вписанного при вращении?
              Цитата rapido @
              А разве прямоугольник всегда можно вписать в другой прямоугольник? Пусть есть узкий прямоугольник и широкий, немного повенутый. Никак не впишешь широкий в узкий так, чтобы и пропорции сохранить и все вершины на сторонах оказались.


              Если изменять пропорции и взять то что стороны прямоугольника могут быть ничтожно малы то вписать можно любой прямоугольник.
                Цитата MBo @
                Надо всё же доопределить задачу. Что именно, какие параметры сохранять (или поддерживать в неких пределах) у вписанного при вращении?

                Сохранить нужно только соотношение сторон. Размеры и угол можно изменять. Соотношение сторон заранее известно.
                  Обозначим:
                  W, H - ширина и высота неподвижного прямоугольника C = H/W
                  w, h, A - ширина, высота и угол поворота вписанного прямоугольника
                  Можно ограничиться углами от 0 до pi/2, второе решение симметрично первому
                  c = h/w

                  Итак, имеем
                  w*sin A + h*cos A = H
                  w*cos A + h*sin A = W
                  Разделим первое равенство на второе
                  (w*sin A + h*cos A)/(w*cos A + h*sin A) = C
                  (sin A + c*cos A)/(cos A + c*sin A) = C
                  (tg A + c)/(1 + c*tg A) = C
                  tg A + c = C*(1 + c*tg A)
                  tg A + c = C + C*c*tg A
                  tg A - С*с*tg A = С - с
                  tg A(1 - С*с) = С - с
                  tg A = (С - с)/(1 - С*с)
                  Если тангенс получился положительным, получаем нужный угол поворота
                  Если отрицательным, значит вершины "вписываемого" прямоугольника оказались на продолжениях сторон заданного
                  Вписываемый прямоугольник должен быть более продолговатым
                  Если соотношения сторон равны, то вписываемый прямоугольник совпадет с внешним
                    Цитата amk @
                    Если отрицательным, значит вершины "вписываемого" прямоугольника оказались на продолжениях сторон заданного

                    То есть вот так (см. рис.).

                    Прикреплённая картинка
                    Прикреплённая картинка
                      Нет, не так. Эти прямоугольники вписываются как надо. А вот если вписываемый прямоугольник "полнее" описанного, то все вершины "вписываемого" оказываются за пределами "внешнего". Чуть позже нарисую.
                      Сообщение отредактировано: amk -
                        А вот и рисунок
                        Прикреплённая картинка

                        Зеленая окружность - вспомогательная. Использовалась для построения примера. Центр окружности совпадает с точкой пересечения диагоналей прямоугольников.
                          Я правильно рассуждаю?
                          Имея тангенс находим синус и косинус.
                          Выражаем w из первого уравнения:
                          w = (H - h*cos A) / sin A;
                          Подставляем во второе и находим h:
                          ((H - h*cos A) / sin A)*cos A + h*sin A = W;
                          (H - h*cos A)*cos A / sin A + h*sin A = W;
                          (H*cos A - h*cos A^2) / sin A + h*sin A = W;
                          (H*cos A - h*cos A^2 + h*sin A^2) / sin A = W;
                          (H*cos A - h*(cos A^2 + sin A^2)) / sin A = W;
                          (H*cos A - h) / sin A = W;
                          H*cos A - h = sin A*W;
                          - h = sin A*W - H*cos A;
                          h = H*cos A - sin A*W;
                          h = H*cos A - sin A*W;
                          Подставив назад найденное h, находим w:
                          w = (H - (H*cos A - sin A*W)*cos A) / sin A;

                          ???
                            Ты, когда h за скобку выносил, знак перепутал. Поэтому дальше все неправильно получилось

                            Попробую вывести, но из первого уравнения буду выражать h
                            w*sin A + h*cos A = H
                            w*cos A + h*sin A = W

                            h = (H - w*sin A)/cos A
                            w*cos A + (H - w*sin A)/cos A*sin A = W
                            w*cos A + H*sin A/cos A - w*sin A*sin A/cos A = W
                            w*cos2 A + H*sin A - w*sin A*sin A = W*cos A
                            w*(cos2 A - sin2 A) = W*cos A - H*sin A
                            w*cos 2A = W*cos A - H*sin A
                            w = (W*cos A - H*sin A)/cos 2A
                            Формулу для h можно получить подставив это значение или просто поменяв W и H местами
                            h = (H*cos A - W*sin A)/cos 2A
                              Цитата amk @
                              h = (H*cos A - W*sin A)/cos 2A

                              Добрый день, столкнулся с похожей проблемой при повороте прямоугольника. Но у меня задача получить размер h, имея на руках W, H, w. Угла нет.
                              Может уже есть рабочий вариант?

                              Угол потом получить тоже нужно, но это будет просто сделать по вашей формуле выше:

                              c = h/w
                              C = H/W
                              tg A = (С - с)/(1 - С*с)
                              Сообщение отредактировано: besd -
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0715 ]   [ 19 queries used ]   [ Generated: 26.04.24, 11:17 GMT ]