gpt4 book ai didi

iphone - 沿着简单的三次贝塞尔曲线找到给定距离的点。 (在 iPhone 上!)

转载 作者:行者123 更新时间:2023-12-03 18:22:04 30 4
gpt4 key购买 nike

假设您在 cocoa 应用程序中使用 curveToPoint:controlPoint1:controlPoint2: 创建了一条完全正常的四点贝塞尔曲线(两个点和两个控制点):

simple cubic bezier curve example
如何沿着曲线找到点(和切线)?

<小时/>

稍后:要获得基于下面 Michal 答案的完整、简化的解决方案,请点击:
Find the tangent of a point on a cubic bezier curve (on an iPhone)

只需复制并粘贴以下代码:https://stackoverflow.com/a/31317254/294884

最佳答案

计算位置背后有一些简单的数学原理,您可以在每一篇讨论贝塞尔曲线的论文中阅读到它,甚至在维基百科上也是如此。不管怎样,我可以与每个在代码中实际实现它时遇到麻烦的人联系,所以我编写了这个示例 UIView,因为它可能是让您入门的最简单方法。

#import "MBBezierView.h"

CGFloat bezierInterpolation(CGFloat t, CGFloat a, CGFloat b, CGFloat c, CGFloat d) {
CGFloat t2 = t * t;
CGFloat t3 = t2 * t;
return a + (-a * 3 + t * (3 * a - a * t)) * t
+ (3 * b + t * (-6 * b + b * 3 * t)) * t
+ (c * 3 - c * 3 * t) * t2
+ d * t3;
}

@implementation MBBezierView

- (void)drawRect:(CGRect)rect {
CGPoint p1, p2, p3, p4;
p1 = CGPointMake(30, rect.size.height * 0.33);
p2 = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect));
p3 = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect));
p4 = CGPointMake(-30 + CGRectGetMaxX(rect), rect.size.height * 0.66);

[[UIColor blackColor] set];
[[UIBezierPath bezierPathWithRect:rect] fill];

[[UIColor redColor] setStroke];

UIBezierPath *bezierPath = [[[UIBezierPath alloc] init] autorelease];
[bezierPath moveToPoint:p1];
[bezierPath addCurveToPoint:p4 controlPoint1:p2 controlPoint2:p3];
[bezierPath stroke];

[[UIColor brownColor] setStroke];
for (CGFloat t = 0.0; t <= 1.00001; t += 0.05) {
CGPoint point = CGPointMake(bezierInterpolation(t, p1.x, p2.x, p3.x, p4.x), bezierInterpolation(t, p1.y, p2.y, p3.y, p4.y));
UIBezierPath *pointPath = [UIBezierPath bezierPathWithArcCenter:point radius:5 startAngle:0 endAngle:2*M_PI clockwise:YES];
[pointPath stroke];
}
}

@end

这就是我得到的:

alt text

关于iphone - 沿着简单的三次贝塞尔曲线找到给定距离的点。 (在 iPhone 上!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4058979/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com