地图的边界
将 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
[解决办法]
用栈模拟递归也可以做到不溢出,不过也是比较麻烦,我就不追求完美了。
明天有时间我可以做一个自动分块的程序,应该会比较有意思。