Pull to refresh

Comments 35

Очень нестандартная идея)
Только вот у вас «квадрат» 8 на 9 получился…
При использовании шрифта, который я использую когда программирую, круг и квадрат были ровненькими и красивыми (визуально). Это главное, так как искажение из-за того что буквы неквадратные для круга и квадрата одинаковое (собственно это некий коэфициент, который попадает как в числитель, так и в знаменатель дроби o/k, и в итоге сокращается).
По моему главное — это как раз количество единиц площади (символов в данном случае), и неважно, что визуально эллипс, просто проекция такая. А в итоге не коэффициент, а слагаемое, т. е. что-то типа (o+n)/(k+m) — что никак не сокращается.
Пусть у нас буквы квадратные. Тогда всё вроде понятно, чем картинка больше, тем результат лучше, В основном благодаря тому, что круг все ближе к настоящему кругу.

Теперь мы поменяли шрифт в котором, для простоты, ширина букв соотносится с высотой как 1/2.

Понятно, что если мы просто вычеркнем строчки через одну, то квадрат вообще останется квадратом (особенно, если число строк четное), а круг тоже получится вполне ровненький.
Также понятно, что оба числа и o и k просто уменьшаться в два раза.
Это справедливо будет только если в одной половине круга оставлять те строчки (столбцы), которые мы вычеркнули в другой.
Так и будет если в исходной картинке число строчек, которыми нарисован круг, чётное.

Естественно, этот коэффициент в итоге не равен соотношению сторон шрифта, но он стремится к нему с ростом размера картинки. Совсем точно, конечно, не получится, также как с этим же ростом результат стремится к пи, но совсем точное пи не получится, так как пи число иррациональное и не может быть полученно в результате деления двух целых чисел.

На этом предлагаю обсуждение квадратуры круга закончить ;)
Меня смущает что давно известное приближение 22/7 куда более точное, чем то, что у вас. Хотя в вашем круге явно больше 22 букв O, а в квадрате больше 7 букв K.
Ну, из семи букв квадрат не очень красивый получится.

Можно домножить 22/7 на 7/7 и рисовать квадрат из 49 букв, а круг из 154 соответвенно. Но это будет чит :)

Тут как раз фокус в том, что чем красивее (и больше) мы рисуем картинку, тем точнее вычисляем число пи, при этом ничего ни про какие известные приближения нам знать не надо.
Да и у круга эксцентриситет чуть больше нуля всё же.
И круг не круглый, а элипс с осями 18 и 31 буквы
В 90-х книжка у меня была что-то типа «100 интересных задач по программированию», по-моему там я этот круг видел.
Да-да, этот круг из минусов и подчерков из 90-х, он на современых компиляторах C и не работает, но статья не про него.
Пожалуйста, поднесите к камере айфон для калибровки числа Пи.
Есть ещё такой вариант:

Это не шутка! Программа для расчета числа «пи». Да-да, именно расчета, а не вывода готовой константы посредством сопроцессора. Чем больше круг — тем выше точность расчетов.

 /*
  * Program to compute an approximation of pi
  *  by Brian Westley, 1988
  */
  #define _ 0xF<00? --F<00||--F-OO--:-F<00||--F-OO--;
  int F=00,OO=00;
  main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
  {
  _-_-_-_
  _-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_
  _-_-_-_
  }


Ссылка на источник: www.xakep.ru/magazine/xa/121/102/1.asp
О, классно, эта версия подправлена под современные препроцессоры, и выдает правильный ответ.
Но смысла, кроме символического, в том, что нарисован круг здесь нет. А у меня картинка имеет прямой геометрический смысл.
Ой, а они там пишут, что чем больше круг, тем точнее пи. Придется разбираться, что эта программка делает, если геометрический смысл есть, то добавлю в топик уточнение. Но в любом случае, у меня гораздо понятнее.
Я бы не сказал что так уж прямо понятнее. У них всё тоже просто: "_" считают строки, "-_" считают точки внутри круга. Дальше — делим площадь квадрата на площадь круга. Та же идея, что и у вас, только всё в одном месте и вместо площади квадрата у нас есть его сторона. Конечно тут предполагаются-таки квадратные символы иначе ничего не выйдет!
Попробовал с помощью asc gen 2 сгенерировать текст из картинки-круга в более высоком разрешении, но при этом точность особо не возросла. Видимо надо лучше подбирать параметры генерации.
UFO just landed and posted this here
Самое смешное, что я ровно это и сделал, но я геометрический смысл исходной программы не понял (мне её текст попал без комментариев и не работающий). И придумал свою, более понятную, скорее вдохновившись формой исходной программы, чем вникнув в содержание.
И все-таки у вас овал и прямоугольник. А суть идеи в геометрической правильности фигур. Симметрии явно не хватает фигурам.
При квадрате 8х8 наиболее точное вычисление, которое можно получить, это 3,125. (3,14 умножаем на 64, ищем ближайшее число, делящееся без остатка на 8, получаем 200, и с такой площадью рисуем круг):
            O O O O                 K K K K K K K K
      O O O O O O O O O O           K K K K K K K K
    O O O O O O O O O O O O         K K K K K K K K
  O O O O O O O O O O O O O O       K K K K K K K K
  O O O O O O O O O O O O O O       K K K K K K K K
  O O O O O O O O O O O O O O       K K K K K K K K
