avatar habrahabr_full

Хабрахабр без ката



подробнее...

Следить за персональным блогом

Автоматизированная система Промышленная безопасность и охрана труда

Обновления главной ленты блогов
Внимание

На нашем портале можно бесплатно публиковать информацию о своей компании, размещать товары и услуги и цены на них.
Ведите свой личный или корпоративный блог и его ежедневно увидят 30 тысяч посетителей нашего сайта.

06 февраля 2014, 15:11

Круглендарь на 2014 год


Здравствуйте, друзья! В прошлом году я сделал первый круглендарь. Продолжаем, экспериментируем.

Идея проекта — создать календарь, позволяющий увидеть все дни года, вспомнить приятные моменты прошлого и ожидаемые события будущего. Есть Google.ru/search?q=round+calendar&newwindow=1&tbm=isch&tbo=u&source=univ&sa=X&ei=OafyUqLnAuWvyAOwrYGoAw&ved=0CCUQsAQ&biw=1920&bih=936">куча аналогов, особенностью этого проета является минималистичность и пустота, ведь на первом плане должны быть каракули обладателя.

Скачиваем с Github (или git clone github.com/illus0r/kruglendar2014.git) • Распечатываем на формате А1 • Вешаем на стенку в удобном месте (особенно хорошо — в туалете), рядом — фломастер на ниточке. • Случилось что-то интересное? Лихо дорисовываем круглендарь! К концу года будет любо-дорого смотреть.

Лицензия Creative Commons Также, как и предыдущий, этот календарь публикуется под лицензией Creative Commons «Attribution» («Атрибуция») 3.0 Непортированной.

С Новым Годом!

Под катом немного о процессе создания.

Процесс

В этом году всё началось с набросков. Думал сделать что-то навороченное и фрактальное, с лунным календарём в довесок. Но вернулся к первому минималистичному эскизу.

Как заправский лентяй, я решил написать скрипт, который выполнить львиную долю работы. Так появилась возможность поиграть размерами, толщинами и, конечно же, шрифтами.

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

Над цветами долго не думал. В фотошопе, открыл окошко выбора цвета и переключился в режим с одинаковой Lightness цветовой схемы Lab (она учитывает восприятие цвета человеком и интенсивность цветов будет схожей).

Несколько точек есть, остальные получаем путём интерполяции. Хорошо, я выбрал не самый простой путь, и можно было обойтись маской в иллюстраторе. Но ведь так веселее!

Самоё скрипт
# -*- coding: utf-8 -*-
import svgwrite, math, numpy
def frange(x, y, jump):
  while x < y:
    yield x
    x += jump
