如何存放边界点?? 谢谢!急急急急急急急急~~~~~
给定一个二维点数组。为方便看如下矩阵:
00000000000000000000000000000
00000000000000000000000000000
00111111111111111111000000000
00100000000000000000111000000
00100000000000000000001000000
00100000000000000000001000000
00100000000000000000001000000
00101111111111111111111000000
00101000000000000000000000000
00111000000000000000000000000
00000000000000000000000000000
其中0的点为空,1的点为某闭合折线。
现在我的问题是,如何用一个CPoint数组来存放这些折线上的所有点。使得这些点沿折线顺(逆)时针方向存放在数组上。
也就是说如果CPoint[0]为初始节点的话,CPoint[ncounts-1]为最后一个节点。注意:ncounts为已知的,表示折线上点的数目。
先谢过大家了!
个人的主要问题是如何判断某点的前一个点和后一个点是什么?
请发表你们的看法,为我出谋划策。
急盼!
[解决办法]
如果是多边形,无论是不是凸包,都只需用多边形的顶点表示就可以.
但如果是任意的图形(2值),则一般用“链码”表示最合理.
[解决办法]
对于以下图形,
00000000000000000000000000000
00000000000000000000000000000
00111111111111111111000000000
00100000000000000000111000000
00100000000000000000001000000
00*00000000000000000001000000
00100000000000000000001000000
00101111111111111111111000000
00101000000000000000000000000
00111000000000000000000000000
00000000000000000000000000000
不妨设*为起点,则整个边界可用
666600220000000000000000222244344444444444444444666
来表示。
其中第1,2,3,4为6,代表向下;
接着第5,6个为0,代表向右走,
接着第7,8个为2,代表向上走,
等等
这样依此下去,直到回到起始点结束。
[解决办法]
对不起,我上面将题目复杂化了。
可以更简单:
选取起始点。扫描矩阵,任意选择一个值为1的点p(x,y)作为起始点。
存储起始点的坐标。
对点p附近的8个点依次扫描(扫描顺序可以存在一个数组内),若发现一个点q值为1,将q看做p的后继节点,存储p点的坐标。
对点q,依次扫描其附近的8个点,考虑两个特殊情况:
1:若附近点的坐标为前驱节点的坐标,舍去,继续扫描;
2:若附近点的坐标为起始节点的坐标,问题得解,终止。
除这两中情况外,只要发现某点的值为1,就将起视为后继节点。如此一直扫描下去就可以了。
扫描顺序的表示:可用下一个节点的坐标偏移来表示扫描顺序。
比如,用8个向量表示:(1,0),(0,1),(-1,0),(0,-1),(1,1),(1,-1),(-1,0),(-1,-1)。
将上述8个向量按某种次序存入数组Dir[],那么,扫描当前点g(x,y)附近的8个点,只要对Dir[]扫描一遍,令向量temp=(x,y)+Dir[i](0 <=i <8),检查向量temp所表示的点的值,就可以了。
[解决办法]
没有必要按照顺时针还是逆时针。