Как найти точки на окружности, чтобы определить основанный на соотношении прямоугольник, который максимизирует пространство?
Мой вопрос связан с требованиями адаптивной иконки Android 8.0:
https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive
Я работаю над приложением для Android, где значок запуска будет неизвестен, а люди, занимающиеся развертыванием приложения, не имеют ни малейшего представления о том, что такое SVG (и никто не будет иметь времени, денег или терпения, чтобы попытаться объяснить / понять, что такое SVG или). Это означает, что изображения в формате PNG должны будут хорошо выглядеть на Android 8.0 и более поздних версиях.
Адаптивный значок отображается при 108dp x 108dp. На xxxhdpi (4x) он занимает до 432x432 пикселей. Однако на переднем плане используется только круг диаметром 66dp, что составляет 264x264 пикселей на xxxhdpi. Проблема в том, что значок находится внутри маски круга. Объяснить, что такое круговая маска и почему она требуется, также будет чрезвычайно сложно. Короче говоря, полученные изображения будут прямоугольными, и большинству людей нравится заполнять доступное пространство.
Итак, что я хочу сделать, это взять любое прямоугольное входное изображение, которое я получу, и вычислить его соотношение (просто), но затем найти прямоугольник с таким же соотношением, который максимизирует пространство в ограниченном круге с диаметром 66dp. Я мог бы использовать метод подхода Эйлера, переходя от 0 до 90 градусов (т.е. догадываться) до тех пор, пока я не достигну "достаточно близкого", но приятного, легкого для понимания фрагмента кода, который не использует цикл for, который идет непосредственно из отношения чтобы точный прямоугольник был бы намного чище. Я предпочитаю стиль C/C++, но я возьму все, что смогу, пока это будет читабельным. Я довольно сильно разболелся по своей тригонометрии - прошло уже почти 20 лет с тех пор, как мне в последний раз приходилось заниматься какой-либо серьезной математикой, поэтому, пожалуйста, не используйте формулы в LaTeX, не преобразовав их в то, что я действительно понимаю (например, код) - я совершенно теряюсь, когда приземляюсь на сайте математики SE в эти дни.
(Если кто-то думает, что я ищу раздаточный материал, я прекрасно справляюсь со своей работой, пока знаю, что искать. У меня есть три неизвестных: угол, длина противоположности и длина смежной. Классическая SOH-CAH-TOA не применяется напрямую. У меня есть два известных: длина гипотенузы и отношение прямоугольника. Я могу взломать решение вместе, но я бы не стал, если есть более чистое решение.)
1 ответ
Я слишком долго думал об этом. Лучшим решением является вычисление радиуса круга, который будет содержать прямоугольник исходного изображения, а затем масштабирование изображения на основе отношения диаметра источника к диаметру назначения. Пример псевдокода:
w = 720
h = 405
dp = 66
halfwidth = w / 2
halfheight = h / 2
origdiameter = sqrt(halfwidth * halfwidth + halfheight * halfheight) * 2
destdiameter = dp * 4
newwidth = w * destdiameter / origdiameter
newheight = h * destdiameter / origdiameter
Производит 230,09 х 129,43 и идеально вписывается в круг диаметром 264 пикселя. Оба прямоугольника тоже ~16:9 (1.77777). Я могу сбрить пару дп, чтобы мне не пришлось беспокоиться о сглаживании пикселей. В качестве дополнительного бонуса это делает изображения аккуратными 256 x 256.