if __name__ == '__main__':
  # Calendar parameters
  textAngleShift = -(0.26*math.pi*2/365)
  canvasSize = (500,707)
  mid = canvasSize[0]/2.0, canvasSize[1]/2.0
  dayFontFamily = "PT Sans"
  dayFontSize = "1.8pt"
  svgFileName = 'calendar_03.svg'
  # we will interpolate rainbow gradient through these points
  rainbowGradient = [[  0,  0,  0,239,255,255,  0,  0],  # Red
             [254,248,246,194,  0,  0,211,254],  # Green
             [255,193,  0,  0,  0,210,255,255]]  # Blue
  rainbowGradientPoints = [math.pi*2/7*0,
               math.pi*2/7*1,
               math.pi*2/7*2,
               math.pi*2/7*3,
               math.pi*2/7*4,
               math.pi*2/7*5,
               math.pi*2/7*6,
               math.pi*2/7*7
              ]
  #=======================================
  # Calendar circle parameters
  #=======================================
  k = 3.0 # multiplication koef.
  delta = 1.9 # first step in progression
  initRad = canvasSize[0]*0.3684 # initial size
  radiusProgression = [initRad]
  for i in range(4):
    nextValue = initRad-delta*pow(k,i)
    radiusProgression += [nextValue]
  R_dates = 1.2*canvasSize[0]*0.312
  R_days_end, 
    R_days_beg, 
    R_weeks_beg, 
    R_mounthes_beg, 
    R_seasons_beg = radiusProgression
  #R_weekend_end = R_days_beg + 20;
  R_weekend_end = R_days_end;
  # Stroke width
  stroke_k = 1.8
  stroke_thinest = 0.15
  dayLineStrokeWidth, 
    weekLineStrokeWidth, 
    mounthLineStrokeWidth, 
    seasonLineStrokeWidth = [0.1*(stroke_k**i) for i in range(4,0,-1)]
  weekendStrokeWidth = 6.7
  #=======================================
  # Filling mounth arrays
  #=======================================
  dayAngle = math.pi*2/365
  weekAngle = dayAngle*7
  mounthes = [u'января',
        u'февраля',
        u'марта',
        u'апреля',
        u'мая',
        u'июня',
        u'июля',
        u'августа',
        u'сентября',
        u'октября',
        u'ноября',
        u'декабря'
        ]
  mounthDays = [31,28,31,30,31,30,31,31,30,31,30,31] # days in each mounth
  yearDays = ["%d %s"%(i+1, mounthes[index]) 
            for index, m in enumerate(mounthDays) 
            for i in range(m)]
  # array with marks for yearDays:
  # 1 means first day of mounth
  # 2 means first day of mounth and of season
  allFirstDates = [ 0 if i!=0 else 
            1 if (index+1)%3!=0 else 
            2 
            for index, m in enumerate(mounthDays) 
            for i in range(m)]
  mounthAngles = [d*dayAngle for d in mounthDays]
  #=======================================
  # Making svg and groups
  #=======================================
  dwg = svgwrite.Drawing(svgFileName, profile='tiny')
  textGroup = dwg.g(font_family=dayFontFamily, 
     font_size=dayFontSize,
     text_anchor="start" )
  dayLineGroup = dwg.g(stroke_width=dayLineStrokeWidth, fill='none')
  weekLineGroup = dwg.g(stroke_width=weekLineStrokeWidth, fill='none')
  mounthLineGroup = dwg.g(stroke_width=mounthLineStrokeWidth, fill='none')
  seasonLineGroup = dwg.g(stroke_width=seasonLineStrokeWidth, fill='none')
  weekendGroup = dwg.g(stroke_width=weekendStrokeWidth, fill='none')
  #=======================================
  # Drawing in defined groups
  #=======================================
  for index, angle in enumerate(frange(0,math.pi*2,dayAngle)):
    # interpolation will help us to find
    # all necessary segments for every segment of circles
    colorTuple = (int(numpy.interp(angle, rainbowGradientPoints, 
            rainbowGradient[0])), 
           int(numpy.interp(angle, rainbowGradientPoints, 
           rainbowGradient[1])), 
           int(numpy.interp(angle, rainbowGradientPoints, 
           rainbowGradient[2])))
    color = "rgb%s"%(str(colorTuple))
    sinus =   math.sin(angle)
    cosinus = math.cos(angle)
    # Draw a week segment
    if (index-5)%7 == 0:
      weekLineGroup.add (dwg.line( (mid[0]-R_weeks_beg*sinus, 
         mid[1]+R_weeks_beg*cosinus), 
         (mid[0]-R_days_beg *sinus,mid[1]+R_days_beg *cosinus), 
         stroke=color) )
      # Draw a weekend
      sinus_weekend   = math.sin(angle-dayAngle)
      cosinus_weekend = math.cos(angle-dayAngle)
      weekendGroup.add (dwg.line( (mid[0]-R_days_beg*sinus_weekend, 
         mid[1]+R_days_beg*cosinus_weekend), 
         (mid[0]-R_weekend_end *sinus_weekend,mid[1]+R_weekend_end *
         cosinus_weekend), 
         stroke=color) )
    #if (index-)
      weekLineGroup.add (dwg.line( (mid[0]-R_weeks_beg*sinus, 
              mid[1]+R_weeks_beg*cosinus), 
         (mid[0]-R_days_beg *sinus,mid[1]+R_days_beg *cosinus), 
         stroke=color) )
    # Draw a mounth+season segments
    if allFirstDates[index]!=0:
      mounthLineGroup.add (dwg.line( (mid[0]-R_mounthes_beg*sinus,mid[1]+
              R_mounthes_beg*cosinus), 
         (mid[0]-R_weeks_beg *sinus,mid[1]+R_weeks_beg*cosinus), 
         stroke=color) )
      # Draw a season segments
      if allFirstDates[index]==2:
        seasonLineGroup.add (dwg.line( (mid[0]-R_seasons_beg*sinus,mid[1]+
                R_seasons_beg*cosinus), 
           (mid[0]-R_mounthes_beg *sinus,mid[1]+R_mounthes_beg*cosinus), 
           stroke=color) )
    # Draw a day segments
    dayLineGroup.add (dwg.line( (mid[0]-R_days_beg*sinus,mid[1]+
            R_days_beg*cosinus), 
       (mid[0]-R_days_end *sinus,mid[1]+R_days_end *cosinus), 
       stroke=color
       ) )
    # Draw a day name
    if (index-4)%7 == 0 or (index-3)%7 == 0:
        fillColor = color #"rgb(255,255,255)"
        #fontWeight = "bold"
        weekendMargin = 2.0
    else:
        fillColor = "rgb(0,0,0)"
        #fontWeight = "normal"
        weekendMargin = 0
    wordGroup = dwg.g(transform="rotate(%f, %f, %f) translate(%f,0)" 
            %( math.degrees(angle+dayAngle+textAngleShift)+90, 
            mid[0], mid[1], +R_dates+weekendMargin ) 
            )
    wordGroup.add( dwg.text( '%s'%(yearDays[index]), 
            insert=mid, fill=fillColor 
            #,style="font-weight: %s;"%(fontWeight)
            ))
    textGroup.add(wordGroup)
    #=======================================
    # Dray a circle segments
    #=======================================
    sinus_end =   math.sin(angle+dayAngle)
    cosinus_end = math.cos(angle+dayAngle)
    dayLineGroup.add( dwg.line( (mid[0]-R_days_beg*sinus,  
            mid[1]+R_days_beg*cosinus), 
      (mid[0]-R_days_beg*sinus_end,mid[1]+R_days_beg*cosinus_end), 
      stroke=color ) )
    weekLineGroup.add( dwg.line((mid[0]-R_weeks_beg*sinus,    
            mid[1]+R_weeks_beg*cosinus), 
      (mid[0]-R_weeks_beg*sinus_end,mid[1]+R_weeks_beg*cosinus_end), 
      stroke=color ) )
    mounthLineGroup.add( dwg.line((mid[0]-R_mounthes_beg*sinus,   
            mid[1]+R_mounthes_beg*cosinus), 
      (mid[0]-R_mounthes_beg*sinus_end,mid[1]+R_mounthes_beg*cosinus_end), 
      stroke=color ) )
    seasonLineGroup.add( dwg.line((mid[0]-R_seasons_beg*sinus,    
            mid[1]+R_seasons_beg*cosinus), 
      (mid[0]-R_seasons_beg*sinus_end,mid[1]+R_seasons_beg*cosinus_end), 
      stroke=color ) )
  #=======================================
  # Simple circles for quick testing
  #=======================================
  #dayLineGroup.add( dwg.circle(center=mid, r=R_days_end, stroke='black' ) )
  #dayLineGroup.add( dwg.circle(center=mid, r=R_days_beg, stroke='black' ) )
  #weekLineGroup.add( dwg.circle(center=mid, r=R_weeks_beg, stroke='black' ) )
  #mounthLineGroup.add( dwg.circle(center=mid, r=R_mounthes_beg, stroke='black' ) )
  #seasonLineGroup.add( dwg.circle(center=mid, r=R_seasons_beg, stroke='black') )
  dwg.add(dayLineGroup)
  dwg.add(weekLineGroup)
  dwg.add(mounthLineGroup)
  dwg.add(seasonLineGroup)
  dwg.add(weekendGroup)
  dwg.add(textGroup)
  # As I didn't learn how to set document width and height, just draw a rect
  dwg.add(dwg.rect((0, 0), canvasSize, stroke='gray', fill="none"))
  dwg.add(dwg.text("2014", insert=(mid[0],mid[1]+4), 
          text_anchor="middle", font_family="PT Serif", font_size="10pt"))
  #=======================================
  # Finaly, draw it!
  #=======================================
  dwg.save()

