侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 274 篇文章
  • 累计创建 55 个标签
  • 累计收到 74 条评论

Android 倾斜椭圆绘制方法

Z同学
2021-02-05 / 0 评论 / 0 点赞 / 814 阅读 / 949 字
温馨提示:
本文最后更新于 2021-11-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

条件:
1.只知道椭圆顶点坐标的情况下。
2.椭圆不垂直X轴的情况下。

image.png
类似上面的效果, 当然我的椭圆绘制的不太圆。

要求:
已知点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);

到这里,就可以随意进行绘制了。

椭圆将不强求必须垂直屏幕了。

0

评论区