首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

map的边界

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

地图的边界
将 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,就需要对图做预处理了,否则速度就太慢了。

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


[解决办法]


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 map的边界
[解决办法]
用栈模拟递归也可以做到不溢出,不过也是比较麻烦,我就不追求完美了。

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


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

[解决办法]
顶20楼,23楼
[解决办法]
make
[解决办法]
LOVE
[解决办法]
希望斑竹推荐一下此帖,方便大家日后查找。
[解决办法]
阿弥陀佛,新婚期间,要保重哦。
[解决办法]
o,,,,
[解决办法]
Let me see see。 

[解决办法]
map的边界map的边界

[解决办法]
学习!
关注!
[解决办法]
up
[解决办法]
关注照片那个、、、、
[解决办法]
ding 
[解决办法]
学习
[解决办法]
怎么这样理解呢?!
------解决方案--------------------


up
[解决办法]
学习
[解决办法]


[解决办法]
直接把它分块保存成一个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

热点排行