Pull to refresh

Визуальный анализ качества кода

Reading time2 min
Views9.7K
Всем добрый день!

Вдохновившись одной gif-кой я решил, а что будет, если написать обратное приложение и смотреть на «карту» кода?

Во первых нам необходимо решить задачу «разместить столько то пикселей в квадрат».
Понятно, что в квадрат не всегда можно да и не нужно. Поэтому можно расположить их в прямоугольник с дополнением.
Не найдя алгоритма, который мне скажет, что 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. Если вдруг знаете красивый алгоритм превращения числа в произведение с остатком — очень прошу мне про него рассказать.
Tags:
Hubs:
+9
Comments8

Articles

Change theme settings