地图的边界
将 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
[解决办法]
用栈模拟递归也可以做到不溢出,不过也是比较麻烦,我就不追求完美了。
明天有时间我可以做一个自动分块的程序,应该会比较有意思。
[解决办法]
如果用(x-1,y-1),(x+1,y+1),(x-1,y+1),(x+1,y-1)来判断的话,有时候会出现跨过边界的情况,
(除非边界的黑线是2个像素宽)
[解决办法]
不懂,友情帮顶
[解决办法]
我找到一个不会溢出的解决办法了,先根据地图产生一个内存二值图形,再对二值图形进行像素化处理,即断点的进行修复,多点的进行校正,以保证边界只有一个像素。然后在单击后,以单击点在二值图形发出一条射线寻找边界,然后沿这个边界点进行四连通移动,循环一周后结束,所经过的点即为边界点。大家看看怎么样?如果可行,晚上回来后出代码。
[解决办法]
赞一下楼上
[解决办法]
Ding.........
[解决办法]
顶20楼,23楼
[解决办法]
make
[解决办法]
LOVE
[解决办法]
希望斑竹推荐一下此帖,方便大家日后查找。
[解决办法]
[解决办法]
o,,,,
[解决办法]
Let me see see。
[解决办法]
[解决办法]
学习!
关注!
[解决办法]
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