先上效果图

参考了这篇文章 穿过已知点画平滑曲线(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 穿过点画平滑曲线相关推荐

  1. 经过离散点画平滑曲线(贝塞尔3次)

    穿过已知点画平滑曲线(3次贝塞尔曲线) 2011-04-11 18:59 8469人阅读 评论(9) 收藏 举报 float 数学计算 variables 图形 搜索引擎 bi 为了把一串点连成光滑的 ...

  2. 穿过已知点画平滑曲线(3次贝塞尔曲线)

    首先,我们计算出多边形所有边线的中点,Ai. 然后连接起相邻边中点,得到很多线段,记为 Ci .并用图记的方法计算出 Bi 点. 最后一步,只需要简单地将 Ci 进行平移,平移的路径就是每条线段上 B ...

  3. java 三次贝塞尔曲线算法_转:穿过已知点画平滑曲线(3次贝塞尔曲线)

    Interpolation with Bezier Curves  贝塞尔插值 A very simple method of smoothing polygons 一种非常简单的多边形平滑方法 翻译 ...

  4. 静态网站生成器_什么是JAMStack?它与静态网站生成器有何区别?

    静态网站生成器 Two ideas, JAMStack and static website generators, are getting attention as a way to simplif ...

  5. 系统在此应用程序堆栈溢出_Web应用程序:在开始之前选择正确的技术堆栈

    系统在此应用程序堆栈溢出 You have a great online business idea along with investors and a team ready to get behi ...

  6. 多媒体艺术家jaime levy在网站甚至还没有存在之前就处于网页设计的最前沿

    By Claire Evans 克莱尔·埃文斯(Claire Evans) Jaime Levy's real name is not Jaime. She won't tell me what he ...

  7. 阅读书《电子电路原理》截取的一些最核心的思想,找了个课程上海交通大学 郑益慧主讲做辅助(保证基本的理解是对的)。电路要以基本特性为基础从设计角度理解

    一.戴维南 和 诺顿 物理量 过程 戴维南等效 诺顿等效 步骤 l 将负载电阻开路 将负载电阻短路 步骤 2 计算或测量开路电 压, 即戴维南电压 计算或测量短路电流,即诺顿电流 步骤 3 将电压源短 ...

  8. android 贝塞尔曲线,即3点画弧线

    如题,已知3点画弧线 主要方法为: path.moveTo(x1,y1);//设置起点 path.quadTo(x2,y2,x3,y3);//3点画弧 //x2,y2表示为中点坐标,x3,y3表示终点 ...

  9. Android高德地图添加点连点画线

    说明: 最近碰到一个需求,需要在高德地图上选择航点,然后连线,最后形成一个路线图,把点的信息,用json文件的格式存储起来 效果图: 1.先集成高德地图  app目录下的builder文件,直接添加高 ...

最新文章

  1. 为什么 Java 后端开发没有大规模采用 Kotlin?
  2. Android - Android Studio 解决访问被墙的问题
  3. 干货推荐 | 如何设计按钮?
  4. SQL-Server使用点滴(一-数据对象篇)
  5. 什么时候出python4_什么?Python4要来了?快来看看Python之父怎么说
  6. python三维图的坐标_用Python 画个六维图,涨姿势了
  7. PingCAP联合创始人兼CTO黄东旭:致力于打造全球最好的分布式数据库
  8. linux中使用Vsftpd+nginx 搭建文件服务器
  9. 超难的75道逻辑思维题
  10. 一段关于中国人口老龄化的评论
  11. c++ 11 中for循环新增的用法(基于范围的for循环)
  12. 维纶触摸屏程序实际项目,威纶通界面UI
  13. 防止跨站攻击——CSRFToken
  14. 霍夫曼树和霍夫曼编码原理
  15. 《博德之门3》的许多设计,还不如上世纪的前作
  16. 2019暑期建模培训简单总结
  17. php cms下载地址,下载phpcms详细步骤
  18. Spring Autowire自动装配(转http://lep1985520.blog.163.com/blog/static/56600480200901441338486/)
  19. C#毕业设计——基于C#+asp.net+sqlserver的设备管理系统设计与实现(毕业论文+程序源码)——设备管理系统
  20. 机器学习与统计建模 —— 差异和联系

热门文章

  1. 扫地机器人能过凸起地面吗_适用于不平整地面的智能扫地机器人的制作方法
  2. [译]声明式编程:它是一个真实的东西?
  3. beecloud轻松实现支付
  4. 小学奥数 7826 分苹果 python
  5. 时间序列之格兰杰因果关系检验(4)
  6. [Python]WEB编程--个人日记网站搭建(一)
  7. 面向对象的特点?对象模型、动态模型和功能模型3种模型之间的关系?
  8. img图片加载失败时,展示默认图片的方法
  9. 详解机器学习中的VC维
  10. 【前端:css画三角形】