Pull to refresh

Comments 21

Где-то у меня валяется код на Actionscript 3, рендерящий относительно пристойно выглядящий лес, размером строк в двести и 12 килобайт исполняемого кода (SWF). Правда, вместо попиксельной рисовки там честное (почти честное) 3D для каждого дерева в лесу. Ну и работает со скоростью роста настоящего леса. Ссылки попротухали за шесть лет, но перевыложить могу, в принципе.
Напишите публикацию, уверен, многим будет интересно (мне — точно).
Готово: habr.com/post/429256 правда, самого кода там не так много, больше алгоритмов в виде текста.
И все равно получилось отлично)
Под Python 3.6.6, может кому пригодится.

Сам код
import PIL, random
from PIL import Image, ImageDraw
origDimension = 1500
r = lambda: random.randint(50,215)
rc = lambda: (r(), r(), r())
listSym = []
def create_square(border, draw, randColor, element, size):
  if (element == int(size/2)):
    draw.rectangle(border, randColor)
  elif (len(listSym) == element+1):
    draw.rectangle(border,listSym.pop())
  else:
    listSym.append(randColor)
    draw.rectangle(border, randColor)
def create_invader(border, draw, size):
  x0, y0, x1, y1 = border
  squareSize = (x1-x0)/size
  randColors = [rc(), rc(), rc(), (0,0,0), (0,0,0), (0,0,0)]
  i = 1
  for y in range(0, size):
    i *= -1
    element = 0
    for x in range(0, size):
      topLeftX = x*squareSize + x0
      topLeftY = y*squareSize + y0
      botRightX = topLeftX + squareSize
      botRightY = topLeftY + squareSize
      create_square((topLeftX, topLeftY, botRightX, botRightY), draw, random.choice(randColors), element, size)
      if (element == int(size/2) or element == 0):
        i *= -1
      element += i
def main(size, invaders, imgSize):
  origDimension = imgSize
  origImage = Image.new('RGB', (origDimension, origDimension))
  draw = ImageDraw.Draw(origImage)
  invaderSize = origDimension/invaders
  padding = invaderSize/size
  for x in range(0, invaders):
    for y in range(0, invaders):
      topLeftX = x*invaderSize + padding/2
      topLeftY = y*invaderSize + padding/2
      botRightX = topLeftX + invaderSize - padding
      botRightY = topLeftY + invaderSize - padding
      create_invader((topLeftX, topLeftY, botRightX, botRightY), draw, size)
  origImage.save("Result" + str(size) + "x" + str(size) + "-" + str(invaders) + "-" + str(imgSize) + ".jpg")
  print('Файл успешно создан')

while True:
  size = input('Введите размер спрайта, не кратно 2 a = (1,3,5,7,9,11...)\n')
  if size == 'exit' or size == 'e' or size == 'EXIT' or size == 'quit' or size == 'q' or size == 'Q' or size == 'E':
    break
  invaders = input('Введите кол-во спрайтов(1,2,3,4,5,6,7...)\n')
  if invaders == 'exit' or invaders == 'e' or invaders == 'EXIT' or invaders == 'quit' or invaders == 'q' or invaders == 'Q' or invaders == 'E':
    break
  imgSize = input('Введите разрешение картинки(50,100,150...)\n')
  if imgSize == 'exit' or imgSize == 'e' or imgSize == 'EXIT' or imgSize == 'quit' or imgSize == 'q' or imgSize == 'Q' or imgSize == 'E':
    break
  try:
    main(int(size), int(invaders), int(imgSize))
  except IndexError:
    print('Фигово вводите... Попробуйте ещё раз')
  except ValueError:
    print('Даже по цифрам не попадаете... Попробуйте ещё раз')

Кажется это можно использовать как новый метод стеганографии.Нужно хеш-стеганографию подружить с генеративным искусством ;))
UFO just landed and posted this here
Рабочий день кончился ;)))
И если теперь подключить к вязальной машине, можно сделать интересный свитер. Но скучно, наверное.
Сравнивать размер исходников и заоптимизированного под компактность скомпилированного бинарника — довольно неблагодарное занятие. Ну и вообще, где энтрилевельный любительский код на питоне, а где демосцена.
Благодарное. Хорошая иллюстрация — есть к чему стремиться. В конце концов в компо ограничение на объём, и не важно на чём написано.

А по ключевому слову «демосцена» можно найти достаточно материалов по процедурной графике в том числе.

Полезно знать общественное цифровое наследие и достояние.
А возможностей питона хватит чтобы визуализировать содержимое подключенного тома или папки вот в таком виде:

Скриншот k4dirstat



У меня есть желание создать свой похожий алгоритм, визуализирующий содержимое директорий и дисков, но я не знаю как подступиться к задаче. Т.к. знания о программировании ограничены знаниями BASIC, изученного больше десятилетия назад.
А можете пояснить что под спойлером? Не понятно…
«чтобы визуализировать содержимое подключенного тома или папки...»)

«Скриншот k4dirstat»
Эти квадратные и прямоугольные ячейки отображают файлы. Чем больше размер файла, тем больше площадь ячейки. Но мне не нравится эта визуализация, хочу свою запилить и не знаю как начать.
Хватит. Советую для начала почитать туториал на английском в документации Python, если с английским проблем нет (даже если есть — лучше попробовать). Советую так же узнать что такое pip для python и как им пользоваться.

Вижу k4dirstat написан на Qt. Есть PyQt, с помощью которого можно зафигачить такой же интерфейс и привязать его к проге на питоне. Если не боитесь чужого кода (и вообще это отличная мысль) можно даже попробовать портировать интерфейс самого k4dirstat. Qt у нас кросплатформенный.

Можно и на tkinter'е написать интерфейс в принципе, если хотите. Он вовсе включен в стандартную библиотеку питона.
Сама программа хорошая и удобная. Меня не устраивает часть, которая визуализирует размер файлов.

Я как программер нулевой, моя компетенция GUI и визуальные «рюшечки». Просто пока я изучу работу с ОС, ФС, файлами и т.п. то состарюсь до 70 лет :)

А если я алгоритмически опишу свою версию хотя бы в общих чертах, то разраб k4dirstat вероятно возьмет мой алгоритм.

Да, дерзай. Вообще питон довольно простой язык и я сомневаюсь, что на какое-нибудь вообще решение этой проблемы будет потрачено настолько много времени. Полагаю там надо будет использовать встроенный модуль os для действий с… ОС.
Only those users with full accounts are able to leave comments. Log in, please.