为什么要这么干?
上一篇文章讲到的三个点构造曲线,这三个点是不能在一条直线上的。所以控制点是可以通过两个点来算出来的,另外这种计算也有其他的用法。
三角函数方法
如何获得线段上的点?
c = a+(b-a)*p;
其实就是a到b过程中的百分比
而其实这个p可以取之在0~1以外的任意数,这也可以增加你对算法,运动能的扩展知识。(这里不讲这些)
如何获得直线外的点,又恰好连接c点,并与ab线相交为垂线
对这个c点做垂线上的点如何获得:
取在直线上取非c点的任意点,这个点到c点点距离为垂线点长度L,并将此点以c点为原点旋转90度,获得的点d和c点组成的直线,就是ab线的垂线
d.x = c.x + Math.cos(PI/2)*L;
d.y = c.y + Math.sin(PI/2)*L;
涉及到空间旋转,就需要分别去考虑x和y了,而之前的操作可以把x,y算法简化成一维逻辑去处理,因为之前对应x,y的算法是相同的。
垂线上的任意点
想获得cd线上的点很简单,同第一步获得线段上的点是一样的
e = c+(d-c)*p;
如何获得精确的位置点而不是比例
之前的算法都是获得相对两点的比例,而如果想控制精确的位置,则需要做一些约束
c = a+(b-a)*p;
//并且,约束一定长度
Len(c-a) = L0; 分解为
(cy-ay)²+(cx-ax)² = L0²;
笛卡尔坐标转换方法
获得pa,pb线的方程
a*x1+b = y1;
a*x2+b = y2;
此公式的计算机代码为
a = (y1-y2)/(x1-x2); //然后你发现a就是斜率
b = (x1*y2-x2*y1)/(x1-x2); //b是直线在x点为0时y的值, 这里记b=1
通过pa,pb带入公式,获得a,b的值
坐标系变化
ax+by+c=0 (a!=0) 简化公式为 ax+y+c = 0;
x-ay+ m = 0;
(x+m)/a = y;
//获得m值
m = ay - x;
将a,b,pc点的位置带入公式,就可以获得m的值 (c点通过ab线段获取),即两个线段的焦点