На выходе получаем такой вот SVG файл, который остаётся слегка доработать напильником в Иллюстраторе. А именно, увеличить документ до размеров А1, поправить кернинг числа 2014, увеличить апроши в мелких надписях, добавить внизу подпись.

Оп-ля! Круглендарь готов. Делаем группу в контакте для получения обратной связи, пишем ридми для Гитхаба и статью на Хабр.

Всем спасибо за внимание, буду рад вашим комментариям.

Как вы представляете себе год?
Круг, Новый Год сверху
Круг, Новый Год снизу
Круг, Новый Год справа
Круг, Новый Год слева
Спираль, Новый Год сверху
Спираль, Новый Год снизу
Спираль, Новый Год справа
Спираль, Новый Год слева
Другое (напишу в комментариях)

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Проголосовало 178 человек. Воздержался 31 человек.

В какую сторону идум месяцы?
По часовой стрелке
Против часовой стрелки

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Проголосовало 93 человека. Воздержалось 10 человек.

Источник: http://habrahabr.ru/post/209550/


Другие новости по теме:


Новости по теме

7 декабря 2014 г., 2:04:24

Компания TAG Heuer, известная своими элитными наручными часами, все-таки решилась на выпуск полноценных смарт-часов под своим бредом, и представит она их уже в январе, вероятнее всего, на CES 2015. Эта выставка пройдет в первых числах следующего...

