Android 穿过点画平滑曲线
先上效果图
参考了这篇文章 穿过已知点画平滑曲线(3次贝塞尔曲线) 原理什么的我也不说了,有兴趣的看这篇文章好了
直接上代码
public class DrawUtil {/*** 绘制穿过多边形顶点的平滑曲线* 用三阶贝塞尔曲线实现* @param canvas 画布* @param points 多边形的顶点* @param k 控制点系数,系数越小,曲线越锐利* @param color 线条颜色* @param strokeWidth 线条宽度*/public static void drawCurvesFromPoints(Canvas canvas, List<Point> points, double k, int color, float strokeWidth) {int size = points.size();Paint paint = new Paint();// 计算中点Point[] midPoints = new Point[size];for (int i = 0; i < size; i++) {Point p1 = points.get(i);Point p2 = points.get((i + 1) % size);midPoints[i] = new Point((p1.x + p2.x) / 2, (p1.y + p2.y) / 2);}// 计算比例点Point[] ratioPoints = new Point[size];for (int i = 0; i < size; i++) {Point p1 = points.get(i);Point p2 = points.get((i + 1) % size);Point p3 = points.get((i + 2) % size);double l1 = distance(p1, p2);double l2 = distance(p2, p3);double ratio = l1 / (l1 + l2);Point mp1 = midPoints[i];Point mp2 = midPoints[(i + 1) % size];ratioPoints[i] = ratioPointConvert(mp2, mp1, ratio);}// 移动线段,计算控制点Point[] controlPoints = new Point[size * 2];for (int i = 0, j = 0; i < size; i++) {Point ratioPoint = ratioPoints[i];Point verPoint = points.get((i + 1) % size);int dx = ratioPoint.x - verPoint.x;int dy = ratioPoint.y - verPoint.y;Point controlPoint1 = new Point(midPoints[i].x - dx, midPoints[i].y - dy);Point controlPoint2 = new Point(midPoints[(i + 1) % size].x - dx, midPoints[(i + 1) % size].y - dy);controlPoints[j++] = ratioPointConvert(controlPoint1, verPoint, k);controlPoints[j++] = ratioPointConvert(controlPoint2, verPoint, k);}// 用三阶贝塞尔曲线连接顶点Path path = new Path();paint.setColor(color);paint.setStrokeWidth(strokeWidth);paint.setStyle(Paint.Style.STROKE);for (int i = 0; i < size; i++) {Point startPoint = points.get(i);Point endPoint = points.get((i + 1) % size);Point controlPoint1 = controlPoints[(i * 2 + controlPoints.length - 1) % controlPoints.length];Point controlPoint2 = controlPoints[(i * 2) % controlPoints.length];path.reset();path.moveTo(startPoint.x, startPoint.y);path.cubicTo(controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, endPoint.x, endPoint.y);canvas.drawPath(path, paint);}}/*** 计算两点之间的距离*/private static double distance(Point p1, Point p2) {return Math.sqrt(((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)));}/*** 比例点转换*/private static Point ratioPointConvert(Point p1, Point p2, double ratio) {Point p = new Point();p.x = (int) (ratio * (p1.x - p2.x) + p2.x);p.y = (int) (ratio * (p1.y - p2.y) + p2.y);return p;}
}
调用
DrawUtil.drawCurvesFromPoints(canvas, points, 0.6, Color.WHITE, 2f)
Android 穿过点画平滑曲线相关推荐
- 经过离散点画平滑曲线(贝塞尔3次)
穿过已知点画平滑曲线(3次贝塞尔曲线) 2011-04-11 18:59 8469人阅读 评论(9) 收藏 举报 float 数学计算 variables 图形 搜索引擎 bi 为了把一串点连成光滑的 ...
- 穿过已知点画平滑曲线(3次贝塞尔曲线)
首先,我们计算出多边形所有边线的中点,Ai. 然后连接起相邻边中点,得到很多线段,记为 Ci .并用图记的方法计算出 Bi 点. 最后一步,只需要简单地将 Ci 进行平移,平移的路径就是每条线段上 B ...
- java 三次贝塞尔曲线算法_转:穿过已知点画平滑曲线(3次贝塞尔曲线)
Interpolation with Bezier Curves 贝塞尔插值 A very simple method of smoothing polygons 一种非常简单的多边形平滑方法 翻译 ...
- 静态网站生成器_什么是JAMStack?它与静态网站生成器有何区别?
静态网站生成器 Two ideas, JAMStack and static website generators, are getting attention as a way to simplif ...
- 系统在此应用程序堆栈溢出_Web应用程序:在开始之前选择正确的技术堆栈
系统在此应用程序堆栈溢出 You have a great online business idea along with investors and a team ready to get behi ...
- 多媒体艺术家jaime levy在网站甚至还没有存在之前就处于网页设计的最前沿
By Claire Evans 克莱尔·埃文斯(Claire Evans) Jaime Levy's real name is not Jaime. She won't tell me what he ...
- 阅读书《电子电路原理》截取的一些最核心的思想,找了个课程上海交通大学 郑益慧主讲做辅助(保证基本的理解是对的)。电路要以基本特性为基础从设计角度理解
一.戴维南 和 诺顿 物理量 过程 戴维南等效 诺顿等效 步骤 l 将负载电阻开路 将负载电阻短路 步骤 2 计算或测量开路电 压, 即戴维南电压 计算或测量短路电流,即诺顿电流 步骤 3 将电压源短 ...
- android 贝塞尔曲线,即3点画弧线
如题,已知3点画弧线 主要方法为: path.moveTo(x1,y1);//设置起点 path.quadTo(x2,y2,x3,y3);//3点画弧 //x2,y2表示为中点坐标,x3,y3表示终点 ...
- Android高德地图添加点连点画线
说明: 最近碰到一个需求,需要在高德地图上选择航点,然后连线,最后形成一个路线图,把点的信息,用json文件的格式存储起来 效果图: 1.先集成高德地图 app目录下的builder文件,直接添加高 ...
最新文章
- 为什么 Java 后端开发没有大规模采用 Kotlin?
- Android - Android Studio 解决访问被墙的问题
- 干货推荐 | 如何设计按钮?
- SQL-Server使用点滴(一-数据对象篇)
- 什么时候出python4_什么?Python4要来了?快来看看Python之父怎么说
- python三维图的坐标_用Python 画个六维图,涨姿势了
- PingCAP联合创始人兼CTO黄东旭:致力于打造全球最好的分布式数据库
- linux中使用Vsftpd+nginx 搭建文件服务器
- 超难的75道逻辑思维题
- 一段关于中国人口老龄化的评论
- c++ 11 中for循环新增的用法(基于范围的for循环)
- 维纶触摸屏程序实际项目,威纶通界面UI
- 防止跨站攻击——CSRFToken
- 霍夫曼树和霍夫曼编码原理
- 《博德之门3》的许多设计,还不如上世纪的前作
- 2019暑期建模培训简单总结
- php cms下载地址,下载phpcms详细步骤
- Spring Autowire自动装配(转http://lep1985520.blog.163.com/blog/static/56600480200901441338486/)
- C#毕业设计——基于C#+asp.net+sqlserver的设备管理系统设计与实现(毕业论文+程序源码)——设备管理系统
- 机器学习与统计建模 —— 差异和联系