代码拉取完成,页面将自动刷新
#BezierMathUtils
BezierMathUtils是用来提供计算贝塞尔曲线时候需要用到的数学公式。
比如存在如下需求:
有两点坐标A和B,希望某一个物品从A点移动到B点. 移动方式希望采用贝塞尔曲线.
此时如何可以找到AB之间合适的控制点M(或M')成为解决这个问题的关键
本类库提供的两个函数正是为了解决这样的问题而设计的
public static function calculateABLinePerpendicularBisectorPointByOffsetPercent(...){}
public static function calculateABLinePerpendicularBisectorPoint(...){}
两个函数的作用都是确定点M坐标,从而确定贝塞尔曲线的控制点
- 给定AB两点坐标,同时指定其垂直平分线上的点M到AB中点之间的距离
M点满足条件:
- 一定在AB直线的垂直平分线上
- M点到AB中点O的长度MO为固定值,又调用函数指定
- 指定方式分为两种:
- 1`直接指定Offset(不推荐) 注意 function calculateABLinePerpendicularBisectorPoint 中接收的参数为offset的平方
- 2`指定Offset是线段AB长度的百分比 调用函数: calculateABLinePerpendicularBisectorPointByOffsetPercent
**注意! 以下内容为算法实现原理 首先无任何用处 其次需要有中学数学水平-.- **
已知线段AB求其垂直平分线 公式: y=-(x2-x1)/(y2-y1)* [x-(x1+x2)/2]+(y1+y2)/2
- 这里补充说明一下,首先地址Link过去的百度帖子少了一个括号,上面的公式中我已经补全
- 线段AB的垂直平分线在线性代数中满足逻辑:该函数上面任意一点M到线段AB端点的距离相等
- 因此可以根据这个逻辑建立等式=> ( X - Ax )^2 + ( Y - Ay )^2 = ( X - Bx )^2 + ( Y - By )^2
- 推导结果=>
- y = [ ( Ax^2 + Ay^2 ) - ( Bx^2 + By^2 ) ] / 2 * ( Ay -By ) - ( Ax - Bx ) / ( Ay - By ) X
- 我用该公式尝试了几组数据均正常,但是在代码中由于数值过大导致Number溢出 所以不适合用作计算。在网上找的公式应该为我推导出的公式的简化版,具体是否我也不知。如有了解请告知 谢谢
解:
根据公式3 得到直线AB的中点坐标O,其O点坐标的X,Y坐标分别用E,F代替 则:
(X-E)^2 + (Y-F)^2 = offset^2
连立等式 2) , 4) 可以求解出最后的X,Y
因为最后为 AX^2 + BX + C = 0 的标准一元二次方程组 所以解为两个,通过最上方的图片也可以看出解值为2两个
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型