找到给定形状的外线

时间:2015-05-11 06:52:59

标签: ios objective-c math

我有各种固体形状,我需要找到外线。

我从API中获取形状,作为形状中每个像素的x,y坐标列表。我想删除"填充点"所以我只有一个"外线"的列表,这个图像中的红色像素:

enter image description here

如何做到这一点?

2 个答案:

答案 0 :(得分:1)

如果打开该图像并放大图像,您可以很容易地看到红色像素与蓝色像素之间的区别:红色像素在正上方,下方,左侧或者至少有一个白色像素它的右侧,而蓝色像素为零。对角线不算数。

因此,在给定像素坐标列表的情况下,您可以使用以下算法找到形状的外线(红色像素):

  • 如果它们还没有,则将所有像素坐标转换为整数。
  • 遍历列表中的所有点,找到min和max x和y坐标。
  • 创建一个大小为[(max y - min y)+ 1] [(max x - min x)+ 1]的数组,并将所有元素设置为0
  • 遍历列表中的所有点并将数组[point y - min y] [point x - min x]设置为1
  • 为外线坐标创建一个空列表
  • 遍历数组,并为每个元素数组[y] [x]:
    • 如果array [y] [x]等于1 AND(array [y-1] [x]等于0 OR OR array [y + 1] [x]等于0 OR OR array [y] [x-1]等于0 OR数组[y] [x + 1]等于0),然后:
      • 将(x + min x,y + min y)添加到外线点列表中。

注意(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];

希望这对你有所帮助,快乐编码..