读书人

地图的边界解决思路

发布时间: 2012-01-26 19:40:46 作者: rapoo

地图的边界
将 http://usinfo.org/zhcn/GB/E-JOURNAL/EJ_Snapshot/map.jpg 加载到picturebox 控件中,移动鼠标到picturebox,

返回鼠标所在州的边界坐标?


[解决办法]
Let me see see。

[解决办法]
取得图像的边界数据,产生一个区域数组,然后使用API PtInRegion就可以了。
不过由于不是标准位图,需要处理一下色差。
[解决办法]
我看了图了,从性能考虑,不是在单击后计算,而是事先计算好各最小不规划图形边界点数组,然后在单击时进行比较就行了。
[解决办法]
自己编个函数来检索,如何?
[解决办法]
mark
[解决办法]
我看了图了,从性能考虑,不是在单击后计算,而是事先计算好各最小不规划图形边界点数组,然后在单击时进行比较就行了。
那是的,不过这个事先得到这个边界,还是要代码的,这个可以用区域生长法变相得到。
[解决办法]
mark,up
[解决办法]
用C#的picturebox写了一个,用的是dfs,效率不高,且有溢出的情况(用bfs就不会,但程序会负责一些,我就偷懒了),
northwolves兄凑合看吧,程序对于原图要求比较高,必须是封闭的,而且边界只能是黑色的,适用于mouse_click的情况,
如果是mouse_move,就需要对图做预处理了,否则速度就太慢了。

预处理的方法,可以先按照黑色边框,将图内的所有区域划分成块,然后用矩阵保存每个点对应的块的编号,
当鼠标移动到图上的某个点时,根据矩阵中对应的块编号,做显示刷新。


[解决办法]

C# code
using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System.Windows.Forms;namespace picbsftest{    public partial class Form1 : Form    {        private Bitmap bmpBack;        private bool[,] matrix;        public Form1()        {            InitializeComponent();            bmpBack = new Bitmap(pictureBox1.Image);        }        private void pictureBox1_MouseClick(object sender, MouseEventArgs e)        {            Bitmap bmpnew = new Bitmap(bmpBack);            matrix = new bool[bmpBack.Width, bmpBack.Height];            dfs(e.X, e.Y, bmpnew, 0);//根据所有黑框里面的点生成轮廓(红色)            for (int i = 1; i < matrix.GetLength(0) - 1; i++)            {                for (int j = 1; j < matrix.GetLength(1) - 1; j++)                {                    if (matrix[i, j])                    {                        if (!matrix[i - 1, j])                            bmpnew.SetPixel(i - 1, j, Color.Red);                        if (!matrix[i + 1, j])                            bmpnew.SetPixel(i + 1, j, Color.Red);                        if (!matrix[i, j - 1])                            bmpnew.SetPixel(i, j - 1, Color.Red);                        if (!matrix[i, j + 1])                            bmpnew.SetPixel(i, j + 1, Color.Red);                    }                }            }            pictureBox1.Image = bmpnew;        }//用dfs找到所有黑框里面的点        private void dfs(int x, int y, Bitmap bmp, int level)        {            if (x < 0 || y < 0 || x >= bmp.Width || y >= bmp.Height)                return;            if (matrix[x, y])                return;            if (bmp.GetPixel(x, y).ToArgb() == -16777216)                return;            matrix[x, y] = true;            dfs(x - 1, y, bmp, level + 1);            dfs(x + 1, y, bmp, level + 1);            dfs(x, y - 1, bmp, level + 1);            dfs(x, y + 1, bmp, level + 1);        }    }}
[解决办法]
mark
[解决办法]
litaoye 越界了。
期待 laviewpbt
[解决办法]
用栈模拟递归也可以做到不溢出,不过也是比较麻烦,我就不追求完美了。


明天有时间我可以做一个自动分块的程序,应该会比较有意思。

探讨
litaoye 越界了。
期待 laviewpbt

[解决办法]
如果用(x-1,y-1),(x+1,y+1),(x-1,y+1),(x+1,y-1)来判断的话,有时候会出现跨过边界的情况,
(除非边界的黑线是2个像素宽)

探讨
感谢litaoye

就按最简单的来:

边界是黑色的
mouse_click

似乎(x-1,y-1),(x+1,y+1)与(x,y)也是相邻的。

[解决办法]
不懂,友情帮顶
[解决办法]
我找到一个不会溢出的解决办法了,先根据地图产生一个内存二值图形,再对二值图形进行像素化处理,即断点的进行修复,多点的进行校正,以保证边界只有一个像素。然后在单击后,以单击点在二值图形发出一条射线寻找边界,然后沿这个边界点进行四连通移动,循环一周后结束,所经过的点即为边界点。大家看看怎么样?如果可行,晚上回来后出代码。
[解决办法]

赞一下楼上
[解决办法]
Ding.........

[解决办法]
顶20楼,23楼
[解决办法]
make
[解决办法]
LOVE
[解决办法]
希望斑竹推荐一下此帖,方便大家日后查找。
[解决办法]
探讨
LOVE

[解决办法]
o,,,,
[解决办法]
Let me see see。

[解决办法]
探讨
引用:
LOVE


阿弥陀佛,新婚期间,要保重哦。

[解决办法]
学习!
关注!
[解决办法]
up
[解决办法]
关注照片那个、、、、
[解决办法]
ding
[解决办法]
学习
[解决办法]
怎么这样理解呢?!
[解决办法]
up
[解决办法]
学习
[解决办法]
探讨
引用:
LOVE


阿弥陀佛,新婚期间,要保重哦。

[解决办法]
直接把它分块保存成一个HRGN list或者数组,例如
typedef struct {
HRGN hRgn; // 区域
int numOfRgn; // 第N个
POINT *pt; // 边界数组
} MAP_RGN;
MAP_RGN map[xx];
移动mouse时,search这个list.
for( int i = 0; i < xx; ++i )
if( PtInRegion( map[i].Rgn, mouse.x, mouse.y ) )
return map[i].pt or return other~~


不是动态加载的位图,没人理你怎么实现的吧? 只要响应快狠准.
[解决办法]
mark

读书人网 >VB

热点推荐