原文地址:http://www.blogbus.com/linxinboy-logs/261546856.html
上次写了个求凸状的图形内像素点,本来以为求任意形状 包括凹状的图形内的像素点比较麻烦。 后来仔细想了一下,其实很简单。
比如这张图:
如何求黑色线条内部的点呢?
很简单。
首先 我们定义一个节点类
public class PointInt
{
public var x:int;
public var y:int;
public var left:Boolean = false;;
public var right:Boolean = false;;
public var up:Boolean = false;;
public var down:Boolean = false;;
public var block:Boolean = false;
public function get fullConnected():Boolean
{
return left && right && up && down;
}
public function PointInt(x:int = 0, y:int = 0, block:Boolean = false)
{
this.x = x;
this.y = y;
this.block = block;
}
}
其中 x y 为节点位置 上下左右 分别标记当前节点是否 有找到它上下左右的节点 比如 (0,0)节点 如果找到右边的节点(1,0)则(0,0)的right标记为true, (1,0)的left标记为true. block表示是否是黑色线条区域,即边界。
然后 我们找到边界区域的最大最小 x, y值 minX, maxX minY maxY
我们做一个一个矩形 左上点为 (minX - 1, minY - 1) 右上点为 (maxX + 2, maxY + 2)
如图
所以 此块区域内的第一行节点 肯定是处于线条外部(如果 min http:// X - 1
我们把第一行的节点全部push到一个list中去。
然后遍历这个list 中的节点 如果它不是fullConnected 即它没有找到它上下左右的所有节点 则寻找它没有找到的节点 , push进list
直到list中的所有节点都为fullConnected.
这个过程可以如下看到: 点击以后开始运行
http://files.cnblogs.com/v-miclin/PtInShapeTest.swf
你可一看到 边缘外部像素 好像注水一样逐渐注入 最后整个矩形非外部的像素即为边缘内部像素。
最后的结果:
源码: 不给。