地图的边界
将 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);
}
}
}