Mystic Rose

Cool @david :slight_smile:

Btw . Thanks @jmv38

@David Moderators (I’m one, and there are a few others around) can hide posts from view, but the usual way is to edit it to something like “Issue was solved” or some such.

I usually only delete spam posts or obvious double posts.

Thanks so much @dave1707 ! However… you do realise that every answer leads to at least two more questions ;:wink:
I’d spent hours trying to get the ‘wait’ to work properly, and just after posting the problem, figured it out, so removed the post. However, I still don’t understand why having this…

function draw()
    frames = frames + 1
    if frames%10 == 0 then

at the start of drawing caused the patterns to strobe. I tried a simple routine moving a rectangle around the screen from a table of coordinate values, and it worked fine with the frame delay at the start of draw().
I appreciate the refinements you and @Andrew_Stacey have made and will update mine.
I prefer the way you have it centered full screen - I want the option for parameters available too, so is it easy to have it centered on both screens?

I’m playing around with colours atm so one more question? There doesn’t seem to be a hue, saturation, brightness instruction in Lua - just RGB & Alpha. I tried randomising cols, but a lot of them can be pretty dull… I’d ideally like to have say saturation and brightness at 100% and one parameter slider for Hue. Is this possible?

Thanks guys as always, and for your nice comments too. Much appreciated.

@David Add this if statement to the beginning of draw(). When you switch from FULLSCREEN to parameter view, or parameter view to FULLSCREEN, or rotate the ipad, it will resize and center the image. As for the colors, your limited to r,g,b and alpha. I don’t have the original code that I corrected, so I can’t say exactly why the way you had the wait was causing the strobe effect. I know the delay was too long and the way you had the code arranged wasn’t working, but I would need the original again to give an exact answer.


function draw()
    background(40,40,50)

    if a~=WIDTH/2 then
        a = WIDTH/2     -- circle centre (a,b) radius r
        b = HEIGHT/2
        r = math.min(a,b)
    end

Thanks @dave1707 ! I will reproduce the effect and post it later today. I think I’ve figured out a way to maintain punchy saturated colours… Looking at Photoshop, with 100% saturation & brightness, starting at R255 G0 B0 blue ramps up in 6’s to B252, B255 at which point red decrements in 6’s till you get R0 G0 B255… and so on… I haven’t worked out how to code that into a function hue(0-100) but can’t be that difficult can it ;-p We’ll see.

@dave1707 Here is the code with the strobing issue. As I said earlier, I wrote a routine to move a rectangle from a table of values, with the delay in exactly the same place and it worked straight away.

-- Mystic Rose v3.4  rotation 2 by David Cockram
-- frame delay issues - strobing

function setup()
    print("Hello World!")
    frames = 0
    n = 1
    parameter.integer ("points", 2,20,11)
    parameter.integer ("rotation", 1, 90, 33)
end

function draw()
    
    frames = frames + 1
    if frames%20 == 0 then
    
    background(40, 40, 50)
    strokeWidth(1)

-- Do your drawing here
    
    fill(31, 103, 38, 132)
    
    ellipse(380,370,704)
-- points & rotation settings
    d = {4,7,15,49,11,33,11,32,16,34,11,26,11,14,6,17,11,16,11,31,6,14,11,34,11,51,11,62,6,6,11,69}
    points = d[n]  
    rotation = d[n+1]
    print(n, points, rotation)
    
    a = 380             -- circle centre (a,b) radius r
    b = 370
    r = 350
    angle = 360/points  -- angle to increment
    w = points*2        -- number of coordinates
    c = {}              -- table of coords {x1, y1, x2, y2 ... etc}
        
-- this part works out the coordinates, based on the number of points
    
    for rot = 0, 360, rotation do
    
        for i = 0, points-1 do
        t = i*angle + rot
        -- put coordinate pairs in a table, c
        c[2*i+1] = a + r*math.sin(math.rad(t))   -- x coordinate
        c[2*i+2] = b + r*math.cos(math.rad(t))   -- y coordinate
        end
    
        -- draw lines. The start value h+2 increments each loop to prevent repeating lines    
          
        for h = 1, w-3, 2 do    
            for i = h+2, w-1, 2 do
            line(c[h], c[h+1], c[i], c[i+1])
            -- print(h, h+1, i, i+1)  -- line drawing key table values to check 
            end
        end
    
    end
 
    
        n = n+2   -- cycle through table of points & rotation
        if n == 33
        then n = 1
        end
    
    end
        
end

@David I’ll look at your code later and give you an answer. It’s time to get off the iPad and start my day.

@David, you might consider deleting the rotation table, and instead use the built-in rotate function

@David The flickering effect is due to how Codea does its drawing. It has three canvases that it uses in turn so when you don’t redraw stuff each frame then what is there is not reused until the third iteration. Did that make sense?

That’s why you should ensure that you always draw something every time that draw is run, even if it is the same as what you drew the previous time.

(There is a way around this which is to use backingMode(RETAINED) in setup, but it is better for you to learn about how Codea draws and how to work with that than how to get round it.)

-- Mystic Rose v3.4  rotation 2 by David Cockram
-- frame delay issues - strobing

function setup()
    print("Hello World!")
    frames = 0
    n = 1
    parameter.integer ("points", 2,20,11)
    parameter.integer ("rotation", 1, 90, 33)
end

function draw()

    frames = frames + 1
    if frames%20 == 0 then
        n = n+2   -- cycle through table of points & rotation
        if n == 33
        then n = 1
        end

    end
    background(40, 40, 50)
    strokeWidth(1)

-- Do your drawing here

    fill(31, 103, 38, 132)

    ellipse(380,370,704)
-- points & rotation settings
    d = {4,7,15,49,11,33,11,32,16,34,11,26,11,14,6,17,11,16,11,31,6,14,11,34,11,51,11,62,6,6,11,69}
    points = d[n]  
    rotation = d[n+1]
    print(n, points, rotation)

    a = 380             -- circle centre (a,b) radius r
    b = 370
    r = 350
    angle = 360/points  -- angle to increment
    w = points*2        -- number of coordinates
    c = {}              -- table of coords {x1, y1, x2, y2 ... etc}

-- this part works out the coordinates, based on the number of points

    for rot = 0, 360, rotation do

        for i = 0, points-1 do
        t = i*angle + rot
        -- put coordinate pairs in a table, c
        c[2*i+1] = a + r*math.sin(math.rad(t))   -- x coordinate
        c[2*i+2] = b + r*math.cos(math.rad(t))   -- y coordinate
        end

        -- draw lines. The start value h+2 increments each loop to prevent repeating lines    

        for h = 1, w-3, 2 do    
            for i = h+2, w-1, 2 do
            line(c[h], c[h+1], c[i], c[i+1])
            -- print(h, h+1, i, i+1)  -- line drawing key table values to check 
            end
        end

    end




end

Thanks @Andrew_Stacey. I could do with reading up on this tbh… the extent of my knowledge here is that the setup() is performed once (presumably parameters are an exception) and draw() is done 60 times a second. Are there any articles that explain in detail?

I’ve updated the Mystic Rose to v3.5 and tidied it up a bit with the help of you guys… many thx. It now defaults to a normal classic Mystic Rose with 20 points. Moving the rotation slider creates some pretty patterns. I’ve put some of the nicer ones as presets, so switching that on will cycle through them. It now defaults to Full Screen, and finally I’ve scaled the line width proportionally to the #points as thicker lines look better with fewer points.

Next step is to add colour… and I must post this on the Codea Community site… can I use the same login as I use here to get onto that?

-- Mystic Rose v3.5 by David Cockram

displayMode (FULLSCREEN)

function setup()
    pTab = {17,4,15,11,10,11,16,20,18, 8, 7,11,10,20,10, 6,19,11, 8,14,10,19, 6,11,18,11,14,11, 6,14,11, 8}    -- points presets
    rTab = {63,7,49,33,75,32,36,66,82,26,13,26,69,48,35,17,72,31,23,39,33,78,14,34,30,51,51,62, 6,86,69,11}    -- rotation presets
    a = WIDTH/2     -- circle centre (a,b) radius r
    b = HEIGHT/2
    r = math.min(a,b)-10
    frames = 0
    n = 1
    parameter.boolean("Presets", false)
    parameter.integer ("points", 2,40,20)
    parameter.integer ("rotation", 1, 360, 360)

end

function draw()
    background(91, 59, 44, 50)
    
    if a~=WIDTH/2 then
       a = WIDTH/2     -- circle centre (a,b) radius r
       b = HEIGHT/2
       r = math.min(a,b)-10
    end
    
    strokeWidth(2-points/40)    -- scale to higher value for fewer points - looks nicer
    fill(120, 67, 45, 80)
    ellipse(a,b,r*2+4)

    if Presets == true then     -- switch preset values on/off
    points = pTab[n]  
    rotation = rTab[n]
    else end    

    angle = 360/points  -- angle to increment
    w = points*2        -- number of coordinates
    c = {}              -- table of coords {x1, y1, x2, y2 ... etc}
        
-- this part works out the coordinates, based on the number of points
    
    for rot = 0, 360, rotation do
    
        for i = 0, points-1 do
        t = i*angle + rot
        -- put coordinate pairs in a table, c
        c[2*i+1] = a + r*math.sin(math.rad(t))   -- x coordinate
        c[2*i+2] = b + r*math.cos(math.rad(t))   -- y coordinate
        end
    
        -- draw lines. The start value h+2 increments each loop to prevent repeating lines    
          
        for h = 1, w-3, 2 do    
            for i = h+2, w-1, 2 do
            line(c[h], c[h+1], c[i], c[i+1])
            -- print(h, h+1, i, i+1)  -- line drawing key table values to check 
            end
        end   
    end
    
    frames = frames + 1   
    if frames%20 == 0 then    
        n = n+1       -- cycle through table of points & rotation
        if n > #pTab
        then n = 1
        end   
    end       
end

@David - I’ve written some posts here
http://coolcodea.wordpress.com

And an unfinished ebook here
https://www.dropbox.com/s/t5im6tl14ky5t08/Codea%20for%20beginners.pdf
Which I hope explains the drawing process

@Ignatz I think the PDF ebook should be newbie required reading. There is a lot of info in there. Some things that will even help me.

@dave1707 - you mean local variables? :smiley:

@Ignatz I did have a quick look through your book to see if it covered the 3-image point about how Codea draws. I didn’t see it (but I didn’t look all that carefully). Is it there? When writing about it to David above then I wanted some reference that I could link to but couldn’t find it on the wiki either.

@Andrew_Stacey - no, I didn’t cover the three image stuff because that is too complex for newbies! I stick to what the user actually sees.

@Ignatz local variables? Are those in there? I must have completly skipped over that section because I don’t remember anything about them.

@dave1707 - no, I was just teasing you…I know you don’t use them much…

@Ignatz I know you we’re teasing because of the big smily face, or even without it. But I skimmed thru your ebook and there is a lot of information in there and it would be very useful for the newbies to read. There is information in there that I can learn from also. You did a fantastic job. A link to it should be placed a the top of the forum labeled “Required Reading” and any “simple question” should be responded to with “look in the Required Reading” link.

@dave1707 - I presume you’re talking about the Codea ebook, which is totally unfinished. There is so much to talk about. I’ve pretty much finished the Lua ebook, though, which people should read first.

Thank you for your kind words. Much appreciated. :slight_smile:

In turn, I think you are doing an amazing job of supporting new users.