I'm trying to figure out how I could be able to calculate coordinates on a circle. For simplicity I made some images.
That's the start with information I have. Now I need to calculate the new coordinates when for example the circle would turn 90 degrees to the right. Just like the next image:
I need to calculate the coordinates of the new red dot. (I also need this with different degrees such as 20 degrees).
To do this my plan was to do the following:
My first step is:
distance = Math.sqrt((point1.x-point2.x)*(point1.x-point2.x) + (point1.y-point2.y)*(point1.y-point2.y))
The part to calculate the new degrees is:
double theta = Math.atan2(targetPt.y - centerPt.y, targetPt.x - centerPt.x);
theta += Math.PI/2.0;
And the last part to calculate the new location would be:
double x = mMiddleView.getX() + distance * Math.cos(Math.toRadians(theta));
double y = mMiddleView.getY() + distance * Math.sin(Math.toRadians(theta));
However when I do these calculations with for example 0 degrees it still returns another value than the original coordinates.
Any help would be appreciated!
Edit for Philipp Jahoda:
My values are:
distance +- 70, currentDegree = 0.
PointF point = new PointF((float)mMiddleView.getX(), (float)mMiddleView.getY());
PointF point2 = getPosition(point, (float) distance, currentDegree);
and my results are:
center: PointF(490.0, 728.0) radius: 78.0 angle: 0.0
new point: PointF(568.0, 728.0)
As you can see, the degree is 0 so the point is not supposed to turn. It should keep the 490, 728 coordinates but it does not keep those.
To determine the position of a given point with respect to a circle, all we need to do is to find the distance between the point and the center of the circle, and compare it with the circle's radius. If the distance is greater than the radius, the point lies outside.
If your starting point is (0,0), and your new point is r units away at an angle of θ, you can find the coordinates of that point using the equations x = r cosθ and y = r sinθ.
Thats how:
private PointF getPosition(PointF center, float radius, float angle) {
PointF p = new PointF((float) (center.x + radius * Math.cos(Math.toRadians(angle))),
(float) (center.y + radius* Math.sin(Math.toRadians(angle))));
return p;
}
This method calculates the position around the center of a circle (center of your view) depending on radius and angle. Angle in degrees.
The returned PointF
will contain the x- and y-coordinate of the calculated position.
Be aware that 0 degrees is at the very east position of the circle, 270 degrees is in the very north position of the circle:
So if the center of your view is at x: 100, y: 100 and you calculate the position with an angle of 0 degrees and a radius of 50, the result will be x: 150, y: 100
If you use angle 90 degrees and radius 50, the result will be x: 100, y: 150
It is used here in my charting libary, and it works.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With