#### Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

# polygons draw and fill requested?

edited May 2013 in General Posts: 32

Hey - Help? For example I really want to draw and fill a hexagon and I have no idea how to do this in Codea. I found some code on the forum that animates through a sequence of polygons which is very cool but not easy for me to decipher, hack and use, plus the polygons are outlines only and not filled. I also read that this was something that may be included in a future version of Codea - Is there still a plan to incorporate this as a feature or have I just asked a really dumb question? Any info greatly appreciated

Tagged:

• Posts: 2,820

I've got code to do this with meshes. I'll share it later today.

• Posts: 32

ah perfect @Zoyt - That is real kind of you. Looking forward to checking it out later - a good way for me to learn about meshes too I suspect ;-)

• Posts: 5,396

Since meshes require triangles, the obvious approach is to connect all the polygon vertices to the centre point of the polygon, which breaks it into triangles.

I have a number of general tutorials on meshes
http://coolcodea.wordpress.com/

• edited May 2013 Posts: 8,674

.@jasl I'm not sure if this is exactly what you're after, but it might give you an idea. Just drag your finger around the screen in an irregular circle. It uses meshes and triangles as you move you finger around the screen and fills each triangle with the color red.

``````displayMode(FULLSCREEN)

function setup()
count=0
tab={}
mtab={}
m=mesh()
end

function draw()
background(40, 40, 50)
m.vertices=mtab
m:setColors(255,0,0)
m.draw(m)
end

function touched(t)
if t.state==MOVING then
count = count + 1
table.insert(tab,t)
if count>1 then   -- create a triangle
table.insert(mtab,(vec2(tab.x,tab.y)))
table.insert(mtab,(vec2(tab[count-1].x,tab[count-1].y)))
table.insert(mtab,(vec2(tab[count].x,tab[count].y)))
end
end
end

``````
• Posts: 8,674

Here's another version of the above program. Just tap the screen to create a point. Once you create a triangle with 3 points, it will fill with red. Tap again to create another triangle with the previous one and it will fill with red.

``````displayMode(FULLSCREEN)

function setup()
count=0
tab={}
mtab={}
m=mesh()
end

function draw()
background(40, 40, 50)
fill(255)
for a,b in pairs(tab) do
ellipse(b.x,b.y,6)
end
m.vertices=mtab
m:setColors(255,0,0)
m.draw(m)
end

function touched(t)
if t.state==BEGAN then
count = count + 1
table.insert(tab,t)
if count>1 then
table.insert(mtab,(vec2(tab.x,tab.y)))
table.insert(mtab,(vec2(tab[count-1].x,tab[count-1].y)))
table.insert(mtab,(vec2(tab[count].x,tab[count].y)))
end
end
end

``````
• edited May 2013 Posts: 2,820

To make it simpler, I forgot it's not a function, just a snippet of code that I use. Here it is:

 ```meshName = mesh() meshName.vertices = triangulate(--table of points--) meshName:setColors(255,255,255,255)```

The triangulate function is the key. What it does is you pass in a table of points, and it returns points for all the triangles in a mesh to create a mesh stretched across those points.
Hope this helps.

• Posts: 5,396

What the!

How totally cool!

Thanks

• Posts: 2,820

@Ignatz - I thought the same thing when I came across it. I was Googling all these triangulation formulas, converting boat-loads of messy code, etc, then I bothered to scroll down to the bottom of the meshes reference in the documentation. I gave myself about the biggest facepalm of my life...

• edited May 2013 Posts: 8,674

Here's a program I posted long ago to show the triangulate function. The triangulate function doesn't work well if you switch directions. Either go clockwise or counter clockwise.

``````-- Example of the Codea triangulate function.
-- triangulate breaks a polygon up into triangles.

function setup()
displayMode(FULLSCREEN)
t1={}
t2={}
end

function draw()
background(40,40,40)
fill(255)
fontSize(20)
text("Example of the Codea triangulate function.",WIDTH/2,HEIGHT-50)
text("Keep touching the screen to create a polygon point.",WIDTH/2,HEIGHT-75)
for a,b in pairs(t1) do
ellipse(b.x,b.y,2,2)
str=string.format("(%d,%d)",b.x,b.y)
fontSize(12)
text(str,b.x,b.y-10)
end
lines()
end

function touched(t)
if t.state==BEGAN then
table.insert(t1,#t1+1,vec2(t.x,t.y))
t2=triangulate(t1)
end
end

function lines()
if t2~=nil then
stroke(255)
strokeWidth(2)
for a=1,#t2,3 do
line(t2[a].x,t2[a].y,t2[a+1].x,t2[a+1].y)
line(t2[a+1].x,t2[a+1].y,t2[a+2].x,t2[a+2].y)
line(t2[a+2].x,t2[a+2].y,t2[a].x,t2[a].y)
end
end
end

``````
• Posts: 32

This is all extremely useful - Thanks to everyone who posted :-)

• Posts: 1,595

Yeah triangulate does it right except if you use a a polygon with random vertices then it create blank spaces