⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grid.java

📁 时空图计算和编辑程序
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -