# Simple Maths but can't crack it

Hi All,
very simple problem - I need to use a circle with 8 equi-spaced small circles just inside the circle circumference to act as buttons. I need to detect the touch of each circle to be able to decide. between 8 options. Read a lot of maths tries atan() and atan2() and a few other options but the solution keeps eluding me. I was trying with two vector centre to vertical radius and centre to inner circle centre.

The circles are effectively 45deg spaced and ideally I was hoping to convert positional calcs to the integers 1 to 8 to get a selection result. Any ideas?

@Bri_G Here’s a start.

``````viewer.mode=FULLSCREEN

function setup()
a=""
end

function draw()
background(0)
stroke(255)
strokeWidth(2)
for z=0,359,45 do
noFill()
ellipse(x+WIDTH/2,y+HEIGHT/2,60)
fill(255)
text(z//45+1,x+WIDTH/2,y+HEIGHT/2)
end
if a~="" then
fill(255)
text(a//45+1,WIDTH/2,HEIGHT/2)
end
end

function touched(t)
for z=0,359,45 do
if t.x>x-30 and t.x<x+30 and t.y>y-30 and t.y<y+30 then
a=z
end
end
end
``````

Here’s a simple class version.

``````viewer.mode=FULLSCREEN

function setup()
b1=button(400,200,80)
b2=button(500,500,60)
end

function draw()
background(0)
b1:draw()
b2:draw()
end

function touched(t)
b1:touched(t)
b2:touched(t)
end

button=class()

function button:init(x,y,s)
self.x=x
self.y=y
self.size=s
self.val=0
end

function button:draw()
stroke(255)
strokeWidth(2)
fill(175, 224, 201)
ellipse(self.x,self.y,self.size*3)
for z=0,359,45 do
fill(137, 234, 72)
ellipse(x+self.x,y+self.y,self.size*.7)
fill(255, 0, 0)
text(z//45+1,x+self.x,y+self.y)
end
if self.val>0 then
fill(255)
text(self.val,self.x,self.y)
end
end

function button:touched(t)
if t.state==BEGAN then
for z=0,359,45 do