模拟贝塞尔曲线(isPointInPath)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟贝塞尔曲线(isPointInPath)相关的知识,希望对你有一定的参考价值。
参考技术A bezierCurveTo(cpx,cpy,cpx2,cpx2,dx,dy);创建一条表示贝塞尔曲线的路径.该函数接受六个参数,分别代表三个点.
(cpx,cpy),(cpx2,cpx2)代表控制点,决定曲线的形状
(dx,dy)代表终点
是 Canvas 2D API 用于检测某点是否在路径的描边线上的方法。返回值是一个布尔值,当这个点在路径的描边线上,则返回true,否则返回false。
首先强调isPointInPath(x,y)方法是针对路径的,比如canvas中的rect、arc方法都可以用,但是fillRect不可以用,因为它不是路径;而且仅对当前的路径有效,而且如果当前路径有多个子路径(currentPath可以有多个subPath:比如进行了rect()之后,再进行arc(),最后关闭路径,进行stroke,那么rect()和arc()所绘制的就是当前路径的两个子路径),只对第一个子路径有效
所以要在每次判断之前要创建要移动的元素
利用点击该点的位置到圆心的距离与半径相比,如果大于半径,则表明点击的位置不在小球内部,反之,则在小球内部
Android UI贝塞尔曲线 ② ( 二阶贝塞尔曲线公式 | 三阶贝塞尔曲线及公式 | 高阶贝塞尔曲线 )
文章目录
贝塞尔曲线参考 : https://github.com/venshine/BezierMaker
一、二阶贝塞尔曲线公式
二阶贝塞尔曲线公式如下 :
B ( t ) = ( 1 − t ) 2 P 0 + 2 t ( 1 − t ) P 1 + t 2 P 2 , t ∈ [ 0 , 1 ] B(t) = (1- t)^2P_0 + 2t(1-t)P_1 + t^2P_2, t \\in [0,1] B(t)=(1−t)2P0+2t(1−t)P1+t2P2,t∈[0,1]
P 0 , P 1 , P 2 P_0 , P_1 , P_2 P0,P1,P2 是给定的 平面中的 3 3 3 个点 , P 0 P_0 P0 是 曲线起始点 , P 2 P_2 P2 是 曲线结束点 , P 1 P_1 P1 是控制点 ;
t t t 的取值范围是 0.0 0.0 0.0 ~ 1.0 1.0 1.0 ;
二、三阶贝塞尔曲线
上图中 , P 0 P_0 P0 点是起始点 , P 3 P_3 P3 点是终止点 , P 1 P_1 P1 和 P 2 P_2 P2 点是控制点 ;
三阶贝塞尔曲线公式如下 :
B ( t ) = ( 1 − t ) 3 P 0 + 3 t ( 1 − t ) 2 P 1 + 3 t 2 ( 1 − t ) P 2 + t 3 P 3 , t ∈ [ 0 , 1 ] B(t) = (1- t)^3P_0 + 3t(1-t)^2P_1 + 3t^2(1-t)P_2 + t^3P_3, t \\in [0,1] B(t)=(1−t)3P0+3t(1−t)2P1+3t2(1−t)P2+t3P3,t∈[0,1]
先根据比例 , 绘制出 P 0 P_0 P0 与 P 2 P_2 P2 之间的二阶贝塞尔曲线 , 以 P 1 P_1 P1 为控制点 , 绘制出直线 A B AB AB ;
然后 绘制 P 1 P_1 P1 与 P 3 P_3 P3 之间的二阶贝塞尔曲线 , 以 P 2 P_2 P2 为控制点 , 绘制出直线 B C BC BC ;
最后 计算 A A A 到 C C C 之间的 二阶贝塞尔曲线 , 以 B B B 点作为 控制点 ;
三阶贝塞尔曲线动态绘制流程 :
三、高阶贝塞尔曲线
B ( t ) = ∑ i = 0 n ( n i ) P i ( 1 − t ) n − i t i B(t) = \\sum_i = 0^n \\dbinomni P_i (1-t)^n - it^i B(t)=i=0∑n(in)Pi(1−t)n−iti
= ( n 0 ) P 0 ( 1 − t ) n t 0 + ( n 1 ) P 1 ( 1 − t ) n − 1 t 1 + ⋯ = \\dbinomn0 P_0 (1-t)^nt^0 + \\dbinomn1 P_1 (1-t)^n - 1t^1 + \\cdots =(0n)P0(1−t)nt0+(1n)P1(1−t)n−1t1+⋯
+ ( n n − 1 ) P n − 1 ( 1 − t ) 1 t n − 1 + ( n n ) P n ( 1 − t ) 0 t n , t ∈ [ 0 , 1 ] + \\dbinomnn-1 P_n-1 (1-t)^1t^n -1 + \\dbinomnn P_n (1-t)^0t^n , t \\in [0,1] +(n−1n)Pn−1(1−t)1tn−1+(nn)Pn(1−t)0tn,t∈[0,1]
上述公式中 i i i 是贝塞尔曲线的阶数 ;
四阶贝塞尔曲线 :
五阶贝塞尔曲线 :
以上是关于模拟贝塞尔曲线(isPointInPath)的主要内容,如果未能解决你的问题,请参考以下文章