gpt4 book ai didi

ios - UIBezierPath lineWidth 基于 UIPanGestureRecognizer 的速度

转载 作者:行者123 更新时间:2023-11-29 02:08:42 26 4
gpt4 key购买 nike

我正在尝试弄清楚如何根据 UIPanGestureRecognizer 的速度构造有限范围的浮点值。我的最小值或起始值为 1.0,最大值为 3.0,为 UIBezierPathlineWidth 属性提供有限范围。

我正在尝试弄清楚如何根据 UIPanGestureRecognizer 的速度构建从 1.0 到 3.0 的指数范围,但我遇到了困难,我应该从哪里开始映射值。 x 和 y 组合速度越快,线宽应越小(低至 1.0),如果组合速度较慢,则分别相反,最高可达 3.0。我还尝试通过存储 lastWidth 属性来逐渐减小/平滑正在进行的线宽,以便子路径之间的过渡不明显。

如果能提供任何帮助,我将不胜感激。

基于答案的工作代码和最终代码:

@property (nonatomic, assign) CGFloat lastWidth;

if (recognizer.state == UIGestureRecognizerStateChanged)
{
CGPoint velocity = [recognizer velocityInView:self.view];

CGFloat absoluteVelocity = 1000.0 / sqrtf(pow(velocity.x, 2) + pow(velocity.y, 2));

CGFloat clampedVel = MAX(MIN(absoluteVelocity, 3.0), 1.0);

if (clampedVel > self.lastWidth)
{
clampedVel = self.lastWidth + 0.15;
}
else if (clampedVel < self.lastWidth)
{
clampedVel = self.lastWidth - 0.15;
}

self.lastWidth = clampedVel;

UIBezierPath *path = [UIBezierPath bezierPath];
path.lineCapStyle = kCGLineCapRound;
path.lineWidth = self.lastWidth;
}

最佳答案

所以我会使用倒指数函数。

从速度 V(x,y) 开始。你的绝对速度显然是:

sqrt(pow(x, 2) + pow(y, 2));

我们将这个值称为“v”。

接下来,我们需要一个介于 1 和 3 之间的值,其中 1 是“v”非常高的宽度,3 是“v”非常低的宽度。

我们可以使用以下指数函数来计算:

- (CGFloat)getExponentialWidthForVeloctity(CGFloat)v {
if (v <= 1 / 3.0)
return 3;
CGFloat inverse = 1 / v;
return 1 + inverse;
}

或者这个函数可以稍微平滑一下

- (CGFloat)getExponentialRootWidthForVeloctity(CGFloat)v {
//play with this value to get the feel right
//The higher it is, the faster you'll have to go to get a thinner line
CGFloat rootConstantYouCanAdjust = 2;
if (pow(v, rootConstantYouCanAdjust) <= 1 / 3.0)
return 3;
CGFloat inverse = 1 / pow(v, rootConstantYouCanAdjust);
return 1 + inverse;
}

如果感觉不合适,请尝试线性解决方案:

- (CGFloat)getLinearWidthForVelocity(CGFloat)v {
//Find this value by swiping your finger really quickly and seeing what the fastest velocity you can get is
CGFloat myExpectedMaximumVelocity = 1000;
if (v > myExpectedMaximumVelocity)
v = myExpectedMaximumVelocity;
return 3 - 2 * (v / myExpectedMaximumVelocity);
}

最后,作为奖励,尝试一下这个基于 sqrt 的函数,您可能会发现它效果很好:

- (CGFloat)getSqrtWidthForVelocity(CGFloat)v {
//find the same way as above
CGFloat myExpectedMaximumVelocity = 1000;
if (v > myExpectedMaximumVelocity)
return 1;
return 3 - 2 * sqrt(v) / sqrt(myExpectedMaximumVelocity);
}

我很想知道哪个效果最好!让我知道。我还有很多其他功能,这些只是一些非常简单的功能,应该可以帮助您入门。

关于ios - UIBezierPath lineWidth 基于 UIPanGestureRecognizer 的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29504711/

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