?? java-codes.txt
字號:
break ;
case 'Y' :
for(int i=0;i<=2;i++)
//for(int j=0;j<=2;j++)
for(int k=0;k<=2;k++)
{
if(Block.closeDonghua)
{
if(i==1&&k==1)
{
continue ;
}
}
int changBlockX=positionArray[i][Floor][k].x ;
int changBlockY=positionArray[i][Floor][k].y ;
int changBlockZ=positionArray[i][Floor][k].z ;
Block changBlock=blockArray[changBlockX][changBlockY][changBlockZ];
changBlock.xyzChange('Y',totateArg);
}
break ;
case 'X' :
//for(int i=0;i<=2;i++)
for(int j=0;j<=2;j++)
for(int k=0;k<=2;k++)
{
if(Block.closeDonghua)
{
if(j==1&&k==1)
{
continue ;
}
}
int changBlockX=positionArray[Floor][j][k].x ;
int changBlockY=positionArray[Floor][j][k].y ;
int changBlockZ=positionArray[Floor][j][k].z ;
Block changBlock=blockArray[changBlockX][changBlockY][changBlockZ];
changBlock.xyzChange('X',totateArg);
}
break ;
default :
System.out.println("無效的操作");
}
someBlockNewToOld();
}
//開始人工智能計算解法
//select:選擇電腦的計算方案
public static void autoStart(int select)
{
}
//輸出每個位置上的塊號
public static void showPosition()
{
System.out.println("\n每個位置上的塊號:");
for(int i=0;i<=2;i++)
for(int j=0;j<=2;j++)
for(int k=0;k<=2;k++)
{
//System.out.println("Block"+i+","+j+","+k+" "+blockArray[i][j][k].x+","+blockArray[i][j][k].y+","+blockArray[i][j][k].z);
System.out.println("Position:"+(i-1)+","+(j-1)+","+(k-1)+" 的塊號是: "+(positionArray[i][j][k].x-1)+","+(positionArray[i][j][k].y-1)+","+(positionArray[i][j][k].z-1));
}
}
//把剛才記錄的有變化(來了新的塊)的位置 存儲到 沒個position的塊號中
public static void someBlockNewToOld()
{
for(int i=0;i<=2;i++)
for(int j=0;j<=2;j++)
for(int k=0;k<=2;k++)
{
if(positionArray[i][j][k].haveNew)
{
positionArray[i][j][k].newToOld();
}
}
}
public static void myWait()
{
try
{
System.in.read();
System.in.read();
//暫停
}
catch(Exception e)
{
}
}
//測試用代碼
public static void someTest()
{
doIt('Y',0+1,90);
// //new MoFang().showPosition();
MoFang.myWait();
doIt('Y',0+1,-90);
MoFang.myWait();
// new MoFang().showPosition();
doIt('Z',-1+1,-90);
//new MoFang().showPosition();
MoFang.myWait();
doIt('Z',-1+1,90);
// new MoFang().showPosition();
//MoFang.myWait();
//new MoFang().showPosition();
doIt('X',1+1,90);
MoFang.myWait();
//new MoFang().showPosition();
doIt('X',1+1,-90);
// new MoFang().showPosition();
MoFang.myWait();
//showPosition();
}
//魔方自動隨機變化多少條
public static void ranGet(int num)
{
char selectChar='E';//'X','Y','Z'
int layer;//-1,0,1
int jiaoDu=0;//90,-19,180
for(int i=0;i<num;i++)
{
//選xyz
int select=(int)((Math.random()*10)%3);
if(select==0){selectChar='X';}
if(select==1){selectChar='Y';}
if(select==2){selectChar='Z';}
//
layer=(int)((Math.random()*10)%3);//0,1,2
layer-=1;//-1,0,1
//
int jiao=(int)((Math.random()*10)%3);//0,1,2
if(jiao==0){jiaoDu=90;}
if(jiao==1){jiaoDu=-90;}
if(jiao==2){jiaoDu=180-90;}
System.out.println("\n*******************************\nRandom Generater:"+(i+1)+" of "+num);
System.out.print(selectChar);
System.out.print(","+layer+","+jiaoDu+"\n按任意鍵開始動畫?\n");
myWait();
doIt(selectChar,layer+1,jiaoDu);
}
}
//從三維圖形界面輸入操作參數
public static void graphicStart()
{
JFrame myframe =new JFrame();
myframe.setVisible(true);
}
public static void main(String[]args)
{
//初始化位置數組,也可以從文件中加載,其實應該把所有關鍵信息從文件載入,關閉時保存
for(int i=0;i<=2;i++)
for(int j=0;j<=2;j++)
for(int k=0;k<=2;k++)
{
MoFang.positionArray[i][j][k]=new Position(i,j,k);
}
System.out.println("初始化位置數組完成.最初全在原位置\n");
//showPosition();
new MainFrame(new mySimpleUniverse(),200,200);
//加applet到應用程序界面
//someTest();
//graphicStart();
myWait();
ranGet(30);
//
//
}
}
class Block implements Runnable
{
//計算已畫的塊數
private static int whickBlockPainted=0 ;
//計算生成的第幾塊
private static int BlockCreated=0 ;
//每面的顏色,排列為:+x,-x,+y,-y,+z,-z,no
public static Color3f[] mianColor=
{new Color3f(1.0f,0.0f,0.0f),
new Color3f(0.0f,1.0f,0.0f),
new Color3f(0.0f,0.0f,1.0f),
new Color3f(1.0f,1.0f,0.0f),
new Color3f(1.0f,0.0f,1.0f),
new Color3f(0.0f,1.0f,1.0f),
new Color3f(0.2f,0.2f,0.2f)
};
//每面的材質,排列為:+x,-x,+y,-y,+z,-z,no
public static String[] mianImageFile=new String[7];
//塊偏移量
private static float kuaiZhongXinWeizhi=0.4f ;
//創建材質時要用的,僅用于他,他是一個applet對象
Component observer;
//該塊的編號
private int blockIdX ;
private int blockIdY ;
private int blockIdZ ;
//該塊的位置
private int x ;
private int y ;
private int z ;
//該塊的坐標軸點,最初全為(1,1,1),表示與外坐標一致
private MyPoint xvec;
private MyPoint yvec;
private MyPoint zvec;
//position=new Verctor3f(0.0f,0.0f,0.0f);
//該塊的角度,限定為從-359到359,模360可以限定為一周,如果模180,則只能表示半個圓,不行
//int anglex ;
//int angley ;
//int anglez ;
//添加物品的變換組
public TransformGroup transGroup ;
public Transform3D trans ;
//用于位置,角度變動的變換組
public TransformGroup transGroupx ;
public Transform3D transx ;
public TransformGroup transGroupy ;
public Transform3D transy ;
public TransformGroup transGroupz ;
public Transform3D transz ;
public TransformGroup transGroupp ;
public Transform3D transp ;
//新的方塊位置
int[] nexyz={0,0,0};
//動畫相關
int totateArg;
boolean canNew=false;
char selectedC;
Thread myThread;
public static boolean closeDonghua=false ; //為true使用線程動畫,為false直接調用
private static int selectDonghuaId=0;//取ID變量,取值從0~8,每次從0開始取,正好9個,取完后變為10(每取一個自動加1),這時才讓所有線程一起動
private int myDonghuaId;
private static int donghuaDelay=50 ; //絕對延遲,
public static int whileDelay=20;//加快同步系統性能延遲,
//公共控制變量
public static int yunXingThread=0;//運行的線程數,啟動線程時加1,退出時減一??梢钥刂浦骶€程等待,直到為0時才開始做所有的xyzChange,否則等待
//動畫時的多線程要用它,因為主線程仍在跑,x,y,z會變化,只能用它保存
int yuanx;
int yuany;
int yuanz;
//當前位置x點的偏移
MyPoint chaxvec;
//當前位置y點的偏移
MyPoint chayvec;
//當前位置z點的偏移
MyPoint chazvec;
//構造函數,給初值
public Block(int i,int j,int k,int px,int py,int pz,TransformGroup parentTransGroup,Transform3D t3d,BranchGroup objRoot,Component obServer1)
{
blockIdX=i ;
blockIdY=j ;
blockIdZ=k ;
x=px ;
y=py ;
z=pz ;
//計算軸向量 :塊坐標加坐標偏移
xvec=new MyPoint((blockIdX-1)+1,(blockIdY-1),(blockIdZ-1));
yvec=new MyPoint((blockIdX-1),(blockIdY-1)+1 ,(blockIdZ-1));
zvec=new MyPoint((blockIdX-1),(blockIdY-1),(blockIdZ-1)+1 );
//System.out.println("軸點:"+(zoux)+(zouy)+(zouz));
//System.out.println("軸向量:"+(zoux-(x-1))+(zouy-(y-1))+(zouz-(z-1)));
observer=obServer1;
//anglex=0 ;
//angley=0 ;
//anglez=0 ;
trans=new Transform3D();
transGroup=new TransformGroup(trans);
transGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
transGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
transGroup.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
transp=new Transform3D();
transGroupp=new TransformGroup(transp);
transGroupp.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
transGroupp.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
//transGroupp.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
transx=new Transform3D();
transGroupx=new TransformGroup(transx);
transGroupx.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
transGroupx.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
//transGroupx.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
transy=new Transform3D();
transGroupy=new TransformGroup(transy);
transGroupy.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
transGroupy.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
//transGroupy.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
transz=new Transform3D();
transGroupz=new TransformGroup(transz);
transGroupz.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
transGroupz.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
//transGroupz.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
//用已知信息組裝變換組,,
//注意這里的順序,先平移,再旋轉,或先x,先y的順序是不一樣的,這里
//必須是先在原位置自轉好方向,再平移,這樣,平移不會改變它的自轉方向,
//如果先平移,再轉,轉動會帶動平移,剛才的平移無任何意義。
//還要注意是先繞x轉,再繞y轉,再繞z轉
//換了順序,是不一樣的,例如x,y,z和z,y,x的結果不一樣
//但是,可以證明x,y和y,x的順序無關性,當都只左轉或右轉90度時,很容易證明
//如果有180度,可以分成兩次90度操作
parentTransGroup.addChild(transGroupp);
transGroupp.addChild(transGroupz);
transGroupz.addChild(transGroupy);
transGroupy.addChild(transGroupx);
transGroupx.addChild(transGroup);
// 測試,直接加到根,沒有鼠標功能
//objRoot.addChild(transGroup);
//System.out.println("\n\n\n處理第"+BlockCreated+"塊");
//System.out.println("塊"+(blockIdX-1)+(blockIdY-1)+(blockIdZ-1)+"的坐標系添加完成");
BlockCreated++;
//if (BlockCreated==14)//||BlockCreated==3//||BlockCreated==2||BlockCreated==20||BlockCreated==16
add3DCube(x-1,y-1,z-1,transGroup);
//建小坐標軸
SomeShape3D.zuoBiaoZhuSmallXShape3D(transGroup);
SomeShape3D.zuoBiaoZhuSmallYShape3D(transGroup);
SomeShape3D.zuoBiaoZhuSmallZShape3D(transGroup);
//測試主變換組的平移
//Shape3D shape1=SomeShape3D.FlowerShape3D();
//parentTransGroup.addChild(shape1);
//t3d.setTranslation(new Vector3f(0.0f,1.0f,0.0f));
//parentTransGroup.setTransform(t3d);
//測試子變換組的平移(不行,不起作用)
//Shape3D shape2=SomeShape3D.SanShape3D();
//transGroup.addChild(shape2);
//trans.setTranslation(new Vector3f(0.0f,-1f,0.0f));
//transGroup.setTransform(t3d);
//創建鼠標行為
//MouseRotate behavior1=new MouseRotate();
//behavior1.setTransformGroup(transGroup);
//behavior1.setSchedulingBounds(new BoundingSphere(new Point3d(0.0,0.0,0.0),100));
//objRoot.addChild(behavior1);//鼠標行為 加到 分枝組
//設置初始值,顯示輸出
float fx ;
float fy ;
float fz ;
fx=(float)kuaiZhongXinWeizhi*(x-1);
fy=(float)kuaiZhongXinWeizhi*(y-1);
fz=(float)kuaiZhongXinWeizhi*(z-1);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -