4 Star 7 Fork 3

Eran / BezierMathUtils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

#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

ISSUE


原理

**注意! 以下内容为算法实现原理 首先无任何用处 其次需要有中学数学水平-.- **

用到的公式

  1. 一元二次方程组的标准解 公式:

  2. 已知线段AB求其垂直平分线 公式: y=-(x2-x1)/(y2-y1)* [x-(x1+x2)/2]+(y1+y2)/2

  3. 线段中点坐标求法

  • 这里补充说明一下,首先地址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两个

空文件

简介

和贝塞尔曲线相关的数学公式 展开 收起
ActionScript
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
ActionScript
1
https://gitee.com/eran/BezierMathUtils.git
git@gitee.com:eran/BezierMathUtils.git
eran
BezierMathUtils
BezierMathUtils
master

搜索帮助