我有各种固体形状,我需要找到外线。
我从API中获取形状,作为形状中每个像素的x,y坐标列表。我想删除"填充点"所以我只有一个"外线"的列表,这个图像中的红色像素:
如何做到这一点?
答案 0 :(得分:1)
如果打开该图像并放大图像,您可以很容易地看到红色像素与蓝色像素之间的区别:红色像素在正上方,下方,左侧或者至少有一个白色像素它的右侧,而蓝色像素为零。对角线不算数。
因此,在给定像素坐标列表的情况下,您可以使用以下算法找到形状的外线(红色像素):
注意(max y - min y)和(max x - min x)不要太大,否则在尝试分配数组时可能会出现内存不足错误。此外,为了在检查数组时避免索引超出边界错误,只需添加数组边缘的任何像素(x或y = 0,x或y = x或y数组大小-1),其中array [y] [x ]等于1到列表,避免其他检查。
答案 1 :(得分:0)
你可以使用CAShapeLayer, 这是如何实现这一目标的一个例子。
CAShapeLayer *shape = [CAShapeLayer layer];
shape.frame = self.label.bounds; // Give your created shape bounds
shape.path = maskPath.CGPath;
shape.lineWidth = 3.0f;
shape.strokeColor = [UIColor redColor].CGColor;
[self.label.layer addSublayer:shape];
您也可以使用UIBiezerPath连接点, 这是一个例子
UIBezierPath *aPath = [UIBezierPath bezierPath];
// Set the starting point of the shape.
[aPath moveToPoint:CGPointMake(100.0, 0.0)];
// Draw the lines.
[aPath addLineToPoint:CGPointMake(200.0, 40.0)];
[aPath addLineToPoint:CGPointMake(160, 140)];
[aPath addLineToPoint:CGPointMake(40.0, 140)];
[aPath addLineToPoint:CGPointMake(0.0, 40.0)];
// To make path closed you can use this
[aPath closePath];
希望这对你有所帮助,快乐编码..