O O O O O O O O O O O O O O O O     K K K K K K K K
O O O O O O O O O O O O O O O O     K K K K K K K K
O O O O O O O O O O O O O O O O
O O O O O O O O O O O O O O O O
  O O O O O O O O O O O O O O
  O O O O O O O O O O O O O O
  O O O O O O O O O O O O O O
    O O O O O O O O O O O O
      O O O O O O O O O O
            O O O O

При квадрате 9х9 уже можно будет получить 3,1605.
Что, кстати, намекает на то, что увеличение размеров в данном случае не всегда будет увеличивать точность. Во всяком случае до тех пор, пока круг не будет приближен к реальному.
О каком ряде речь-то?

В целом, при значительном увеличении фигур, искомое число приближается к Пи. Скажем, при радиусе (и стороне квадрата) в 100 единиц уже получается 3,1416. Но незначительное увеличение (на единицу, например) не обязательно даст уточнение результата. Полагаю, это связано с ярко выраженной дискретностью и тем, что «изображение» круга из немного большего числа единиц площади может оказаться менее близким к идеальному.
> О каком ряде речь-то?
видимо об этом:
Ряд чисел Xk, где k это количество точек радиуса и стороны квадрата, при k стремящемся к бесконечности будет стремиться к Pi
при этом необязательно чтобы ряд (Pi-Xk) был строго убывающим, что вы и пытались показать «ярко выраженной дискретностью»
А почему на 8? По осям симметрии?
Именно. Иначе это даже приближенно кругом назвать сложно.
Вот о чём нужно давать тестовые задания на собеседованиях :)
— Здравствуйте. Вы претендуете на вакансию Сеньор ПХП Девелопер. Напишите мне функцию в форме круга, вычисляющую число Пи.
— До свидания.
Мне уже за этот комментарий три минуса в карму поставили. Довожу до сведения минусующих, что сия ироничная ремарка сделана с намёком на предыдущий пост автора.

Я так понимаю, смайлик в предложении не сигнализирует что это шутка. Надо будет в другой раз обрамлять тегом sarcasm, irony или что-то в этом духе.
Проблема в том, что обычно, ни личность автора, ни что он там писал раньше, никому это не интересно. К данному посту же ваш комментарий относится как-то странно. Я лично был, конечно, польщен таким вниманием, жаль карму вернуть вам не в силах.
Преимущество такого подхода ещё в том, что при должной оптимизации число π будет вычислено ещё на этапе компиляции.
В старой книжке Expert C Programming (http://www.e-reading.co.uk/bookreader.php/138815/Linden_-_Expert_C_Programming:_Deep_C_Secrets.pdf) есть такой пример:

<code>
#define X )*2+1 
#define _ )*2 
#define s ((((((((((((((((0 /* For building glyphs 16 bits 
wide */ 
/* They enable you to create the hex patterns for icons, glyphs, etc., by drawing a picture of the image 
you want! What could be better for making a program self-documenting? Using these defines, the 
example is transformed into:  */
static unsigned short stopwatch[] = 
{ 
 s _ _ _ _ _ X X X X X _ _ _ X X _ , 
 s _ _ _ X X X X X X X X X _ X X X , 
 s _ _ X X X _ _ _ _ _ X X X _ X X , 
 s _ X X _ _ _ _ _ _ _ _ _ X X _ _ , 
 s _ X X _ _ _ _ _ _ _ _ _ X X _ _ , 
 s X X _ _ _ _ _ _ _ _ _ _ _ X X _ , 
 s X X _ _ _ _ _ _ _ _ _ _ _ X X _ , 
 s X X _ X X X X X _ _ _ _ _ X X _ , 
 s X X _ _ _ _ _ X _ _ _ _ _ X X _ , 
 s X X _ _ _ _ _ X _ _ _ _ _ X X _ , 
 s _ X X _ _ _ _ X _ _ _ _ X X _ _ , 
 s _ X X _ _ _ _ X _ _ _ _ X X _ _ , 
 s _ _ X X X _ _ _ _ _ X X X _ _ _ , 
 s _ _ _ X X X X X X X X X _ _ _ _ , 
 s _ _ _ _ _ X X X X X _ _ _ _ _ _ , 
 s _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
}; 
</code>

Отличный способ видеть отдельные биты! И не только для картинок.
Sign up to leave a comment.

Articles