如何获得线段外垂线上的点?

为什么要这么干?

上一篇文章讲到的三个点构造曲线,这三个点是不能在一条直线上的。所以控制点是可以通过两个点来算出来的,另外这种计算也有其他的用法。

三角函数方法

如何获得线段上的点?

c = a+(b-a)*p;

其实就是a到b过程中的百分比


如何获得线段外垂线上的点?_第1张图片

而其实这个p可以取之在0~1以外的任意数,这也可以增加你对算法,运动能的扩展知识。(这里不讲这些)


如何获得线段外垂线上的点?_第2张图片

如何获得直线外的点,又恰好连接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的算法是相同的。


如何获得线段外垂线上的点?_第3张图片

垂线上的任意点

想获得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的值

通过pa,pb带入公式,获得a,b的值

坐标系变化
ax+by+c=0 (a!=0 b!=0) 的垂线是

bx-ay+ m = 0;
(bx+m)/a = y;
//获得m值
m = ay - bx;

将a,b,pc点的位置带入公式,就可以获得m的值 (c点通过ab线段获取),即两个线段的焦点

你可能感兴趣的:(如何获得线段外垂线上的点?)