I\'m trying to figure out how I could be able to calculate coordinates on a circle. For simplicity I made some images.
One elegant way to accomplish this is using complex numbers, available for example here.
In pseudo-code:
z = (x_old + I*y_old)*exp(I*angle);
x_new = real(z);
y_new = imag(z);
NOTE: the rotation angle
needs to be in radians.
NOTE2: this assumes a circle centred at (0,0). Just add a shift if the center is not there.
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.
This need some mathematics here. You need to know if two lines are perpendicular to each other, The multiplication of those two lines gradient should equals to -1
.
Then
m1=(770-500)/(540-400)=27/14
same way
m2=(y-770)/(x-540)
(x,y)
is the point you want to find.
Now
m1*m2=-1
Now we got one equation. You need another since there are two variable needs to find
You can get another by considering the radius of the circle.
r=sqrt((540-400)^2+(770-500)^2)
Same way
r=sqrl((x-540)^2+(y-770)^2)
Now you got two equation and only needs to solve. This will give you two set of coordinates. Since there can be -90
and 90
degrees.