Rhexis - 1 year ago 73

jQuery Question

What I am aiming to do is arc the position of a circle towards the position of the mouse cursor, this all being relative to the world viewed through the canvas. To keep a handle on the speed at which the circle moves I decided to make a boundary larger than the circle, if the mouse is outside the boundary then the "position" of the mouse is brought to the boundary so that when I arc towards the coords, if they arent super far from the position of the circle it doesnt move at crazy speeds. I have this working and this is the code which does it:

`dx = Game.controls.mouseX - (this.x - xView); // get the distance between the x coords`

dy = Game.controls.mouseY - (this.y - yView); // get the distance between the y coords

radii = this.radius + 1; // +1 because the "radius" of the mouse is 1

if((dx * dx) + (dy * dy) > radii * radii) // is the mouse not over the player?

{

if((dx * dx) + (dy * dy) < 301 * 301)

{

this.x += ((Game.controls.mouseX - (this.x - xView)) * 2 / (this.mass)) + step;

this.y += ((Game.controls.mouseY - (this.y - yView)) * 2 / (this.mass)) + step;

}

else

{

mx = Game.controls.mouseX;

my = Game.controls.mouseY;

do

{

dx = mx - (this.x - xView);

dy = my - (this.y - yView);

mx += (((this.x - xView) - mx) * 2 / (this.mass)) + step;

my += (((this.y - yView) - my) * 2 / (this.mass)) + step;

} while((dx * dx) + (dy * dy) > 301 * 301)

this.x += ((mx - (this.x - xView)) * 2 / (this.mass)) + step;

this.y += ((my - (this.y - yView)) * 2 / (this.mass)) + step;

}

}

The magic for 'outside the boundary' lies withing the do while. This is the best fix I could come up with and I cant see this as being an elegant or fast solution and am wondering what the proper course of action should be.

Im no artist but hopefully this image helps to illustrate what I am trying to achieve. The Black dot is the mouse pos, the black circle is the circle and the red circle is the boundary I have specified. I want to get the coords marked by the X.

Answer

Your question is a special case of Circle line-segment collision detection algorithm?, in this case with B and C being the same points, so you can use your center point for both of them.

That solution is given in C, but it translates to JavaScript very easily, just replace `float`

with `var`

, use `Math.sqrt()`

and so on...

Oh, and then there is a JvaScript version here: Calculate the point of intersection of circle and line through the center, that's more appropriate :-)

Source (Stackoverflow)