7 декабря 2014 г., 1:52:30

Пока Google планомерно наращивает функциональность приложения Google Maps, компания из Купертино занимается доведением до ума собственного картографического сервиса, вызвавшего массу нареканий и даже заставившего главу Apple Тима Кука публично...

7 декабря 2014 г., 1:33:42

XOLO выпустила два доступных смартфона из серии Omega. Компания XOLO запускает в индийскую розницу два новых бюджетных смартфона — Omega 5.0 и Omega 5.5. Сайт Zauba.com, который следит за индийским импортом и экспортом, уже не раз раскрывал...

7 декабря 2014 г., 1:25:35

Китайские компании, научившиеся делать качественные смартфоны, все никак не забудут, что еще несколько лет назад они промышляли кражей дизайна мобильников у крупных компаний. Привычка — вторая натура, вот и компания ZTE не смогла справиться с ней...

7 декабря 2014 г., 1:24:39

Компания TAG Heuer, известная своими элитными наручными часами, все-таки решилась на выпуск полноценных смарт-часов под своим бредом, и представит она их уже в январе, вероятнее всего, на CES 2015. Эта выставка пройдет в первых числах следующего...

6 декабря 2014 г., 20:19:07

4 ГБ RAM и Snapdragon 810 в новом флагмане Motorola. Несколько недель назад Motorola представила на рынок Google Nexus 6. По всей вероятности, Motorola всерьёз намерена «завалить» рынок смартфонов топовыми устройствами. Похоже, что Motorola...

6 декабря 2014 г., 19:54:36

Некоторое время назад японская Sony объявила, что вся линейка ее «умных» телевизоров 2015 года выпуска с дисплеями форматов HD и 4K будет поставляться с предустановленной Android TV. Официальных подробностей по этому поводу мало, но интернет-ресурс...

6 декабря 2014 г., 19:06:55

teXet X4 представляет собой новое поколение устройств с точки зрения дизайна корпуса, он значительно тоньше (всего 7,6 мм) большинства моделей бюджетного сегмента. Корпус teXet X4 радует глаз лаконичным дизайном, плавностью линий, минимальными...

6 декабря 2014 г., 19:03:15

Некоторое время назад японская Sony объявила, что вся линейка ее «умных» телевизоров 2015 года выпуска с дисплеями форматов HD и 4K будет поставляться с предустановленной Android TV. Официальных подробностей по этому поводу мало, но интернет-ресурс...

6 декабря 2014 г., 7:01:07

Android 5.0 Lollipop - одно из самых жарких обновлений системы, поэтому владельцы многочисленных мобильных устройств уже с нетерпением ждут своих порций леденцов. Только вчера мы написали о начале распространения Android 5.0 для Galaxy S5, как...

6 декабря 2014 г., 7:01:02

Владельцы смартфонов HTC могут радоваться, первая партия обновлений Lollipop уже в пути. Как и было обещано, компания выпустила пакет последней версии Android для GPe-версий One (M8) и One (М7). Однако, похоже, что HTC дотянул устройства сразу...

