一个拉选框的制作

来源:互联网 发布:王思聪 霍顿 知乎 编辑:程序博客网 时间:2024/04/29 05:26
我做了一个区块栏
但是当前的功能只能选中一个格子 

他看起来就是这样的   
但是功能很薄弱只能选择一个区域(32x32)

如果我想复制这个 4 x 5 的树 那么我就要点20次
所以我做了一个可以让鼠标产生一个拉框的功能 
 int rx = tileClickStartX < tileClickEndX ? tileClickStartX : tileClickEndX; int ry = tileClickStartY < tileClickEndY ? tileClickStartY : tileClickEndY; int rw = Math.Abs(tileClickStartX - tileClickEndX); int rh = Math.Abs(tileClickStartY - tileClickEndY); tileClickingRect = new Rectangle(rx,ry,rw,rh);


同时后台我也将数据简化了
简化到了    一个矩阵的起点坐标 和 结束坐标 


问题似乎得到了一定的解决
那么新的问题来了    我在后台的图片 是一个一维的数组储存的  那么如何 又有哪些编号被选中呢?



如果用视觉去数的话 很直观
但是用代码我们得换一下思维去想如何处理这种数学转化
我们可以知道  10 对应的坐标是  2 , 1 
x = 2 
y = 1
而 一列(c) = 8
所以对应公式就是    y * c + x 
相同的  47 的坐标分别是 x7y5
5 * c(8) + 7  = 47
现在我们知道了 格子的编号 与其坐标的对应关系
那么我们先来看看第一列 
也就是   编号10 ~ 15 
的变化

 他们的Y坐标没啥变化
那么  推导一下
 y * c + x 
 1 * 8 + (2~7)   
2~7 是连续的数字 所以我们如果用一个 for循环 (int x = 2 ; x<= 7 ;x++) 就可以解决  10~15的编号了

 那么我们再来看一下  10 18  26 34  42 这一列
也就是粉色的这一列
他们的 x坐标都没变
也就是说  y是一个变量
y * 8 + 2 
而y 的范围是 1 ~ 5
(1~5) * 8 +2   结果就是粉色这一列的编号

我们把一开始得到的 公式和刚刚得到的公式组合一下 (StartY < EndY) * Column + (StartX <  EndX)



for(int y = StartY ;y<=EndY;y++){   for(int x = StartX;x<=EndX;x++){   int index = y * column + x;}}


0 0
原创粉丝点击