2014 рдХреЗ рд▓рд┐рдП рдХреНрд░реВрдЧрд▓реЗрдВрдбрд░



рдирдорд╕реНрдХрд╛рд░ рджреЛрд╕реНрддреЛрдВ!
рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рдореИрдВрдиреЗ рд╕рд╛рд▓ рдХрд╛ рдкрд╣рд▓рд╛ рджреМрд░ рдХрд┐рдпрд╛ ред
рд╣рдо рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдПрдХ рдХреИрд▓реЗрдВрдбрд░ рдмрдирд╛рдирд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╡рд░реНрд╖ рдХреЗ рд╕рднреА рджрд┐рдиреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЕрддреАрдд рдХреЗ рд╕реБрдЦрдж рдХреНрд╖рдгреЛрдВ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреА рдЕрдкреЗрдХреНрд╖рд┐рдд рдШрдЯрдирд╛рдУрдВ рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИред
рдмрд╣реБрдд рд╕рд╛рд░реЗ рдПрдирд╛рд▓реЙрдЧ рд╣реИрдВ , рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЕрддрд┐рд╕реВрдХреНрд╖реНрдорд╡рд╛рдж рдФрд░ рд╢реВрдиреНрдпрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдорд╛рд▓рд┐рдХ рдХреА рд╕реНрдХреНрд░рд┐рдмрд▓реНрд╕ рдЕрдЧреНрд░рднреВрдорд┐ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

тАв Github рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ (рдпрд╛ git рдХреНрд▓реЛрди github.com/illus0r/kruglendar2014.git )
тАв рд╣рдо A1 рдкреНрд░рд╛рд░реВрдк рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВ
тАв рд╣рдо рджреАрд╡рд╛рд░ рдкрд░ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЬрдЧрд╣ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ - рд╢реМрдЪрд╛рд▓рдп рдореЗрдВ) рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВ, рдЕрдЧрд▓реЗ - рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд░ рдПрдХ рдорд╣рд╕реВрд╕-рдЯрд┐рдк рдкреЗрдиред
тАв рдХреНрдпрд╛ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд╣реБрдЖ? рд╣рдо рдкреНрд░рд╕рд┐рджреНрдз рджреМрд░ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ! рд╕рд╛рд▓ рдХреЗ рдЕрдВрдд рддрдХ рдЗрд╕реЗ рджреЗрдЦрдирд╛ рдЦреБрд╢реА рдХреА рдмрд╛рдд рд╣реЛрдЧреАред

рдХреНрд░рд┐рдПрдЯрд┐рд╡ рдХреЙрдордиреНрд╕ рд▓рд╛рдЗрд╕реЗрдВрд╕
рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдХреИрд▓реЗрдВрдбрд░ рдХреНрд░рд┐рдПрдЯрд┐рд╡ рдХреЙрдордиреНрд╕ рдПрдЯреНрд░реАрдмреНрдпреВрд╢рди 3.0 рдЕрдирдкреЛрд░реНрдЯреЗрдб рдХреЗ рддрд╣рдд рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдЖ рд╣реИ ред

рдирдпрд╛ рд╕рд╛рд▓ рдореБрдмрд╛рд░рдХ рд╣реЛ!

рдмрд┐рд▓реНрд▓реА рдХреЗ рддрд╣рдд, рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ред

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ


рдЗрд╕ рд╕рд╛рд▓, рдпрд╣ рд╕рдм рдПрдХ рд╕реНрдХреЗрдЪ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖред рдЙрдкрд╛рдзрд┐ рдореЗрдВ рдЪрдВрджреНрд░ рдХреИрд▓реЗрдВрдбрд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдлреИрдВрд╕реА рдФрд░ рднрдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЛрдЪрд╛ред рд▓реЗрдХрд┐рди рд╡рд╣ рдкрд╣рд▓реЗ рдиреНрдпреВрдирддрд░ рд╕реНрдХреЗрдЪ рдкрд░ рд▓реМрдЯ рдЖрдпрд╛ред



рдЕрд╕рд▓реА рдмрдореНрдорд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬреЛ рдХрд┐ рд╢реЗрд░ рдХреА рдиреМрдХрд░реА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдЖрдХрд╛рд░, рдореЛрдЯрд╛рдИ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдлреЛрдВрдЯ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ред

рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рд╣рд▓рдХреЛрдВ рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдФрд░ рдореЛрдЯрд╛рдИ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдЦрдж рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╡реЗ рдЬреНрдпрд╛рдорд┐рддреАрдп рдкреНрд░рдЧрддрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдереЗред

рдореИрдВрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдлреВрд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ред рдлрд╝реЛрдЯреЛрд╢реЙрдк рдореЗрдВ, рдореИрдВрдиреЗ рд░рдВрдЧ рдЪрдпрди рд╡рд┐рдВрдбреЛ рдЦреЛрд▓реА рдФрд░ рд▓реИрдм рдХрд▓рд░ рд╕реНрдХреАрдо рдХреЗ рд╕рдорд╛рди рд▓рд╛рдЗрдЯрдиреЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдореЛрдб рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ (рдпрд╣ рд░рдВрдЧ рдХреА рдорд╛рдирд╡ рдзрд╛рд░рдгрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ рдФрд░ рд░рдВрдЧ рдХреА рддреАрд╡реНрд░рддрд╛ рд╕рдорд╛рди рд╣реЛрдЧреА)ред



рдХрдИ рдмрд┐рдВрджреБ рд╣реИрдВ, рдмрд╛рдХреА рдХреЛ рдкреНрд░рдХреНрд╖реЗрдк рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЦреИрд░, рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдирд╣реАрдВ рдЪреБрдирд╛, рдФрд░ рдЖрдк рдЗрд▓рд╕реНрдЯреНрд░реЗрдЯрд░ рдореЗрдВ рдорд╛рд╕реНрдХ рдХреЗ рд╕рд╛рде рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдордЬреЗрджрд╛рд░ рд╣реИ!

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реА
# -*- 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() 


рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ, рд╣рдореЗрдВ рдРрд╕реА рдПрд╕рд╡реАрдЬреА рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓рддреА рд╣реИ, рдЬреЛ рдЗрд▓рд╕реНрдЯреНрд░реЗрдЯрд░ рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рд░рд╣рддреА рд╣реИред рдЕрд░реНрдерд╛рддреН, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдП 1 рдЖрдХрд╛рд░ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрдЦреНрдпрд╛ 2014 рдХреА рдЧреБрдард▓реА рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЫреЛрдЯреЗ рд╢рд┐рд▓рд╛рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЬреЛрдбрд╝реЗрдВред



рдУрд╣ рд▓рд╛! рдХреНрд░реВрдЧрд▓реЗрдВрдбрд░ рддреИрдпрд╛рд░ рд╣реИред рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд░реНрдХ рдореЗрдВ рдПрдХ рд╕рдореВрд╣ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЧреАрдереБрдм рдХреЗ рд▓рд┐рдП рдПрдХ рд░реАрдбрдореА рдФрд░ рд╣реИрдмрд░ рдкрд░ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрддреЗ рд╣реИрдВред

рдЖрдк рд╕рднреА рдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред

Source: https://habr.com/ru/post/In209550/


All Articles