public class Circle {
private PointF centerPoint;
private float radius;
public PointF getCenterPoint() {
return centerPoint;
}
public void setCenterPoint(PointF centerPoint) {
this.centerPoint = centerPoint;
}
public float getRadius() {
return radius;
}
public void setRadius(float radius) {
this.radius = radius;
}
}
public class CircleUtils {
/**
* 根据圆上的三个点求圆心坐标、半径
* @param pA
* @param pB
* @param pC
* @return
*/
public static Circle getCircle(PointF pA,PointF pB,PointF pC)
{
float mat1,mat2,mat3 ;
mat1 = ((pB.x*pB.x +pB.y*pB.y)-(pA.x*pA.x +pA.y*pA.y))*(2*(pC.y-pA.y))-
((pC.x*pC.x +pC.y*pC.y)-(pA.x*pA.x +pA.y*pA.y))*(2*(pB.y-pA.y));
mat2 = (2*(pB.x-pA.x))*((pC.x*pC.x+pC.y*pC.y)-(pA.x*pA.x +pA.y*pA.y))-
(2*(pC.x-pA.x))*((pB.x*pB.x+pB.y*pB.y)-(pA.x*pA.x +pA.y*pA.y));
mat3 = 4*((pB.x-pA.x)*(pC.y-pA.y) - (pC.x-pA.x)*(pB.y-pA.y));
Circle circle=new Circle();
PointF centerPoint=new PointF();
float radius;
centerPoint.x = mat1/mat3;
centerPoint.y = mat2/mat3;
radius=(float) Math.sqrt(((pA.x-centerPoint.x)*(pA.x-centerPoint.x) + (pA.y-centerPoint.y)*(pA.y-centerPoint.y)));
circle.setCenterPoint(centerPoint);
circle.setRadius(radius);
return circle;
}
/**
* 求一段圆弧两端另一点的坐标
* @param circle
* @param startP 圆弧一端的点
* @param angle 圆弧对应的角度
* @return
*/
public PointF getEndPointOfArc(Circle circle,PointF startP,float angle) {
PointF centerP=circle.getCenterPoint();
PointF endPointF=new PointF();
endPointF.x=(float) (centerP.x+(startP.x-centerP.x)*Math.cos(angle*Math.PI/180)-(startP.y-centerP.y)*Math.sin(angle*Math.PI/180));
endPointF.y=(float) (centerP.y+(startP.x-centerP.x)*Math.sin(angle*Math.PI/180)+(startP.y-centerP.y)*Math.cos(angle*Math.PI/180));
return endPointF;
}
}