📄 grid.java
字号:
package data2;
import java.awt.*;
import java.util.*;
import java.awt.image.BufferedImage;
public class Grid {
/**
* 网格
*/
public final static String SEPRETOR="\n";//分隔符
private ArrayList inslst=new ArrayList();//总命令列表
public Dimension size=new Dimension();//图像实际大小
private int [] style={1,1,1,1};//风格
public Component container;//图像容器
public Grid(int w,int h,Component cmp)
{//初始化
init(w,h);
container=cmp;
}
public Grid(String serial,Component com)
{//初始化
container=com;
input(serial);
}
public void init(int w,int h)
{//初始化
//清空队列
inslst.clear();
//初始化网格大小
size.setSize(w,h);
}
public final int[] getStyle(){return style;}
public void setStyle(int i[]){style=i;}
/*
* 指令操作
* */
public void addIns(Square ins)
{//添加指令
inslst.add(ins);
}
public Square[] getAllIns()
{//获得全部指令
Object[] obj=inslst.toArray();
Square ins[]=new Square[obj.length];
for(int i=0;i<obj.length;i++)
{
ins[i]=(Square)obj[i];
}
return ins;
}
public Square MakeIns()
{//自动创建一个命令
//1.检查当前的
Square itmp=null;
if(style!=null)
itmp=new Square(style);
else
itmp=new Square(size()+1);
itmp.number=size()+1;
//设定背景色
itmp.backcolor=getRandomColor();
if(container!=null) itmp.container=container;
if(size()==0)return itmp;//如果当前队列中没有元素那么就直接创建成功
//2.如果队列数量不为零,就监测序号合法性
int num[]=new int[size()],temp=0;
for(int i=0;i<num.length;i++)
num[i]=((Square)inslst.get(i)).number;
//排序
for(int i=0;i<num.length;i++)
for(int j=i+1;j<num.length;j++)
{
if(num[i]>num[j])
{
temp=num[i];
num[i]=num[j];
num[j]=temp;
}
}
//监测
for(int i=0;i<num.length-1;i++)
{
if(num[i+1]-num[i]>=2)
{
itmp.number=num[i]+1;
break;
}
}
return itmp;
}
public Square[] getIns(Rectangle rect)
{//获取该区域内的全部指令
ArrayList lst=new ArrayList();
Square itmp;
for(int i=0;i<inslst.size();i++)
{
itmp=(Square)inslst.get(i);
if(rect.contains(itmp.getCenter()))lst.add(itmp);
}
return Transform(lst.toArray());
}
public Square getIns(Square ins,int x,int y)
{//获取当前位置的命令
Square itmp;
for(int i=0;i<inslst.size();i++)
{
itmp=(Square)inslst.get(i);
if(itmp.contains(x,y) && itmp!=ins)return itmp;
}
return null;
}
public Square getIns(int x,int y)
{//获取当前位置的命令
Square itmp;
for(int i=0;i<inslst.size();i++)
{
itmp=(Square)inslst.get(i);
if(itmp.contains(x,y))return itmp;
}
return null;
}
public Object[] getIns(int number)
{//获取当前位置的命令
Square itmp;
ArrayList lst=new ArrayList();
for(int i=0;i<inslst.size();i++)
{
itmp=(Square)inslst.get(i);
if(itmp.number==number)
lst.add(itmp);
}
return lst.toArray();
}
public void removeIns(Square i)
{//删除指令
inslst.remove(i);
}
public void removeIns(int number)
{//删除命令号相同的指令
Square itmp;
for(int i=0;i<inslst.size();i++)
{
itmp=(Square)inslst.get(i);
if(itmp.number==number)
inslst.remove(i);
}
}
public int size()
{//获取数量
return inslst.size();
}
public void clear()
{//清空
inslst.clear();
}
public Square[] Transform(Object[] obj)
{//转换数组类型
Square itmp[]=new Square[obj.length];
for(int i=0;i<obj.length;i++)
itmp[i]=(Square)obj[i];
return itmp;
}
/*
* 坐标操作
* */
public Point getGrid(int x,int y)
{//获取网格位置
return new Point((x-Global.START_X)/Global.LENGTH,y/Global.LENGTH);
}
public Point getGrid(Point p)
{//获取网格位置
return getGrid(p.x,p.y);
}
public Point getPos(int gx,int gy)
{//获取坐标位置
return new Point(gx*Global.LENGTH+Global.START_X,gy*Global.LENGTH);
}
public Point getPos(Point gp)
{//坐标位置
return getPos(gp.x,gp.y);
}
/*功能函数*/
public boolean LocateIns(Square ins,int x,int y)
{//将命令放在x,y|x,y指命令的location最接近的位置
Point pos=getPos(getGrid(x,y));
//System.out.println(pos);
//监测是否超出边界
if(pos.x*(size.width-pos.x-ins.getWidth())<0 || pos.y*(size.height-pos.y-ins.getHeight())<0)
return false;
//监测是否是标准位置
//if((size.height-pos.y)%ins.getHeight()!=0)return false;
//监测通过
Point foreloc=new Point(ins.getLocation());//存储位置
ins.setLocation(pos);
if(CheckIfOver(ins))
{//检测是否压在其他标签上
ins.setLocation(foreloc);
return false;
}
return true;
}
public boolean CheckIfOver(final Square stmp)
{//检查stmp是否压在其他标签上
Point p[]=stmp.getAllLoc();
for(int i=0;i<p.length;i++)
{
Square stmp2=getIns(stmp,p[i].x,p[i].y);
if(stmp2!=null && stmp2!=stmp)return true;
}
return false;
}
public Point[] DivisionDetail()
{//细化分解
Square stmp[]=getAllIns();//获得全部
if(stmp.length==0)return null;
//记录原始位置
Point [] foreloc=new Point[stmp.length];
for(int i=0;i<stmp.length;i++)
{
foreloc[i]=new Point(stmp[i].getLocation());
}
int cellnum,x,y,minX=stmp[0].getX();
for(int i=0;i<stmp.length;i++)
{//检查最左端的位置
if(stmp[i].getX()<minX)
minX=stmp[i].getX();
}
for(int i=0;i<stmp.length;i++)
{//循环修改坐标
cellnum=stmp[0].getMyCell(0).length;
x=minX+(stmp[i].number-1)*Global.LENGTH;
y=stmp[i].getY();
stmp[i].setLocation(x,y);
int forecount=0;
for(int j=0;j<4;j++)
{//按层次分解位置
cellnum=stmp[i].getMyCell(j).length;
x=stmp[i].getX(j);
y=stmp[i].getY(j>0?j-1:0)-(forecount)*Global.LENGTH+((stmp[i].number+forecount-1)%(forecount==0?1:forecount))*Global.LENGTH;
if(cellnum>1)
{
y=y-((stmp[i].number+cellnum-1)%cellnum)*Global.LENGTH;
}
stmp[i].setLocation(j,x,y);
forecount=cellnum;
}
}
//返回原始位置
return foreloc;
}
public Point[] NoDivision()
{//没有间隙
Square stmp[]=getAllIns();//获得全部
if(stmp.length==0)return null;
//记录原始位置
Point [] foreloc=new Point[stmp.length];
for(int i=0;i<stmp.length;i++)
{
foreloc[i]=new Point(stmp[i].getLocation());
}
////////////
//开始计算//
///////////
int x,y,minX=stmp[0].getX();
for(int i=0;i<stmp.length;i++)
{//检查最左端的位置
if(stmp[i].getX()<minX)
minX=stmp[i].getX();
}
//获得最多格数
int max=0;
for(int j=0;j<4;j++)
{//按层次分解位置
if(stmp[0].getGrid(j)>max)max=stmp[0].getGrid(j);
}
for(int i=0;i<stmp.length;i++)
{//循环修改坐标
x=minX+i*(max)*Global.LENGTH;
y=stmp[i].getY();
stmp[i].setLocation(x,y);
}
return foreloc;
}
public int MiniDivision()
{//没有间隙
Square stmp=new Square(style);
////////////
//开始计算//
///////////
//获得最多格数
int max=0;
for(int j=0;j<4;j++)
{//按层次分解位置
if(stmp.getGrid(j)>max)max=stmp.getGrid(j);
}
return max*Global.LENGTH;
}
public int CreateIns(int num,int x,int y)
{//以此点开始创建n个命令
int counter=0;
int mini=0;
if(num>=200)num=200;
for(int i=0;i<num;i++){
Square stmp=MakeIns();//创建一个指令
Point gtmp=getGrid(x+i*mini,y);
int gx=gtmp.x,gy=gtmp.y-3;
Point pos=getPos(gx,gy);
if(LocateIns(stmp,pos.x,pos.y))
{
addIns(stmp);
if(counter==0)
mini=MiniDivision();
counter++;
}
}
return counter;//返回成功创建的个数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -