Need help with code.

Pixilang programming language
martblek
Posts: 6
Joined: Fri Dec 09, 2016 9:42 pm

Need help with code.

Hi all,
I'm new in pixilang coding.
I start coding half an hour ago
I like Arduino, Polargraph, Pyrograph and other machines which converts my thoughts into the picture.
Now I found Pixilang for my coding.

Here's great tool for Processing lang which converts image to lines. ( Death to sharpie )
http://www.dullbits.com/drawbot/drawbot
I rewrite this source to python but is really slooow
now i trying to rewrite in Pixilang for speed comparsion but my skills are poor.
find someone who would help me with the program and explained my mistakes in program ?
thanks.

Code: Select all

``````
drawing_scale = 1.0
darkest_x = 0
darkest_y = 0
squiggle_count = 0
squiggle_length = 100
xoffset = 0
yoffset = 0
image_width = 800
image_height = 600

fn math_max(\$min, \$max)
{
if(\$min < \$max) {ret(\$max)}
if(\$min > \$max) {ret(\$min)}
if(\$min == \$max) {ret(\$max)}
}

fn math_min(\$min, \$max)
{
if(\$min < \$max) {ret(\$min)}
if(\$min > \$max) {ret(\$max)}
if(\$min == \$max) {ret(\$min)}
}

fn math_sqrt(\$val)
{
\$rsrt = \$val
\$div = \$val
if \$val <= 0 {ret}
while(1)
{
\$div = (\$val / \$div + \$div) / 2
if(\$rslt) > \$div {\$rslt = \$div}
else {ret}
}
ret(\$rslt)
}

fn Constrain(\$value, \$min, \$max)
{
ret(math_max(math_min(\$max, \$value), \$min))
}

fn FindDarkest()
{
\$darkest_value = 256
{
{
\$loc = \$x + \$y * image_width
\$point = image[\$loc]
\$r = get_red(\$point)
// printf("Red: %u\n", \$r)   // WORKING
if(\$r < \$darkest_value)
{
darkest_x = \$x
darkest_y = \$y
\$darkest_value = \$r
}
\$y + 1
}
\$x + 1
}
}

fn FindDarkestNeighbor(\$start_x, \$start_y)
{
\$darkest_neighbor = 256

\$x = \$min_x
\$y = \$min_y

while(\$x <= \$max_x)
{
while(\$y <= \$max_y)
{
\$loc = \$x + \$y * image_width
\$d = math_sqrt((\$x - \$start_x)*(\$x - \$start_x) + (\$y - \$start_y)*(\$y - \$start_y))
{
\$point = image[\$loc]
\$r = get_red(\$point) + rand(0.01)
if(\$r < \$darkest_neighbor)
{
darkest_x = \$x
darkest_y = \$y
\$darkest_neighbor = \$r
}
}
\$y + 1
}
\$x + 1
}

}

fn LightenOnePixel(\$x, \$y)
{
\$loc = \$y * image_width + x
\$point = image[\$loc]
\$r = get_red(\$point)
\$r = Constrain(\$r, 0, 255)
red[\$loc] = get_color(\$r, 0, 0)
}

fn Lighten(\$start_x, \$start_y)
{

\$x = 0
\$y = 0

while(\$x <= \$max_x)
{
while(\$y <= \$max_y)
{
\$d = math_sqrt((\$x*\$x - \$start_x*\$start_x) + (\$y*\$y - \$start_y*\$start_y))
{
\$loc = \$y * image_width + x
\$point = image[\$loc]
\$r = get_red(\$point)
\$r = \$r + adjustbrightness / \$d
\$r = Constrain(\$r, 0, 255)
red[\$loc] = get_color(\$r, 0, 0)
}
\$y + 1
}
\$x + 1
}

LightenOnePixel(adjustbrightness * 2, \$start_x + 1, \$start_y)
LightenOnePixel(adjustbrightness * 2, \$start_x - 1, \$start_y)
LightenOnePixel(adjustbrightness * 2, \$start_x, \$start_y + 1)
LightenOnePixel(adjustbrightness * 2, \$start_x, \$start_y - 1)

LightenOnePixel(adjustbrightness * 1, \$start_x + 1, \$start_y + 1)
LightenOnePixel(adjustbrightness * 1, \$start_x - 1, \$start_y - 1)
LightenOnePixel(adjustbrightness * 1, \$start_x - 1, \$start_y + 1)
LightenOnePixel(adjustbrightness * 1, \$start_x + 1, \$start_y - 1)
}

fn RandomDarknessWalk()
{
FindDarkest()
\$x = darkest_x
\$y = darkest_y
squiggle_count + 1
FindDarkestNeighbor(\$x, \$y)
\$newx = darkest_x * drawing_scale + xoffset
\$newy = darkest_y * drawing_scale + yoffset
printf("%u: %u\n", darkest_x, darkest_y)
line(\$oldx, \$oldy, \$newx, \$newy, WHITE)

\$s = 0
while(\$s < squiggle_length)
{
FindDarkestNeighbor(\$x, \$y)
Lighten(darkest_x, darkest_y)
\$newx = darkest_x * drawing_scale + xoffset
\$newy = darkest_y * drawing_scale + yoffset
line(\$oldx, \$oldy, \$newx, \$newy, WHITE)
\$x = darkest_x
\$y = darkest_y
\$oldx = \$newx
\$oldy = \$newy
//printf("%u, %u\n", \$newx, \$newy)
\$s + 1
}
}

start:

red = new(get_xsize(image), get_ysize(image), PIXEL)

image_width = get_xsize(image)
image_height = get_ysize(image)
size = image_width * image_height

start_timer(0)
t = get_timer(0) / 1000

offsetx = 0 //image_width / 2
offsety = 0

while 1
{
RandomDarknessWalk()
frame()
//printf("%u\n", squiggle_count)
if(squiggle_count >= squiggle_length)
{
//printf("end in %u min.\n", image_width)
save(red,"./pokus.png",FORMAT_PNG)
//while( get_event() ) { if EVT[ EVT_TYPE ] == EVT_QUIT { halt } }
halt
}
}

go start

``````

martblek
Posts: 6
Joined: Fri Dec 09, 2016 9:42 pm

Re: Need help with code.

Some progress here.
I need learn how to work with colors and alpha channel.
But some results is here:

Code: Select all

``````fn rand_range(\$a, \$b)
{
//print("randrange")
ret(\$a + rand() % (\$b - \$a))
}

fn math_max(\$min, \$max)
{
if(\$min < \$max) {ret(\$max)}
if(\$min > \$max) {ret(\$min)}
if(\$min == \$max) {ret(\$max)}
}

fn math_min(\$min, \$max)
{
if(\$min < \$max) {ret(\$min)}
if(\$min > \$max) {ret(\$max)}
if(\$min == \$max) {ret(\$min)}
}

fn Constrain(\$value, \$min, \$max)
{
//print("constrain")
ret(math_max(math_min(\$max, \$value), \$min))
}

fn FindDarkest()
{
//printf("%s\n", "findDarkest")
\$darkest_value = 256
{
{
\$loc = \$x + \$y * image_width
\$point = image[\$loc]
\$r = get_red(\$point)
if(\$r < \$darkest_value)
{
darkest_x = \$x
darkest_y = \$y
\$darkest_value = \$r
}
\$y + 1
}
\$x + 1
}
}

fn FindDarkestNeighbor(\$start_x, \$start_y)
{
//printf("%s\n", "DarkestNeighbor")
\$darkest_neighbor = 256

\$x = \$min_x
while(\$x <= \$max_x)
{
\$y = \$min_y
while(\$y <= \$max_y)
{
\$loc = \$x + \$y * image_width
//printf("X: %d, Y: %d, NewX: %d, NewY: %d\n", \$x, \$y, \$start_x, \$start_y)
\$d = sqrt((\$start_x - \$x)*(\$start_x - \$x) + (\$start_y - \$y) * (\$start_y - \$y))
{
\$point = image[\$loc]
\$random = rand_range(1, 10) / 100
\$r = get_red(\$point) + \$random
if(\$r < \$darkest_neighbor)
{
darkest_x = \$x
darkest_y = \$y
\$darkest_neighbor = \$r
}
}
\$y + 1
}
\$x + 1
}
}

fn LightenOnePixel(\$x, \$y)
{
//printf("%s\n", "Lighten One Pixel")
\$loc = \$y * image_width + \$x
\$point = image[\$loc]
\$r = get_red(\$point)
\$r = Constrain(\$r, 0, 255)
image[\$loc] = get_color(\$r, 0, 0)
}

fn Lighten(\$start_x, \$start_y)
{
//printf("%s\n", "Lighten")

\$x = \$min_x
while(\$x <= \$max_x)
{
\$y = \$min_y
while(\$y <= \$max_y)
{
\$d = sqrt((\$start_x - \$x) * (\$start_x - \$x) + (\$start_y - \$y) * (\$start_y - \$y))
{
\$loc = \$y * image_width + \$x
\$point = image[\$loc]
\$r = get_red(\$point)
\$r = \$r + adjustbrightness / \$d
\$r = Constrain(\$r, 0, 255)
image[\$loc] = get_color(\$r, 0, 0)
}
\$y + 1
}
\$x + 1
}

LightenOnePixel(adjustbrightness * 2, \$start_x + 1, \$start_y)
LightenOnePixel(adjustbrightness * 2, \$start_x - 1, \$start_y)
LightenOnePixel(adjustbrightness * 2, \$start_x, \$start_y + 1)
LightenOnePixel(adjustbrightness * 2, \$start_x, \$start_y - 1)

LightenOnePixel(adjustbrightness * 1, \$start_x + 1, \$start_y + 1)
LightenOnePixel(adjustbrightness * 1, \$start_x - 1, \$start_y - 1)
LightenOnePixel(adjustbrightness * 1, \$start_x - 1, \$start_y + 1)
LightenOnePixel(adjustbrightness * 1, \$start_x + 1, \$start_y - 1)
}

fn RandomDarknessWalk()
{
printf("Darkest: %d\n", squiggle_count)
FindDarkest()
\$x = darkest_x
\$y = darkest_y
squiggle_count + 1

FindDarkestNeighbor(\$x, \$y)
\$newx = darkest_x * drawing_scale + xoffset
\$newy = darkest_y * drawing_scale + yoffset

move_abs(\$newx, \$newy)
is_pen_down = 1

\$s = 0
while(\$s < squiggle_length)
{
//printf("Squiggle Length: %d\n", \$s)
FindDarkestNeighbor(\$x, \$y)
Lighten(darkest_x, darkest_y)
\$newx = darkest_x * drawing_scale + xoffset
\$newy = darkest_y * drawing_scale + yoffset
//line(\$oldx, \$oldy, \$newx, \$newy, BLACK)
move_abs(\$newx, \$newy)
\$x = darkest_x
\$y = darkest_y
\$oldx = \$newx
\$oldy = \$newy

\$s + 1
}
is_pen_down = 0
}

fn move_abs(\$x, \$y)
{
coordx = \$x
coordy = \$y

if(is_pen_down == 1)
{
\$color = get_color(0, 0, 0, 100-(squiggle_count * dry_out))
line(oldx + centerx, oldy + centery, coordx + centerx, coordy + centery, \$color)
}
oldx = \$x
oldy = \$y
}

start:

drawing_scale = 1.0
darkest_x = 0
darkest_y = 0
squiggle_count = 0
squiggle_length = 600
squiggle_total = 250
is_pen_down = 0
dry_out = 0.25
oldx = 0
oldy = 0

image_width = get_xsize(image)
image_height = get_ysize(image)

draw = new(image_height, image_height, PIXEL)

xoffset = -(image_width / 2)
yoffset = -(image_height / 2)
centerx = 0
centery = 0

set_screen(draw)
clear(WHITE)
pixi(draw)

start_timer(0)

while 1
{
RandomDarknessWalk()
frame()
if(squiggle_count >= squiggle_total)
{
save(draw,"./pokus2.png",FORMAT_PNG)
//while( get_event() ) { if EVT[ EVT_TYPE ] == EVT_QUIT { halt } }
printf("Time: %f sec.\n", get_timer(0) / 1000)
halt
}
}

go start
``````
I need find way to work better with red channel in Lighten functions.

BTW:
How i define if value is Float or Int ?
No type define ?
or val = new(1, 1, FLOAT) ?
thanks

martblek
Posts: 6
Joined: Fri Dec 09, 2016 9:42 pm

Re: Need help with code.

i think i'm done
too much work not yet finished but here is some result.
http://martblek.tumblr.com/

Posts: 2946
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Need help with code.

Hello!
How i define if value is Float or Int ?
No type define ?
or val = new(1, 1, FLOAT) ?
Variables have a dynamic type in Pixilang: INT32 or FLOAT32.
Examples:

Code: Select all

``````a = 32 //INT
a = 32.4 //FLOAT
a = 2 //INT
b = a * 2.2 //FLOAT
b = b div 1 //convert from FLOAT to INT``````