前言
条件:
1.只知道椭圆顶点坐标的情况下。
2.椭圆不垂直X轴的情况下。
类似上面的效果, 当然我的椭圆绘制的不太圆。
要求:
已知点a,点b,点c,点d坐标。
绘制完整椭圆
问题
1.Android 的椭圆绘制都是基于已知矩形,并作矩形的内切圆的方式进行绘制的。
2.系统提供的API方法之中,都要求了该矩形必须垂直于X。 不能满足倾斜的情况。
解决方案
1.连接点a和点c,采用三角函数算法,得到距离
2.连接点b与点d,采用三角函数算法,得到距离。
//取绝对值,就不用判断a和c 谁大谁小的问题
float disX = Math.abs(a.x-c.x);
float disY = Math.abs(a.y-c.y);
//a的平方+b的平方=C的平方, 在开根号(Math.sqrt).得到c的长度
float acLength = Math.sqrt(disX*disX+disY*disY);
按照上面的方法,分别得到ac 和bd的长度值。
float acLength;
float bdlength;
第二步,通过两条线段的交点,得到中心点坐标也就是
cx,cy; 这是圆心。
float cx;
float cy;
第三步,通过圆心,按照长宽比,我们得到标准的垂直屏幕的矩形尺寸
RectF rectF = new RectF();
rectF.left = cx - bdlength/ 2;
rectF.right = cx + bdlength/ 2;
rectF.top = cy - acLength/ 2;
rectF.bottom = cy + acLength/ 2;
mPath.addOval(rectF, Path.Direction.CW);
到这一步,我们得到了椭圆路径的值。但是该值当前角度不正确。
第四步,我们任意采用ac或者bd与X轴之间的夹角。计算椭圆旋转了多少角度。
double angel = (Math.atan2(a.y - c.y, a.x - c.x)) * 180 / Math.PI;
得到旋转角度后,通过Matrix 矩阵变形,对Path路径进行形变。
Matrix matrix = new Matrix();
//旋转角度基于圆心。
matrix.setRotate((float) angel, cx, cy);
mPath.transform(matrix);
到这里,就可以随意进行绘制了。
椭圆将不强求必须垂直屏幕了。
评论区