gpt4 book ai didi

objective-c - objective-c 中的贝塞尔曲线算法需要调整

转载 作者:搜寻专家 更新时间:2023-10-30 20:06:36 28 4
gpt4 key购买 nike

我问了一个简短的问题 Bezier curve algorithm in objective-c这似乎解决了我的问题。我问这个新问题是因为我认为它足够不同,而不是重新利用旧问题。

我有一个看起来像工作的贝塞尔曲线算法,但与内置的 NSBezierPath 版本相比,存在一些主要问题。看起来某些类型的曲线非常扭曲。

Example Issues

从上图中可以看出区别,红线是我的功能,浅色是内置版本。我期待和精确匹配,一个像素一个像素,但正如您所看到的,红线有时会偏离路线。

我列出的第一个方法是调用 2 个 Bezier 方法的方法,它表明两个版本的输入相同。

- (void)MakeBezier
{
int x1 = [self getMegaNumber:2];
int y1 = self.frame.size.height - [self getMegaNumber:2];
int x2 = [self getMegaNumber:2];
int y2 = self.frame.size.height - [self getMegaNumber:2];
int x3 = [self getMegaNumber:2];
int y3 = self.frame.size.height - [self getMegaNumber:2];
int x4 = [self getMegaNumber:2];
int y4 = self.frame.size.height - [self getMegaNumber:2];
int cnt = [self getMegaNumber:2];

NSBezierPath *bezierPath = [[NSBezierPath alloc] init];
[bezierPath setLineWidth:1.0f];
[bezierPath moveToPoint:NSMakePoint(x1, y1)];
[bezierPath curveToPoint:NSMakePoint(x4, y4) controlPoint1:NSMakePoint(x2, y2) controlPoint2:NSMakePoint(x3, y3)];

// Draw path to image with build in NSBezierPath
[self drawPath:bezierPath fill:NO];

// Draw path with custom algorithm
[self drawBezierFrom:NSMakePoint(x1, y1) to:NSMakePoint(x4, y4) controlA:NSMakePoint(x2, y2) controlB:NSMakePoint(x3, y3) sections:cnt color:4];
}

下一个方法是用于在示例图像中绘制红线的自定义算法。

- (void)drawBezierFrom:(NSPoint)from to:(NSPoint)to controlA:(NSPoint)a controlB:(NSPoint)b sections:(NSUInteger)cnt color:(NSUInteger)color
{
float qx, qy;
float q1, q2, q3, q4;
int lastx = - 1, lasty;
int plotx, ploty;
float t = 0.0;

while (t <= 1)
{
q1 = t*t*t*-1 + t*t*3 + t*-3 + 1;
q2 = t*t*t*3 + t*t*-6 + t*3;
q3 = t*t*t*-3 + t*t*3;
q4 = t*t*t;

qx = q1*from.x + q2*a.x + q3*to.x + q4*b.x;
qy = q1*from.y + q2*a.y + q3*to.y + q4*b.y;

plotx = round(qx);
ploty = round(qy);

if (lastx != -1)
[self drawLineFrom:NSMakePoint(lastx, lasty) to:NSMakePoint(plotx, ploty) color:color];
else
[self drawLineFrom:NSMakePoint(from.x, from.y) to:NSMakePoint(plotx, ploty) color:color];

lastx = plotx;
lasty = ploty;
t = t + (1.0/(cnt + 0.0f));
}
[self drawLineFrom:NSMakePoint(lastx, lasty) to:NSMakePoint(to.x, to.y) color:color];
}

所以我的问题是;自定义算法是否已经过时,或者它只是缺少特定类型线路的边缘情况,还是其他?无论哪种方式,对于修复算法的任何帮助都将不胜感激。重申一下,我不是在寻找像素完美匹配,但我希望曲线排列在一起。

最佳答案

查看维基百科页面 here您的 q1-q4 系数似乎不正确。它们不应该是对称的吗?

似乎 to.x 和 b.x 应该交换:

qx = q1*from.x + q2*a.x + q3*to.x + q4*b.x;
qy = ...

关于objective-c - objective-c 中的贝塞尔曲线算法需要调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10466302/

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