高分请教一个算法,关于沿着一个不规则图形外沿走路的算法,要多少分,您说话。 我现在在写一个程序,在一张黑底的图上有一块白色的区域,现在我是要从起点开始沿着这个白色的区域的外沿走一圈,并记录每走一步的方向,每一个点都要走到,而且必须按实际的顺序走。我现在走了一圈下来有一些点走不到,请教各位高手有没有合适的算法可以解决这个问题,谢谢了,一定给分,要多少您说话,只要好用 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 方法1 扫描正张图,是白点(设为a)选周围8点比较或者4点if(memDC.GetPixel(a.x,a.y)==col) col=白点值{if(memDC.GetPixel(a.x+1,a.y)==memDC.GetPixel(a.x,a.y)&&memDC.GetPixel(a.x+1,a.y+1)==memDC.GetPixel(a.x,a.y)&&memDC.GetPixel(a.x,a.y+1)==memDC.GetPixel(a.x,a.y)&&memDC.GetPixel(a.x-1,a.y)==memDC.GetPixel(a.x,a.y)&&memDC.GetPixel(a.x-1,a.y+1)==memDC.GetPixel(a.x,a.y)&&.......................){AfxMessageBox("范围内");}else{AfxMessageBox("边界上");}}AfxMessageBox("界外");方法2 扫描正张图,每一行的第一个和最后一个白点就是边界或者每一列的第一个和最后一个白点就是边界方法1 方法2各有优缺点,你的那个就用方法2比较好(申明,我不搞计算机图形,这只是我的想法) 假设按逆时针走你要走的图象的为位图T1新建同样大小的一个位图T2记录你走过的边缘点。建立两个堆栈A1,A2A1,A2都用于记录走的方向,但是A2用于回朔A1只是记录方向假设起点为白色点吧,黑色同理可推:1。起点设置为当前点2。当前点的上下左右点的色彩构成4元矢量,(左颜色,下颜色,右颜色,上颜色),可以构成编码xxxx。1表示白色未走过边缘点,0表示黑色,*表示白色已走过边缘点3。判断编码有3*3*3*3=81种情况,要对每种情况进行处理,但只分为下面几类(只举特例不一一列举,你可以考虑) 例1:一般情况如01*0,方向向下压入两个堆。记录当前点到图T2.设当前点 为当前点下面的点。 例2:回朔:编码中没有1的情况如。将要退回原来点,A2出栈A1入栈。记录当前点到T2,根据A2出栈出来的方向把当前点退回到来路,从新判断,这个时候肯定原来来路的点上检查出的编码会发生变化,因为多出来了一个*号。所以判断也同原来的不同,不会再去走刚才回朔回来的点,有可能会继续回朔的情况。 例三:编码中有多个1也就是有多个方向可以走需要选择,通常,你只要按照一个顺序选比如来路是上的话也就是XXX*的情况按(左,下,右,上)的顺序确定走方向的优先级。如果来路是左按(下,右,上,左)确定优先级,如果来路是下按(右,上,左,下)确定优先级,如果来路是右按(上,左,下,右确定优先级)。(我晓得如果不按来的方向轮换优先级的话肯定会走到里面去)。4。在下一个当前点重复2,3部直到回到起点)。5。一切就OK了!Game over! 求助! 我现在想学习数据库 但我查了很多资料 都说的感觉很混乱 望高人指点一下 求助!VC视频 c语言能对EXCEL数据进行操作吗? listcontrol 双击后怎么获得所双击项的字符串 请大家帮忙看一下 一个hook的小问题,马上给分的! javascript 有没有类似COM中的unmashall流函数,要处理一个com返回的STA对象 MFC但文本程序输出字符问题 关于积分 送分了,50! 建议弄个黑名单如何?把那些倒分的家伙贴上去再坠上个骷髅,让他们千古留芳 哪里有DirectX9.0的设计时库啊,我下载的9.0为什么找不到.h.lib呀,帮帮我好吗?再线等
方法1 扫描正张图,是白点(设为a)选周围8点比较或者4点
if(memDC.GetPixel(a.x,a.y)==col) col=白点值
{
if(memDC.GetPixel(a.x+1,a.y)==memDC.GetPixel(a.x,a.y)&&
memDC.GetPixel(a.x+1,a.y+1)==memDC.GetPixel(a.x,a.y)&&
memDC.GetPixel(a.x,a.y+1)==memDC.GetPixel(a.x,a.y)&&
memDC.GetPixel(a.x-1,a.y)==memDC.GetPixel(a.x,a.y)&&
memDC.GetPixel(a.x-1,a.y+1)==memDC.GetPixel(a.x,a.y)&&
.......................)
{
AfxMessageBox("范围内");
}
else
{
AfxMessageBox("边界上");
}
}
AfxMessageBox("界外");
方法2 扫描正张图,每一行的第一个和最后一个白点就是边界
或者每一列的第一个和最后一个白点就是边界
方法1 方法2各有优缺点,你的那个就用方法2比较好
(申明,我不搞计算机图形,这只是我的想法)
你要走的图象的为位图T1
新建同样大小的一个位图T2记录你走过的边缘点。
建立两个堆栈A1,A2
A1,A2都用于记录走的方向,但是A2用于回朔A1只是记录方向
假设起点为白色点吧,黑色同理可推:
1。起点设置为当前点
2。当前点的上下左右点的色彩构成4元矢量,(左颜色,下颜色,右颜色,上颜色),可以构成编码xxxx。1表示白色未走过边缘点,0表示黑色,*表示白色已走过边缘点
3。判断编码有3*3*3*3=81种情况,要对每种情况进行处理,但只分为下面几类(只举特例不一一列举,你可以考虑)
例1:一般情况如01*0,方向向下压入两个堆。记录当前点到图T2.设当前点 为当前点下面的点。
例2:回朔:编码中没有1的情况如。将要退回原来点,A2出栈A1入栈。记录当前点到T2,根据A2出栈出来的方向把当前点退回到来路,从新判断,这个时候肯定原来来路的点上检查出的编码会发生变化,因为多出来了一个*号。所以判断也同原来的不同,不会再去走刚才回朔回来的点,有可能会继续回朔的情况。
例三:编码中有多个1也就是有多个方向可以走需要选择,通常,你只要按照一个顺序选比如来路是上的话也就是XXX*的情况按(左,下,右,上)的顺序确定走方向的优先级。如果来路是左按(下,右,上,左)确定优先级,如果来路是下按(右,上,左,下)确定优先级,如果来路是右按(上,左,下,右确定优先级)。(我晓得如果不按来的方向轮换优先级的话肯定会走到里面去)。
4。在下一个当前点重复2,3部直到回到起点)。
5。一切就OK了!Game over!