# Bouncing within a circle

Hi all,

I’m quite stuck with my next bit of code:

``````displayMode(FULLSCREEN)

-- Use this function to perform your initial setup
function setup()
pos = vec2(WIDTH/2, HEIGHT/2)
speed = vec2(300, 134)
time = 0
center = vec2(WIDTH/2, HEIGHT/2)
diameter = 750
end

-- This function gets called once every frame
function draw()
-- This sets a dark background color
background(40, 40, 50)

ellipse(center.x, center.y, diameter)

-- This sets the line thickness
strokeWidth(5)
sprite("Planet Cute:Star", pos.x, pos.y)

time = DeltaTime

pos.x = pos.x + time * speed.x
pos.y = pos.y + time * speed.y

-- if the new position is outside or on the ellipse
if pos:dist(center) >= diameter/2 then
-- calculate the new speed direction
angle = math.atan2(pos.x-center.x,pos.y-center.y)
pcol=vec2(math.cos(angle)*375, math.sin(angle)*375)
vecn = vec2(-pcol.x, -pcol.y):normalize()
dotn=vecn:dot(vecn)
dot=speed:dot(vecn)
imp = dot/dotn
speed.x = speed.x - imp * vecn.x * 2
speed.y = speed.y - imp * vecn.y * 2

-- update the new position
pos.x = pcol.x + speed.x + center.x
pos.y = pcol.y + speed.y + center.y
end
end

``````

I want the star to bounce within the circle. I can’t get the math right. Anyone an idea what I’m doing wrong here?

I found the solution. The angle and new position, needed to be adapted.
The new code works as expected. See code of future reference.

``````
displayMode(FULLSCREEN)

-- Use this function to perform your initial setup
function setup()
pos = vec2(WIDTH/2, HEIGHT/2-100)
speed = vec2(200, 150)
time = 0
center = vec2(WIDTH/2, HEIGHT/2)
diameter = 750
end

-- This function gets called once every frame
function draw()
-- This sets a dark background color
background(40, 40, 50)

ellipse(center.x, center.y, diameter)

-- This sets the line thickness
strokeWidth(5)
sprite("Planet Cute:Star", pos.x, pos.y)

time = DeltaTime

pos.x = pos.x + time * speed.x
pos.y = pos.y + time * speed.y

-- if the new position is outside or on the ellipse
if pos:dist(center) >= diameter/2 then
-- calculate the new speed direction
angle = math.atan2(pos.x-center.x,pos.y-center.y)
pcol=vec2(math.cos(0.5*math.pi-angle)*diameter/2,
math.sin(0.5*math.pi-angle)*diameter/2)
vecn = vec2(-pcol.x, -pcol.y):normalize()
dotn=vecn:dot(vecn)
dot=speed:dot(vecn)*2
imp = dot/dotn
speed.x = speed.x - imp * vecn.x
speed.y = speed.y - imp * vecn.y

-- update the new position
pos.x = pcol.x + center.x + speed.x * time
pos.y = pcol.y + center.y + speed.y * time
end
end
``````

Thanks for sharing this @Doffer and I’m glad you found the solution.

Thanks @simeon. It has been far too long since the last time I’ve had to use trigonometry