Всем добрый день!
Вдохновившисьодной gif-кой я решил, а что будет, если написать обратное приложение и смотреть на «карту» кода?
Во первых нам необходимо решить задачу «разместить столько то пикселей в квадрат».
Понятно, что в квадрат не всегда можно да и не нужно. Поэтому можно расположить их в прямоугольник с дополнением.
Не найдя алгоритма, который мне скажет, что 129=11*12-3, я решил его написать сам.
После чего рисуем красивую картинку или в поток или в файлик.
Примеры получившихся картинок:
Код в среднем равномерно-серый с вкраплениями зеленого. Зато, полосатый.
Исполняемый файл какой-то странный, с черной полосой посередине.Что, в общем-то, очевидно.
В конце угадываются ресурсы иконок.
Примеры получившихся картинок:
Код в среднем равномерно-серый с вкраплениями синего. В целом, он кажется синеватым.
В общем, экспериментируйте, надеюсь, ваш код не окажется равномерно-коричневого цвета!
Исходник в архиве
Скомпилированная программа
P.S. Если вдруг знаете красивый алгоритм превращения числа в произведение с остатком — очень прошу мне про него рассказать.
Вдохновившись
Во первых нам необходимо решить задачу «разместить столько то пикселей в квадрат».
Понятно, что в квадрат не всегда можно да и не нужно. Поэтому можно расположить их в прямоугольник с дополнением.
Не найдя алгоритма, который мне скажет, что 129=11*12-3, я решил его написать сам.
Немного ужасного кода
public static ImageSize Generate(uint PixelsCount, double MaximumDeltaPercent=1f, uint MaximumAbsoluteDelta=10, double MaximumAspectRatio=1.77)
{
//check if this is empty image
if (PixelsCount==0) return new ImageSize(1,1);
//check if this is a square
double sqrt = Math.Truncate(Math.Sqrt(PixelsCount));
if (Math.Pow(sqrt, 2) == PixelsCount) return new ImageSize((ushort)sqrt, (ushort) sqrt);
//Путем тестов выяснено, что AspectRatio - штука, работающая на достаточно больших числах. Поэтому на маленьких мы ее отключаем.
if (PixelsCount<=10) MaximumAspectRatio = double.MaxValue;
double percentdelta = PixelsCount/(MaximumDeltaPercent*100);
uint height = (ushort) Math.Truncate(Math.Sqrt(PixelsCount));
uint width = (ushort) (height+1);
while (width/(height*1.0f)<MaximumAspectRatio)
{
ulong Result = width*height;
if (Result==PixelsCount)
{
if (width<=ushort.MaxValue && height<=ushort.MaxValue)
{
return new ImageSize((ushort) width, (ushort) height);
}
}
if (Result>PixelsCount)
{
if ((Result-PixelsCount)<=percentdelta || Result-PixelsCount<=MaximumAbsoluteDelta)
{
if (width <= ushort.MaxValue && height <= ushort.MaxValue)
{
return new ImageSize((ushort) width, (ushort) height);
}
}
height--;
continue;
}
if (Result < PixelsCount)
{
width++;
}
}
throw new Exception(string.Format("Невозможно создать красивую картинку размером {0} пикселей с таким Aspect Ratio. Попробуйте большее значение\nОтладочная информация: PC:{0} MDP:{1} MAD:{2} MAR{3}",PixelsCount,MaximumDeltaPercent,MaximumAbsoluteDelta,MaximumAspectRatio));
}
После чего рисуем красивую картинку или в поток или в файлик.
Примеры получившихся картинок:
Один из больших файлов моего мини-проекта
Код в среднем равномерно-серый с вкраплениями зеленого. Зато, полосатый.
Explorer.exe из Win8.1
Исполняемый файл какой-то странный, с черной полосой посередине.
В конце угадываются ресурсы иконок.
Примеры получившихся картинок:
Workqueue.c из linux kernel
Код в среднем равномерно-серый с вкраплениями синего. В целом, он кажется синеватым.
В общем, экспериментируйте, надеюсь, ваш код не окажется равномерно-коричневого цвета!
Исходник в архиве
Скомпилированная программа
P.S. Если вдруг знаете красивый алгоритм превращения числа в произведение с остатком — очень прошу мне про него рассказать.