6 декабря 2014 г., 6:30:04

Samsung всех нас удивил, когда начал выпускать обновление Android 5.0 Lollipop для Galaxy S5 в Польше. Теперь то же обновление появляется и на родине производителя – в Южной Корее, где операторы KT, SK Telecom и LG Uplus по OTA открыли доступ к новой...

6 декабря 2014 г., 6:04:12

Sony объявила, что в 2015 году вся линейка HD и 4K Smart TV обзаведётся поддержкой Android TV. Причём первые такие телевизоры выйдут уже в конце февраля будущего года. Что же нам предложит новая линейка? Android TV сможет похвастаться полной...

6 декабря 2014 г., 6:03:26

Meizu MX4 на базе Ubuntu Touch засветился на фото. Всё ближе и ближе наступает момент, когда смартфон Meizu MX4 на базе операционной платформы Ubuntu будет представлен широкой публике, правда фотографий изделия ещё никто не видел, но благодаря усилия...

6 декабря 2014 г., 5:56:19

Компаня JiaYu, покорившая многих россиян своим более чем удачным смартфоном G3, ведет разработку нового флагманского моноблока S3, фотографии которого сегодня попали в Глобальную Сеть. Очень важным фактом об этом смартфоне является то, что его...


Обзоры по теме

28 января 2015 г., 1:04:10 Google Nexus 6

9 User Rating: Be the first one! ...

27 января 2015 г., 22:53:41

10 User Rating: Be the first one!...

21 января 2015 г., 1:20:17 Asus Fonepad

Корпус и дисплей Процессор Android и программы Полутелефон Итог Из всех идей в компании Asus выбирают самые безумные. Сначала это был планшет-нетбук Transformer Pad. Затем матрешка из телефона внутри планшета Padfone. А теперь вот и Fonepad — на...

21 января 2015 г., 1:20:15 Prestigio MultiPad 7.0 Ultra+

Минусы Плюсы Итог Весной этого года Prestigio заняла третье место по продажам планшетов в России. Она обошла такого гиганта, как Asus, и уступила только Apple и Samsung. Asus может оправдывать свое поражение, чем угодно: сокращением объема поставок,...

21 января 2015 г., 1:16:31 Чуть больше музыки — Обзор HTC Desire 200. Рис.1

Корпус и дисплей Звук Производительность и операционная система Камера Заключение Бюджетные смартфоны тайваньской компании HTC всегда оставались в тени своих больших и дорогих собратьев. Однако недавнее разделение всех своих аппаратов на две линейки...

21 января 2015 г., 1:16:23 Специально для тех, кто любит кино — Обзор 3Q Q-Pad RC0718C. Рис.1

Корпус Дисплей и звук Камера Производительность Операционная система Заключение Мы уже говорили о том, что сверхбюджетные планшеты представляют для многих из нас особый интерес. На этот раз нам на радар попался отечественный бренд 3Q, который выбра...

21 января 2015 г., 1:14:52 Алюминиевый корпус огибает аппарат по диаметру.

Корпус Дисплей Камера Программное обеспечение Процессор, связь и время работы Заключение Последние лет пятнадцать были для Sony не из легких. Сначала рынок музыкальных плееров, на котором Sony была лидером еще с восьмидесятых, взорвал iPod. Затем...

18 января 2015 г., 21:13:38 DROIDER

Отличные новости, друзья! Теперь Droider можно читать прямо с любимого устройства в удобном формате и в крутом Material Design. Сегодня мы с радостью представляем обзор неофициального клиента, который был любезно сделан студией Work in...

31 декабря 2014 г., 1:36:07 Новый год со смартфоном и планшетом

До Нового Года остался буквально денечек, а у некоторых всё ещё нет праздничного настроя, несмотря на наряженную ёлку и всеобщий ажиотаж. Но если праздничное дерево уже при параде, то чем хуже обожаемый смартфон? Редакция Droider считает, что ничем,...

30 декабря 2014 г., 2:17:42 galaxy-alpha

2014-й год показал, что если с технической точки зрения на рынке мобильных устройств все более-менее в порядке — девайсы становятся все мощнее, все функциональнее и вместе с тем изящнее, то с точки зрения смыслов, новых сценариев использования мы...


Инструкции по теме

