【发布时间】:2013-12-06 06:27:03
【问题描述】:
我可以使用贝塞尔路径绘制曲线,但我不想指定两个控制点,而是指定路径经过它的两个点,如下所示
起点为(10,90),终点为(70,70),曲线经过(20, 50),即为峰值点。和 (60,100)。请告诉我如何绘制它。
【问题讨论】:
-
见stackoverflow.com/questions/6054002/…。希望这会有所帮助。
我可以使用贝塞尔路径绘制曲线,但我不想指定两个控制点,而是指定路径经过它的两个点,如下所示
起点为(10,90),终点为(70,70),曲线经过(20, 50),即为峰值点。和 (60,100)。请告诉我如何绘制它。
【问题讨论】:
来自维基百科的“贝塞尔曲线”文章:
任何 4 个不同点的任何系列都可以转换为按顺序通过所有 4 个点的三次贝塞尔曲线。给定某三次贝塞尔曲线的起点和终点,以及沿该曲线依次排列的任意两个不同点,即可恢复原始贝塞尔曲线的控制点。[3]
最后链接到http://people.sc.fsu.edu/~jburkardt/html/bezier_interpolation.html
【讨论】:
你可以使用UIBezierPath的addCurveToPoint:controlPoint1:controlPoint2:方法。
CGPoint startPt, endPt, cPt1, cPt2;
// init points here
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:startPt];
[path addCurveToPoint:endPt controlPoint1:cPt1 controlPoint2:cPt2];
【讨论】:
假设我们有四个点D0(x0,y0)、D1(x1,y1)、D2(x2,y2)、D2(x3,y3)。我们必须找到通过D0、D1、D2 和D3 的贝塞尔三次样条P0-P1-P2-P3。
显然,
P0 = D0
P3 = D2
那么通过方程定义的点D1和点D2有无数条贝塞尔样条
P2 = (D1 - (1-t1)^3 * P0 - t1^3 * P3) / (3*(1-t1)*t1^2) -
(1-t1) * P1/t1;
P2 = (D2 - (1-t2)^3 * P0 - t2^3 * P3) / (3*(1-t2)*t2^2) -
(1-t2) * P1/t2;
其中t1是点D1对应的贝塞尔曲线参数,t2是D2对应的参数。
解决这个方程组将给我们P1
P1 = t2*(D1 - (1-t1)^3 * P0 - t1^3 * P3) / (3*(1-t1)*t1*(t2-t1)) -
t1*(D2 - (1-t2)^3 * P0 - t2^3 * P3) / (3*(1-t2)*t2*(t2-t1));
我们仍然需要定义t1 和t2。只要它们不等于且不等于1,它们的值几乎可以是任何值。一个明显的选择是0.25 和0.75。
这是一组随机输入值的结果曲线
那么P1和P2就可以作为controlPoint1和controlPoint2在
UIBezierPath 的addCurveToPoint:controlPoint1:controlPoint2 方法。
【讨论】: