From 1b6648c8582ea230a37ceca56959afef108fd82d Mon Sep 17 00:00:00 2001 From: manetta Date: Mon, 23 Dec 2019 15:00:49 +0100 Subject: [PATCH] first commit :) --- asciiWriter/__init__.py | 2 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 155 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 187 bytes asciiWriter/__pycache__/marks.cpython-36.pyc | Bin 0 -> 1022 bytes asciiWriter/__pycache__/marks.cpython-37.pyc | Bin 0 -> 1054 bytes .../__pycache__/patterns.cpython-36.pyc | Bin 0 -> 2767 bytes .../__pycache__/patterns.cpython-37.pyc | Bin 0 -> 2799 bytes asciiWriter/__pycache__/utils.cpython-36.pyc | Bin 0 -> 2422 bytes asciiWriter/__pycache__/utils.cpython-37.pyc | Bin 0 -> 2454 bytes asciiWriter/asciiWriter.py | 5 ++ asciiWriter/draw.py | 49 +++++++++++++ asciiWriter/marks.py | 24 +++++++ asciiWriter/patterns.py | 67 ++++++++++++++++++ asciiWriter/utils.py | 52 ++++++++++++++ image.py | 30 ++++++++ image_random_char.py | 26 +++++++ image_rotate.py | 32 +++++++++ image_sentence.py | 31 ++++++++ images/blobs-small.png | Bin 0 -> 3309 bytes images/blobs.png | Bin 0 -> 9926 bytes images/shapes.png | Bin 0 -> 1643 bytes line.py | 28 ++++++++ line_random_char.py | 30 ++++++++ readme.md | 61 ++++++++++++++++ repeated_line.py | 39 ++++++++++ repeated_sinus.py | 36 ++++++++++ repeated_sinus_amplitude_variation.py | 37 ++++++++++ sinus.py | 27 +++++++ test.py | 37 ++++++++++ 29 files changed, 613 insertions(+) create mode 100644 asciiWriter/__init__.py create mode 100644 asciiWriter/__pycache__/__init__.cpython-36.pyc create mode 100644 asciiWriter/__pycache__/__init__.cpython-37.pyc create mode 100644 asciiWriter/__pycache__/marks.cpython-36.pyc create mode 100644 asciiWriter/__pycache__/marks.cpython-37.pyc create mode 100644 asciiWriter/__pycache__/patterns.cpython-36.pyc create mode 100644 asciiWriter/__pycache__/patterns.cpython-37.pyc create mode 100644 asciiWriter/__pycache__/utils.cpython-36.pyc create mode 100644 asciiWriter/__pycache__/utils.cpython-37.pyc create mode 100644 asciiWriter/asciiWriter.py create mode 100644 asciiWriter/draw.py create mode 100644 asciiWriter/marks.py create mode 100644 asciiWriter/patterns.py create mode 100644 asciiWriter/utils.py create mode 100644 image.py create mode 100644 image_random_char.py create mode 100644 image_rotate.py create mode 100644 image_sentence.py create mode 100644 images/blobs-small.png create mode 100644 images/blobs.png create mode 100644 images/shapes.png create mode 100644 line.py create mode 100644 line_random_char.py create mode 100644 readme.md create mode 100644 repeated_line.py create mode 100644 repeated_sinus.py create mode 100644 repeated_sinus_amplitude_variation.py create mode 100644 sinus.py create mode 100644 test.py diff --git a/asciiWriter/__init__.py b/asciiWriter/__init__.py new file mode 100644 index 0000000..63f77b6 --- /dev/null +++ b/asciiWriter/__init__.py @@ -0,0 +1,2 @@ +#!/usr/bin/env python3 + diff --git a/asciiWriter/__pycache__/__init__.cpython-36.pyc b/asciiWriter/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cade769d258949b0f5461ff5adc8cca5bc5150c8 GIT binary patch literal 155 zcmXr!<>e}{?2MIQU|@I*#Bjg}WH|tFF$<7LVF+f>Wb|9fPy`Z25WhV1GxBp&_0u!6 ziuGOclS^|`^Gb^K^NS1g%kzt}i!<^I^zu`Z^^6P*E%g(NlQT0RWOz|#NotXPe0*kJ bW=VX!UP0w84x8Nkl+v73JCF^g`kf=P`GaS}lKF^B^Lj6jA15Erumi4=xl22Do4l?+87VFd9jML#1yH&s73 zN#7+uximL5ucTN%J10M{B(*3rFFiF+zo00;B)_DxAhlS(ASW?1Pq!qsqC~$uzbLyn zBfmf|KPB17z|c}Zu{b$16GDa;Wde2U$H!;pWtPOp>lIYq;;_lhPbtkwwFBAy8HgDG DRDUw^ literal 0 HcmV?d00001 diff --git a/asciiWriter/__pycache__/marks.cpython-36.pyc b/asciiWriter/__pycache__/marks.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a0e7bda138142d5c94ff00f3cfc05c3e1cd3439 GIT binary patch literal 1022 zcma)4&2G~`5Z5uErA4!N`VrTiRzu|3Pu~0%$AxfGN z3FR$lPRduonr1=`RJay1PwlCQ|GpZlq1xw{K#e|#_~18tio!d5I;#}37RY64z#je`d&ZSa z^L=)(&;Dzf|^J-D-;^`bc;~aOfxC@6R?3@k}XWL7h zZs^GtO5d5cu9lsilb_I{`pT&oFB*ZT)`r-5BCBODL8!03e zqNFL2klqQ+Ncu8Z(NxHR3|C_6$sHN-*Ow!?EBE*$ki)kk-v7;L5mOsxbDd|Z6&WXT z!()picIH>8+wmS`vf(Nygio0l*=@He%C=wfF)jn#5#q^b=_YWok~X33z>- zCUae?r2Lq?(b=L@Rb!LWLRXD4d3B zPhTXd&GNjn?@i9=#3dQm=WQ@sR2h<4Fc5Tc-=vk)<@l)3Sz6fRF&rG7*fRrmF*`7T zFm1OH^1KZ@oYMk_f`-09owv*NkWU)1WCgzcQ#NRgm`*l;*5U_WY;ad>n3JI!@!_1Zr9*{S_UP#+M($hb<)Ho?-`(kZUZzNxqCe6 zuk*lirxe@ubU@EI;C3x;!_^XYpaaC&+$C1m^k`EGn4xE0!>em(TxZ|VaEIu&PBZnF zu@lRnq6ffrP3PA53&1=cxVCYBgcHvolylh%16nu2AC+1z3Uv%Zj>yp452Gjw{{VC; By2t?XGN|7|Rb?QYa&|;UBqJbgHA6Uo0)wGVwr=K<1)1ATiWgiX;(Y#L9W3%V=!ij()VC5528r6P zx6Q6Tl?xzi_?)1Lw0936s z5-|1`bH--PQ*^3tN%X6IIGE7-6){nWYNy7W{>HN-TIxJSA3D1#(Q<)P$iog7}&bL!7XP!b?ELB*UPq z%-R70E_a`My~;k-9w;5Bu^3FHIY50<+^#s^}MUJ)Qn)<9+&B@i*D!^BBx zI&lrx%Oj=CB%c2N(;wsDCH2n_ivW{&Vxz|!c+`pNi@!uNjR6vK&c0T0?`+!ZxYoJa z=&$Ebf5Y;}&U5&I@@ywGtU}TnlO@xR3K<#GRgx9JqT3fD z%4$l)K?f?7XFId-(w2$`zIT1BX}2G9oyaO#vc~>|P0%XpC^d%f95uN|$ zK#3_q-bTr*&2!>0;WI5j-7|%P8A|V@pmEdzcw^S?@{{e=L>xuvX literal 0 HcmV?d00001 diff --git a/asciiWriter/__pycache__/patterns.cpython-37.pyc b/asciiWriter/__pycache__/patterns.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8d5e4863cff4614374c8b133092523a434f4c8a GIT binary patch literal 2799 zcmb_e&2Jk;6rY*>@Y;1;H{WUa2wz2uzy<^dq$okqOHpN2>H*0@L|e}~-g>>Wn%&SO zT1%itvUBA|Psx!#g@0jAl{i%S7dY|WtQ|XX2&HALc{AgEGw<{FX1D-$=A@6?|^W^X-JxcGj1G_Cgmo#U}W6p1sDzP@FI*RU*KgvcSM^OU*r{j z6J|DF;~Mhx-mZweu(lbBmKP>lwYJvCrE(5<^*kr&KIM%0F@gyaLLFOHVEpe+ zFTgHTNIQKCCRe$BkX*nR;EXwSD>`a4W9J#nrR;eD74 zjg&lwR9GbI=!aJq$?yVfJe73WR%g6h=X0|(4KEk!%G=S5V_9vxu)!1z|Pq1JQfQ&e-2m zVRD%+0E)$dYe@`*yp7}yBhuU9YDE^ zr|5zVli2_oSn{q2ASB340O>0PP_BU3e+!^Q2urLB|KP5RD5?SDbfDIAKTaybY^Wq6 z?{#8Ty)5J7i4qk$Z^;ceuL$&3^0lpM1uOyYZGj7hs8^&Lc&b+6~``ikB^4=;up5w7ux3L@sZMBV{B5*z`U zP}AFN4Z^GcHz!Yxm#*xlDhDWeXY|~-k*`K?kT}@)!$cL+j`ZQ>5MD;vCa5*K@~X6| zuROhfI%am$cyRB&d>2@iDPlir7Fr@gASyEn4t-^Y!sD)`On7{Bswe~MG|A7p{z4RA3pUGI8SWlZ1x1-3;ivWmf#_d;gsNKId-X7D*g>^hWPXV literal 0 HcmV?d00001 diff --git a/asciiWriter/__pycache__/utils.cpython-36.pyc b/asciiWriter/__pycache__/utils.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e10c96d517911576ced5d31bc4315f9505cd966 GIT binary patch literal 2422 zcmc&$O-~y~7@nE^@Umb+(uxA5s6wq2SCLJihZb3=O4FVyE~$!S30a$+#a?^uH8bmA z==uZ_$+179e`&5g^)KYq_nqxQ1KOgLaK^1G(qi1^4vZFG;T7&((U#2@xDPuHU*t7nH8ELG%BkWj3?qv%A~a7K4;e`<8o zLDcBPJ=u7khT}mr%w!{#qsCb(`m&pj>M0NFyE{+6Zv--oW78jrIEzGMoW+T(kIvuv z%_Nptm<~n_)tgBg28ld?NpY++1$-P43_DSc2?R#b1hy82(OLT} z=2_RcTS1>at#@u<Ij&hRVJQ6J*wRWSp)6H5HBg_>&7wEONQ=?)L z=V(s3=7eU+GHej)(IvXd9?@00$;1QL3GpuRD_pyw)HS)LCyWDyt~?-2K_GkbYiz z5Q)ymd11gatPltQ7(;KAb00Cv2G-we007pM@WeyZZe2OZN6Crl^;aD`e28;WN^8doAXd83zBun#W9AV6Czrs;jG0iZ@HUkPMKgIBgneZX0?}8_%On`~ zg^mx&dxx6yd{fS=SjHJXA`#24u>3zElh=-oiSfZccMp#~JsPquRcWf&@A zMtYRf9^q^0Y=KW3)E|5Rm3xwkL69lCm&QZD5aUrc zf_K;D#gT}InaPq}I3@M7L47K)HXj0mu_V+yWyy1?ZRppE8&8JI8c8O>Nz>IZ?et6!)r}0; zb1+N7depxFkN!)2_2j>>Cx5SMni-JYHD0zRT_2BnU-f?PJ$7ejeTMP-FYJdEhq1rt zPz?*4ukdBNm?V=tVO`$joJk?AOV$+9mJU`+&dZwgE_u_IQ_=^;k<)Spt1D;a9M+nA z@Ql?T{tY>-&PzATWqO*2oX!|ftUpqiDNH#l*mM4?UL{|`e#o!b5!Z^noEQ8#e@av_ z*v+}QO_YPpp*477D1}9Qnz}f&3r6R{#wYY_ZL^cTeRlH2J}5BG-cw}GjZI=?(>r9- zDyC!Dbg(ew^bnV@>;g(vQ@!Y{br#FKZCt65Kc1F5RU$%(D{XluU;VgNJa_}fllKW!00<)`F*1JI`Y9(?GfRQs$ zGD0Sb6}@KZp=c(DLD(tnZlF4)bC?9Zj?(@Sc<(@SoNuM`Q=G*)HJFU#>bfNelWRiJ z!~PFHjc1jg#%trJ3r{EgM9nJP|Kg`2^s6PBmT97BOn9ejGNshG*qDr)*WR_-sfsVq z#)9NAF8$ll4?w+D52-}!fYSZJTES3;Q4w=?%_YAUQe0aF|3m*cJ8}1!q!3wq7uL^1 zUngB-)|>IrMwX2yfb(^)1i${C@!d CVBD(! literal 0 HcmV?d00001 diff --git a/asciiWriter/asciiWriter.py b/asciiWriter/asciiWriter.py new file mode 100644 index 0000000..917c502 --- /dev/null +++ b/asciiWriter/asciiWriter.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python3 + +import utils +import patterns +import marks \ No newline at end of file diff --git a/asciiWriter/draw.py b/asciiWriter/draw.py new file mode 100644 index 0000000..5dee52e --- /dev/null +++ b/asciiWriter/draw.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +from utils import make_lines, merge, print_lines, rotate, visit, visit_horizontal +from patterns import diagonal, horizontal, vertical, sinus_horizontal, sinus_vertical, image +from marks import random_mark, sequence_mark, space +from random import choice, random +import math + + + + +# marks = ['┼', '│', '░', '▓', 'X', '■', '≡', '·', '¦', ' '] +# blank = ' ' +width = 75 +height = 50 +mark = sequence_mark('O.P.E.N D.E.S.I.G.N C.O.U.R.S.E ') + + +layers = [] + +# layers.append(visit(make_lines(width, height), image('blobs-small.png'), mark, space(' '))) + +for offset in range(-50, 50, 15): + lines = [[] for l in range(height)] + sinus = sinus_vertical(period=50, amplitude=25, offset=offset, offset_t=random()) + layers.append(visit(make_lines(width, height), sinus, sequence_mark(' K A S K G E N T '), space())) + +for offset in range(-43, 57, 15): + lines = [[] for l in range(height)] + sinus = sinus_vertical(period=40, amplitude=10, offset=offset, offset_t=.5+random()) + layers.append(visit(make_lines(width, height), sinus, mark, space())) + +print_lines(merge(width, height, space()(), layers)) + +# for line in overlay(50, 50, ' ', [rotate(merged), merged]): +# stdout.write('{}\n'.format(''.join(line))) + +# sinus = sinus_horizontal(period=30, amplitude=8) +# for x in range(width): +# for y in range(height): +# lines[y].append(sinus(x, y, width, height, mark, space())) + +# for line in lines: +# stdout.write('{}\n'.format(''.join(line))) + +# lines = [[draw(x, y, marks) for x in range(width)] for y in range(height)] + +# sys.sdout.write('\n'.join([''.join(line) for line in lines])) + +# sys.sdout.write('\n'.join([''.join([draw(x, y, marks) for x in range(width)]) for y in range(height)])) diff --git a/asciiWriter/marks.py b/asciiWriter/marks.py new file mode 100644 index 0000000..7610339 --- /dev/null +++ b/asciiWriter/marks.py @@ -0,0 +1,24 @@ +from random import choice + +def random (marks=['']): + def func (): + return choice(marks) + + return func + +def sentence (text): + chars = list(text) + def f(): + char = chars.pop(0) + chars.append(char) + return char + return f + +def single (char): + def f(): + return char + + return f + +def space (space=' '): + return single(space) diff --git a/asciiWriter/patterns.py b/asciiWriter/patterns.py new file mode 100644 index 0000000..2c7a817 --- /dev/null +++ b/asciiWriter/patterns.py @@ -0,0 +1,67 @@ +import math + +# # Linear +def diagonal(): + def f (x, y, width, height, mark, blank): + if x == math.floor((y / float(height)) * width): + return mark() + else: + return blank() + + return f + +# Cross +def cross (): + def f (x, y, width, height, mark, blank): + pos = math.floor((y / float(height)) * width) + + if x == pos or (width - 1) - pos == x: + return mark() + else: + return blank() + return f + +def horizontal (position): + def f (x, y, width, height, mark, blank): + return mark() if position == y else blank() + return f + +def vertical (position): + def f (x, y, width, height, mark, blank): + return mark() if position == x else blank() + return f + +# Sinus +def sinus_vertical (period=0.2, amplitude=0.5, offset_t=0, offset=0): + period = (period / (math.pi * 2)) + + def f (x, y, width, height, mark, blank): + middle = (width - 1) * .5 + to_mark = math.floor(middle + math.sin(offset_t + y / period) * amplitude) + return mark() if (x + offset) == to_mark else blank() + return f + +def sinus_horizontal (period=0.2, amplitude=0.5, offset_t=0, offset=0): + period = (period / (math.pi * 2)) + def f (x, y, width, height, mark, blank): + middle = (height - 1) * .5 + to_mark = math.floor(middle + math.sin(offset_t + x / period) * amplitude) + return mark() if y + offset == to_mark else blank() + + return f + +def image (path, threshold=128): + from PIL import Image + + im = Image.open(path).convert('L') + image_width, image_height = im.size + pixels = im.load() + + def f (x, y, width, height, mark, blank): + if x < image_width and y < image_height: + if pixels[x, y] < threshold: + return mark() + + return blank() + + return f diff --git a/asciiWriter/utils.py b/asciiWriter/utils.py new file mode 100644 index 0000000..352db33 --- /dev/null +++ b/asciiWriter/utils.py @@ -0,0 +1,52 @@ +from sys import stdout + +def rotate(layer): + new_width = len(layer) + new_height = len(layer[0]) + rotated = [['' for x in range(new_width)] for l in range(new_height)] + + for y in range(len(layer)): + for x in range(len(layer[y])): + rotated[x][y] = layer[y][x] + + return rotated + +def merge(width, height, space_char, layers): + output = [[space_char for x in range(width)] for y in range(height)] + + for layer in layers: + for y in range(height): + for x in range(width): + if layer[y][x] != space_char: + output[y][x] = layer[y][x] + + return output + +# Make a multidimensional array +# with the given dimensions +def make_lines (width, height, fill_char = ''): + return [[ fill_char for _ in range(width) ] for __ in range(height)] + +def visit (lines, callback, mark, blank): + height = len(lines) + width = len(lines[0]) + + for y in range(height): + for x in range(width): + lines[y][x] = callback(x, y, width, height, mark, blank) + + return lines + +def visit_horizontal (lines, callback, mark, blank): + height = len(lines) + width = len(lines[0]) + + for x in range(width): + for y in range(height): + lines[y][x] = callback(x, y, width, height, mark, blank) + + return lines + +def print_lines (lines): + for line in lines: + stdout.write('{}\n'.format(''.join(line))) \ No newline at end of file diff --git a/image.py b/image.py new file mode 100644 index 0000000..5faa389 --- /dev/null +++ b/image.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 + +""" + Uses an image as a guide to draw either blanks or + mark chars. In this case with the char '+'. +""" + +from asciiWriter.patterns import image +from asciiWriter.utils import make_lines, visit, print_lines +from asciiWriter.marks import single, space + +width = 75 +height = 75 + +# Where to find the image +image_path = 'images/blobs-small.png' +# Construct the pattern +image_pattern = image(image_path) +# Set the marker, in this case the character '+' +mark = single('+') +# Define what to use on a blank space, as a variation you could use: single('*') +blank = space() + +# Make a canvas +lines = make_lines(width, height) +# Draw the picture +result = visit(lines, image_pattern, mark, blank) + +# Print the result +print_lines(result) \ No newline at end of file diff --git a/image_random_char.py b/image_random_char.py new file mode 100644 index 0000000..cdb037c --- /dev/null +++ b/image_random_char.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 + +from asciiWriter.patterns import image +from asciiWriter.utils import make_lines, visit, print_lines +from asciiWriter.marks import random, single + +width = 75 +height = 75 + +# Where to find the image +image_path = 'images/blobs-small.png' +# Construct the pattern +image_pattern = image(image_path) +# Set the marker, in this case it makes a random selection from +# the list: +, *, $, #, , +mark = random(['+', '*', '$', '#', ' ', ' ']) +# Define what to use on a blank space, as a variation you coul use: single('*') +blank = single() + +# Make a canvas +lines = make_lines(width, height) +# Draw the picture +result = visit(lines, image_pattern, mark, blank) + +# Print the result +print_lines(result) \ No newline at end of file diff --git a/image_rotate.py b/image_rotate.py new file mode 100644 index 0000000..bdedc52 --- /dev/null +++ b/image_rotate.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 + +""" + Same as image_sentence.py, but rotates the result. + Uses an image to define where to put chars. + In this case with the sentence/word ASCII +""" + +from asciiWriter.patterns import image +from asciiWriter.utils import make_lines, visit, print_lines, rotate +from asciiWriter.marks import sentence, single + +width = 75 +height = 75 + +# Where to find the image +image_path = 'images/blobs-small.png' +# Construct the pattern +image_pattern = image(image_path) +# Set the marker, in this case a sentence +mark = sentence('ASCII ') +# Define what to use on a blank space, as a variation you coul use: single('*') +blank = single(' ') + +# Make a canvas +lines = make_lines(width, height) +# Draw the picture +result = visit(lines, image_pattern, mark, blank) +# Rotate the canvas +result = rotate(result) +# Print the result +print_lines(result) \ No newline at end of file diff --git a/image_sentence.py b/image_sentence.py new file mode 100644 index 0000000..b8245fd --- /dev/null +++ b/image_sentence.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 + +""" + Uses an image to define where to put chars. + In this case with the sentence/word ASCII +""" + +from asciiWriter.patterns import image +from asciiWriter.utils import make_lines, visit, print_lines +from asciiWriter.marks import sentence, space + +width = 75 +height = 75 + +# Where to find the image +image_path = 'images/blobs-small.png' +image_path = 'images/shapes.png' +# Construct the pattern +image_pattern = image(image_path) +# Set the marker, in this case a sentence +mark = sentence('U.R.S O.P.E.N. D.E.S.I.G.N C.O.') +# Define what to use on a blank space, as a variation you coul use: single('*') +blank = space() + +# Make a canvas +lines = make_lines(width, height) +# Draw the picture +result = visit(lines, image_pattern, mark, blank) + +# Print the result +print_lines(result) \ No newline at end of file diff --git a/images/blobs-small.png b/images/blobs-small.png new file mode 100644 index 0000000000000000000000000000000000000000..dfeae83598e3207fd8e4739312218fdb3df7539a GIT binary patch literal 3309 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 literal 0 HcmV?d00001 diff --git a/images/blobs.png b/images/blobs.png new file mode 100644 index 0000000000000000000000000000000000000000..24820be327530eabda7056fd3384380ac3bba212 GIT binary patch literal 9926 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 literal 0 HcmV?d00001 diff --git a/images/shapes.png b/images/shapes.png new file mode 100644 index 0000000000000000000000000000000000000000..abb7a78735abe71e7a992760917c12e49b91cef2 GIT binary patch literal 1643 zcmb7FdpOf;9A9NDmu9mPmC3{O9HnIxG31cVC233UHVYZqTr%cT3AL4bv{<<`>RF=9 zl-m@!bWE<9yAwxYjSv+co!|NE{Cm##`F`K;`+nc|`M%Hl`F@`F%Q}0;UPVz;5d;FM z;BmI+08aqy3Pc_ljqJw_04En|gC{}&iHBUg1*~_{aUPK%&^GozwheO+?G6MrqU_wG z2(-W`200=C#9%NCgTq21DP($pAuS@PV8KEY1Om_EZBG$nxU#Vj93lbHzJ#fe2IjGe zq|0ERth1^-b+WcC;xHI|L{oGK4L=3RWkVd2+30E|SPH`DHH4+8q%2o&jo1g%L#1lE z>+G>RU7NNN=X+S~-J=@wxWFxQrs(U{IWZUd^vl@5Er{-myS#N!86oK%hh&7}+}Vku z{O{=}rZ_2SdtJ0l^Jl!}hnqIGSvOU^YnPXo(H0iUpi4AbJJ&3dh|FOk3_@1tKm7PM zr?$1w`^X;W;-W5gA7t+~K%>#uSj?pqqyLN3;MBV zViR(4vZ)Z>S1u5!DXAMG#H_(2uu{+Pu*PoQa6M!3dCZdko6WecLMtR~qJg!uue`Dn z+IjD&x|5DgU?9q-I8zTN$Us{8cjcR4_F=Ht1KovI8A^Sjbh>J6Y%E4Ca_!6T?CdP* zy79*HjM89*kGTL%AP{;dCf+LsudPZilzY7l3nZ2Cctt|thdnq!Ru(LD=sB55VK(}X zHO5KYZ~~-NBB{U3xnHe+da0v|HW}4i1j_@wIp!>P4KZODCZ@Lsu~gmdJ&%+D9YQKcal> z@pxA5Pj0I&+gpPg9PE1eI60MER9-Hg4}DL8+r4kE^ljvign0wOh6am=wF9L5B4=l3 zzRE8mfuOeNG>>NKeE$5{rO-`w>xKd}Li}h?zZ~|;{9U7tmYdMXt`e<&Z-rg^>HDih zqKA?4tGD>p6tntpJru0Cq-1+4c}OvKuCLU+yMCO7w;d7$LEGBeLa#T(|1`?Z&i-N= zwo1==20VG{`{HDI<_X$Fa{KfPDMtqGHCEBn)62VBn)F7y`6F8CqNAfyc216rEAbVt zuQNffSEZ68P&h>HD}eSZZGcwL!tNkxd5yo8Rbu>@byru{S7u{g&3Pg*8QAnn3JnQq zDfbY3Nv(zoDk{R7-z<#R2gN=I(oB!Oq#ZkDnYg(Z0P~FX$PEu4AMDIEsFsB_mC7%@ ztd2nZ30&fO$}(YnU{2x@b7HUT87n<~m-vCXq|b7BW#yQ$vGL4WAvUgT%4Cly4Jdo- zw}6dzIr<$P9nY&Pxm+&Z&o6d$K9?`K5OcgbL}KXZSM_^w=8VM2?U`o^6lr;9bV4er zJl|N;d_zN7zF5i>X9m(HMRw8AHKhqhed-WcEEaTaVIiz@6b}*0MqdiJrBPR|yjlG2 zbyB`*GGlPi?XYJxPVZtor{DywtjG_p`H;0B}YX%}$=`WwM)7RLYp literal 0 HcmV?d00001 diff --git a/line.py b/line.py new file mode 100644 index 0000000..2d7669e --- /dev/null +++ b/line.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 + +""" + Draws a single, vertical line +""" + +from asciiWriter.patterns import vertical +from asciiWriter.utils import make_lines, visit, print_lines +from asciiWriter.marks import sentence, space + +# Set the canvas +width = 75 +height = 75 + +# Define the line, most importantly it's position +pattern = vertical(20) +# We're going to fill the line with a text +mark = sentence('OPEN DESIGN COURSE ') +# Set the character for the 'blank' space +blank = space() + +# Make a canvas +lines = make_lines(width, height) +# Draw the result +result = visit(lines, pattern, mark, blank) + +# Print the result +print_lines(result) \ No newline at end of file diff --git a/line_random_char.py b/line_random_char.py new file mode 100644 index 0000000..74d1679 --- /dev/null +++ b/line_random_char.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 + +""" + Draws a single just like line.py but does so + using a 'random' character +""" + +from asciiWriter.patterns import vertical +from asciiWriter.utils import make_lines, visit, print_lines +from asciiWriter.marks import random, space + +# Set the canvas +width = 75 +height = 75 + +# Define the line, most importantly it's position +image_pattern = vertical(20) +# We're going to fill the line with random selections +# from the '%$&@!*' chars +mark = random('%$&@!*') +# Set the character for the 'blank' space +blank = space() + +# Make a canvas +lines = make_lines(width, height) +# Draw the result +result = visit(lines, image_pattern, mark, blank) + +# Print the result +print_lines(result) \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..202bcfc --- /dev/null +++ b/readme.md @@ -0,0 +1,61 @@ +# ASCII-ART-BUT-WITH-UNICODE + +
+---------H---------H---------H---------H---------H---------H---------H---------H---------H---------H
+-------------------e------e-------e------e-------e-------e------e-------e------e-------e------------
+----------------------------l----l-----l----l----l----l----l-----l----l----l------------------------
+------------------------------------l---l--l--l--l--l--l--l---l--l----------------------------------
+-------------------------------------------oo-oo-o-oo-oo-o------------------------------------------
+-----------------------------------------------     ------------------------------------------------
+-------------------------------------------------W--------------------------------------------------
+------------------------------------------------ooo-------------------------------------------------
+---------------------------------------------rrrrrrrrrr---------------------------------------------
+----------------------------------------l-l-l--l-l-l--l-l-l-l---------------------------------------
+---------------------------------d---d---d---d---d---d---d---d---d----d-----------------------------
+------------------------!-----!-----!------!-----!-----!------!-----!-----!------!------------------
+-------------- -------- -------- ------- -------- -------- ------- -------- -------- -------- ------
+----H----------H----------H-----------H----------H----------H-----------H----------H----------H-----
+--------e-------------e------------e-------------e-------------e------------e-------------e---------
+-l---------------l---------------l---------------l---------------l---------------l---------------l--
+--------------l----------------l-----------------l-----------------l----------------l---------------
+-----------o------------------o------------------o------------------o------------------o------------
+--------- ------------------- ------------------- ------------------- ------------------- ----------
+---------W-------------------W-------------------W-------------------W-------------------W----------
+----------o------------------o-------------------o-------------------o------------------o-----------
+------------r------------------r-----------------r-----------------r------------------r-------------
+---------------l----------------l----------------l----------------l----------------l----------------
+-----l-------------d--------------d--------------d--------------d--------------d-------------l------
+------------o-----------!------------!-----------!-----------!------------!-----------o------------e
+---------e--------- --------- --------- --------- --------- --------- --------- ---------l---------H
+-------------------l------W-------H------H-------H-------H------H-------W------l-------e------------
+----------------------------l----o-----e----e----e----e----e-----o----o----l------------------------
+------------------------------------o---r--l--l--l--l--l--r--- --l----------------------------------
+------------------------------------------- l-ll-l-ll-lW-o------------------------------------------
+-----------------------------------------------Wdooo------------------------------------------------
+-------------------------------------------------o--------------------------------------------------
+------------------------------------------------rW -------------------------------------------------
+---------------------------------------------lHoooooHdr---------------------------------------------
+----------------------------------------d-e-r--r-r-r--r-e-!-l---------------------------------------
+---------------------------------!---l---l---l---l---l---l---l--- ----d-----------------------------
+------------------------ -----l-----d------d-----d-----d------d-----l-----H------!------------------
+--------------H--------o--------!-------!--------!--------!-------!--------o--------e-------- ------
+----e---------- ---------- ----------- ---------- ---------- ----------- ---------- ----------l-----
+--------W-------------H------------H-------------H-------------H------------H-------------W---------
+-o---------------e---------------e---------------e---------------e---------------e---------------o--
+--------------l----------------l-----------------l-----------------l----------------l---------------
+-----------l------------------l------------------l------------------l------------------l------------
+---------o-------------------o-------------------o-------------------o-------------------o----------
+--------- ------------------- ------------------- ------------------- ------------------- ----------
+----------W------------------W-------------------W-------------------W------------------W-----------
+------------o------------------o-----------------o-----------------o------------------o-------------
+---------------r----------------r----------------r----------------r----------------r----------------
+-----r-------------l--------------l--------------l--------------l--------------l-------------r------
+------------l-----------d------------d-----------d-----------d------------d-----------l------------l
+
+ +Work in progress :) + +# Requirements + +* pillow + diff --git a/repeated_line.py b/repeated_line.py new file mode 100644 index 0000000..acee358 --- /dev/null +++ b/repeated_line.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +""" + Draws lines like line.py, but draws more than one +""" + +from asciiWriter.patterns import vertical +from asciiWriter.utils import make_lines, visit, print_lines, merge +from asciiWriter.marks import sentence, space + +# Set the canvas +width = 75 +height = 75 + +# We are going to draw multiple lines and collect them +# in a list named 'layers' +layers = [] + +# Set the position of the line, do this in a loop +# from 10 to 75 in steps of then +for x in range(10, 75, 10): + # Define the line, x will start at 10 and grow in steps of 10 + image_pattern = vertical(x) + # Fill the line with the sentence 'OPEN DESIGN COURSE ' + mark = sentence('OPEN DESIGN COURSE ') + # Set the blank space + blank = space() + + # Make a canvas + lines = make_lines(width, height) + # Make a layer with the line + layer = visit(lines, image_pattern, mark, blank) + # Add the layer to the list of layers + layers.append(layer) + +# Merge the list of layers into a single layer +result = merge(width, height, blank(), layers) +# Print the result +print_lines(result) \ No newline at end of file diff --git a/repeated_sinus.py b/repeated_sinus.py new file mode 100644 index 0000000..0efbf73 --- /dev/null +++ b/repeated_sinus.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 + +from asciiWriter.patterns import sinus_vertical +from asciiWriter.utils import make_lines, visit, print_lines, merge +from asciiWriter.marks import sentence, space + +# Define width and height of the output +width = 75 +height = 75 + +# As we draw multiple sinoids we will collect +# them in a list of layers +layers = [] + +# Loop through an offset from -40 to 40 in steps of 10 +for x in range(-40, 40, 10): + # Set the pattern with the changing offset + pattern = sinus_vertical(period=40, amplitude=30, offset=x) + # We use a sentence to draw the text + mark = sentence('OPEN DESIGN COURSE ') + # Define a blank character + blank = space() + + # Make the canvas + lines = make_lines(width, height) + + # Draw the sinoid, but add it to the list + result = visit(lines, pattern, mark, blank) + # Add it the result to the list of layers + layers.append(result) + +# Merge the layers into one layer again +merged = merge(width, height, blank(), layers) + +# Print the result +print_lines(merged) diff --git a/repeated_sinus_amplitude_variation.py b/repeated_sinus_amplitude_variation.py new file mode 100644 index 0000000..4acb8a2 --- /dev/null +++ b/repeated_sinus_amplitude_variation.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 + +from asciiWriter.patterns import sinus_vertical +from asciiWriter.utils import make_lines, visit, print_lines, merge +from asciiWriter.marks import sentence, space + +import random + +# Define width and height of the output +width = 75 +height = 75 + +# As we draw multiple sinoids we will collect +# them in a list of layers +layers = [] + +# Loop through an amplitude of -50 to 50 in steps of 10 +for amplitude in range(-50, 50, 10): + # Set the pattern with the changing amplitude + pattern = sinus_vertical(period=40, amplitude=amplitude) + # We use a sentence to draw the text + mark = sentence('OPEN DESIGN COURSE ') + # Define a blank character + blank = space() + + # Make the canvas + lines = make_lines(width, height) + # Draw the sinoid, but add it to the list + result = visit(lines, pattern, mark, blank) + # Add it the result to the list of layers + layers.append(result) + +# Merge the layers into one layer again +merged = merge(width, height, blank(), layers) + +# Print the result +print_lines(merged) diff --git a/sinus.py b/sinus.py new file mode 100644 index 0000000..8d21ffc --- /dev/null +++ b/sinus.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +from asciiWriter.patterns import sinus_vertical +from asciiWriter.utils import make_lines, visit, print_lines +from asciiWriter.marks import sentence, space, single + +# Define width and height of the output +width = 75 +height = 75 + +# Set the pattern we use to draw, in this case a +# sinoid, with period of 40 lines, and an amplitude +# of 30 characters. Slightly less than half our canvas width +pattern = sinus_vertical(period=40, amplitude=30) +# We use a sentence to draw the text +mark = sentence('OPEN DESIGN COURSE ') +# Define a blank character +blank = single(' ') + +# Make the canvas +lines = make_lines(width, height) + +# Draw the sinoid +result = visit(lines, pattern, mark, blank) + +# Output the result +print_lines(result) \ No newline at end of file diff --git a/test.py b/test.py new file mode 100644 index 0000000..178f110 --- /dev/null +++ b/test.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 + +from asciiWriter.patterns import sinus_vertical, cross +from asciiWriter.utils import make_lines, visit, print_lines, merge +from asciiWriter.marks import sentence, space, single + +# Define width and height of the output +width = 100 +height = 50 + +# As we draw multiple sinoids we will collect +# them in a list of layers +layers = [] + +# Loop through an offset from -40 to 40 in steps of 10 +for x in range(-50, 50, 10): + + # Set the pattern with the changing offset + pattern = cross() + # We use a sentence to draw the text + mark = sentence('Hello World! ') + # Define a blank character + blank = single('-') + + # Make the canvas + lines = make_lines(width, height) + + # Draw the sinoid, but add it to the list + result = visit(lines, pattern, mark, blank) + # Add it the result to the list of layers + layers.append(result) + +# Merge the layers into one layer again +merged = merge(width, height, blank(), layers) + +# Print the result +print_lines(merged)