4 февраля 2015 г., 14:45:28 классический представитель данного вида

Вступление Хотел бы поделиться опытом выбора и настройки медиацентра на базе Android'ных приставок. Сейчас их появилось очень много, все они чем-то отличаются, но в чем-то и похожи. Многие из моих знакомых, увидев у меня работающую систему, сознавались в том, что и сами о чем-то таком думали, но испугались...

3 февраля 2015 г., 15:13:02 OxygenOS OnePlus

Компания OnePlus за время своего недолгого существования успела отметиться не только удивительно низкой ценой на свое флагманское устройство, но и конфликтом интересов с Micromax. Китайский производитель не одобрил сотрудничества Cyanogen Inc. с индийской фирмой, после чего открыто заявил, что планирует...

3 февраля 2015 г., 15:12:52

Всем доброе утро! Сегодня понедельник, а значит самое время подвести итоги прошедшей недели. У нас вышло достаточно много интересных материалов: авторские статьи, обзоры, новости, появилась очень полезная и интересная рубрика про кастомные ядра андроид. Что касается новостей, то интересных было мало.Тем...

1 февраля 2015 г., 15:27:21 Тест AnTuTu Benchmark

Со времени написания прошлого обзора прошивок для Jiayu G2 ("Прошивка Jiayu G2 (обзор прошивок, инструкция по прошивке Jiayu G2)") прошло много времени.. И за это время появилось 2 отличных прошивки - посмотрим, что они из себя представляют. Android 4.2.2 для Jiayu G2 Долгожданный порт Android 2.2...

1 февраля 2015 г., 15:24:51 FAQ для владельцев Мини-PC

Я являюсь счастливым обладателем Мини-PC MK809 III, и поначалу вопросов по его эксплуатации возникало огромное количество: как обновить прошивку, чем управлять, как подключать периферийные устройства, какие приложения поставить и т.д. В данной статье я постараюсь описать наколенный опыт, чтобы им могли...

1 февраля 2015 г., 0:45:00 Asus Eee Pad Transformer TF300

Asus Eee Pad Transformer TF300 Инструкция о том как прошить планшет трансформер Asus Eee Pad Transformer TF300 на новую прошивку. Установка официального обновления на Asus Eee Pad Transformer TF300 1. Узнайте территориальную принадлежность Вашего планшета (SKU). Зайдите в «Настройки» > «О планшетном...

31 января 2015 г., 14:51:16 [recovery mode] Motorola Moto G — для начинающих и экономных

После того, как компания Motorola была приобретена поисковым гигантом Google в 2011, новый владелец не оказывал никакого особо влияния на выпуск смартфонов. Но вскоре компания невероятно быстро и стремительно претерпела изменения. Первыми и весьма успешными продуктами обновленной Motorola стали Moto...

31 января 2015 г., 14:19:55

Все очень просто! 1. Берем устройство Nexus (4, 7, 10) 2. В меню Настройки/Приложения/Все находим приложение Google Services Framweork 3. Останавливаем его, стираем данные и очищаем кэш 4. Идем в Настройки/О телефоне/Обновление системы, видим Последнее обновление от 1970. тапаем Проверить сейчас и обновляемся. 5....

31 января 2015 г., 5:59:04 Получен root на свежевыпущенном Google Nexus S

Только было стартовали продажи новенького аппарата от Google-Samsung, как на нем был получен root и установлен альтернативный Recovery: (кликабельно) Если вы вдруг уже стали счастливым обладателем данного телефона, то вот вам инструкция по рутованию. От меня вольный её перевод: 1. Перезагружаемся в...

30 января 2015 г., 23:31:51 [recovery mode] Смартфон Just5 Spacer: 5 дюймов и 4 ядра за 4 950 рублей. Плюс две крышки в комплекте

Героем данного обзора является первый смартфон бренда кнопочных телефонов Just5 — Just5 Spacer. Одной из особенностей данного смартфона является то, что он работает на базе нового процессора от MediaTek — MT6582M, а также приятная цена — 4 950 рублей (150$). Вообще, к телефонам марки Just5 я отношусь...


Комментарии (0)


Чтобы оставить комментарий, отзыв или написать пост о вашей отрасли, следует войти или зарегистрироваться, если у вас еще нет аккаунта.