需求
1.只提供开始坐标,结束坐标。在这个范围之内绘制一个标准的五角星。该如何实现?
2.五角星为空心,不允许采用对角连线的方式来实现。
效果:
步骤
已知:开始坐标startX,startY;结束坐标endX,endY;
1.计算中心点坐标以及中心点到外圆的半径
float cx = (startX+endX)/2
float cy = (startY+endY)/2
得到五角星中心点。
根据三角函数定理。计算中心点到尖角的距离。
//介绍:中心点,到开始点之间作直角三角形,求斜边长度 Math.sqrt(开平方根)。
float R = Math.sqrt((cx-startX)*(cx-startX)+(cy-startY)*(cy-startY));
2.计算五角星中心到内圆的半径
首先,得到每一度的弧度值.我们单独存储,因为后续会大量使用。
float radianV=(float)(Math.PI/180);
在已知三角形一边长度,以及角度的情况下。计算另外边长
并且我们已知五角星尖角角度为36°,它的二分之一为18°
可以求得内圆的半径。
float r =(float) (R*Math.sin(18*radianV)/Math.cos(36*radianV));
3.在已知内圆半径,和外圆半径的情况下。将圆拆分为五个顶点
72°的角度解释:中心点到尖角的连线,那每条边的夹角为72°
Path path =new Path();
for(int i=0; i<5;++i){
//得到外圆的等分
float x = cx-(R*Math.cos((90+i*72)*radianV));
float y = cy-(R.Math.sin((90+i*72)*radianV));
if(i==0){
path.moveTo(x,y);
}else{
path.lineTo(x,y);
}
//得到内圆的等分,内圆中心点 相对外圆要进行72°的二分之一的偏移,所得为36°
x=cx-(r*Math.cos((90+36+i*72)*radianV));
y=cy-(r*Math.sin((90+36+i*72)*radianV))
path.lineTo(x,y);
}
//封闭图形
path.close();
到这里,我们就能够正常绘制完整的线段啦。
如果不计算内圆,可以在外圆相交两个点做连线。也能够得到五角星。