魔方源代码Java Applet小程序.docx

上传人:b****7 文档编号:8805291 上传时间:2023-02-01 格式:DOCX 页数:25 大小:18.36KB
下载 相关 举报
魔方源代码Java Applet小程序.docx_第1页
第1页 / 共25页
魔方源代码Java Applet小程序.docx_第2页
第2页 / 共25页
魔方源代码Java Applet小程序.docx_第3页
第3页 / 共25页
魔方源代码Java Applet小程序.docx_第4页
第4页 / 共25页
魔方源代码Java Applet小程序.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

魔方源代码Java Applet小程序.docx

《魔方源代码Java Applet小程序.docx》由会员分享,可在线阅读,更多相关《魔方源代码Java Applet小程序.docx(25页珍藏版)》请在冰豆网上搜索。

魔方源代码Java Applet小程序.docx

魔方源代码JavaApplet小程序

importjava.awt.*;

importjava.applet.Applet;

publicfinalclassrubikextendsApplet

{

inti;

intj;

intk;

intn;

into;

intp;

intq;

intlastX;

intlastY;

intdx;

intdy;

intrectX[];

intrectY[];

ColorcolList[];

Colorbgcolor;

finaldoublesideVec[]={0.0,0.0,1.0,0.0,0.0,-1,0.0,-1,0.0,1.0,0.0,0.0,0.0,1.0,0.0,-1,0.0,0.0};

finaldoublecorners[]={-1,-1,-1,1.0,-1,-1,1.0,1.0,-1,-1,1.0,-1,-1,-1,1.0,1.0,-1,1.0,1.0,1.0,1.0,-1,1.0,1.0};

doubletopCorners[];

doublebotCorners[];

finalintsides[]={4,5,6,7,3,2,1,0,0,1,5,4,1,2,6,5,2,3,7,6,0,4,7,3};

finalintnextSide[]={2,3,4,5,4,3,2,5,1,3,0,5,1,4,0,2,1,5,0,3,2,0,4,1};

finalintmainBlocks[]={0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3};

finalinttwistDir[]={-1,1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,1};

finalintcolDir[]={-1,-1,1,-1,1,-1};

finalintcircleOrder[]={0,1,2,5,8,7,6,3};

inttopBlocks[];

intbotBlocks[];

intsideCols[];

intsideW;

intsideH;

intdragReg;

inttwistSide;

intnearSide[];

intbuffer[];

doubledragCorn[];

doubledragDir[];

doubleeye[]={0.3651,0.1826,-0.9129};

doubleeX[]={0.9309,-0.0716,0.3581};

doubleeY[];

doubleTeye[];

doubleTeX[];

doubleTeY[];

doublelight[];

doubletemp[]={0.0,0.0,0.0};

doubletemp2[]={0.0,0.0,0.0};

doublenewCoord[];

doublesx;

doublesy;

doublesdxh;

doublesdyh;

doublesdxv;

doublesdyv;

doubled;

doublet1;

doublet2;

doublet3;

doublet4;

doublet5;

doublet6;

doublephi;

doublephibase;

doubleCphi;

doubleSphi;

doublecurrDragDir[];

booleannaturalState;

booleantwisting;

booleanOKtoDrag;

doublelocal0;

Mathm;

GraphicsoffGraphics;

ImageoffImage;

publicvoidinit()

{

offImage=createImage(120,120);

offGraphics=offImage.getGraphics();

rectX=newint[4];

rectY=newint[4];

newCoord=newdouble[16];

dragDir=newdouble[24];

dragCorn=newdouble[96];

topCorners=newdouble[24];

botCorners=newdouble[24];

topBlocks=newint[24];

botBlocks=newint[24];

buffer=newint[12];

nearSide=newint[12];

light=newdouble[3];

Teye=newdouble[3];

TeX=newdouble[3];

TeY=newdouble[3];

currDragDir=newdouble[2];

eY=newdouble[3];

vecProd(eye,0,eX,0,eY,0);

normalize(eY,0);

colList=newColor[120];

for(i=0;i<20;i++)

{

colList[i]=newColor(103+i*8,103+i*8,103+i*8);

colList[i+20]=newColor(i*6,i*6,84+i*9);

colList[i+40]=newColor(84+i*9,i*5,i*5);

colList[i+60]=newColor(i*6,84+i*9,i*6);

colList[i+80]=newColor(84+i*9,84+i*9,i*6);

colList[i+100]=newColor(84+i*9,55+i*8,i*3);

}

sideCols=newint[54];

for(i=0;i<54;i++)

sideCols[i]=i/9;

bgcolor=findBGColor();

resize(125,125);

repaint();

}

publicColorfindBGColor()

{

Colorcolor;

Stringstring2="0123456789abcdef";

intan[]=newint[6];

Stringstring1=getParameter("bgcolor");

if(string1!

=null&&string1.length()==6)

{

for(i=0;i<6;i++)

for(j=0;j<16;j++)

if(string1.charAt(i)==string2.charAt(j))

an[i]=j;

color=newColor(an[0]*16+an[1],an[2]*16+an[3],an[4]*16+an[5]);

}

else

color=Color.lightGray;

returncolor;

}

publicdoublescalProd(doublead1[],inti,doublead2[],intj)

{

returnad1[i]*ad2[j]+ad1[i+1]*ad2[j+1]+ad1[i+2]*ad2[j+2];

}

publicdoublevNorm(doublead[],inti)

{

returnMath.sqrt(ad[i]*ad[i]+ad[i+1]*ad[i+1]+ad[i+2]*ad[i+2]);

}

publicdoublecosAng(doublead1[],inti,doublead2[],intj)

{

returnscalProd(ad1,i,ad2,j)/(vNorm(ad1,i)*vNorm(ad2,j));

}

publicvoidnormalize(doublead[],inti)

{

local0=vNorm(ad,i);

ad[i]=ad[i]/local0;

ad[i+1]=ad[i+1]/local0;

ad[i+2]=ad[i+2]/local0;

}

publicvoidscalMult(doublead[],inti,doubled)

{

ad[i]=ad[i]*d;

ad[i+1]=ad[i+1]*d;

ad[i+2]=ad[i+2]*d;

}

publicvoidaddVec(doublead1[],inti,doublead2[],intj)

{

ad2[j]+=ad1[i];

ad2[j+1]+=ad1[i+1];

ad2[j+2]+=ad1[i+2];

}

publicvoidsubVec(doublead1[],inti,doublead2[],intj)

{

ad2[j]-=ad1[i];

ad2[j+1]-=ad1[i+1];

ad2[j+2]-=ad1[i+2];

}

publicvoidcopyVec(doublead1[],inti,doublead2[],intj)

{

ad2[j]=ad1[i];

ad2[j+1]=ad1[i+1];

ad2[j+2]=ad1[i+2];

}

publicvoidvecProd(doublead1[],inti,doublead2[],intj,doublead3[],intk)

{

ad3[k]=ad1[i+1]*ad2[j+2]-ad1[i+2]*ad2[j+1];

ad3[k+1]=ad1[i+2]*ad2[j]-ad1[i]*ad2[j+2];

ad3[k+2]=ad1[i]*ad2[j+1]-ad1[i+1]*ad2[j];

}

publicvoidcutUpCube()

{

for(i=0;i<24;i++)

{

topCorners[i]=corners[i];

botCorners[i]=corners[i];

}

copyVec(sideVec,3*twistSide,temp,0);

copyVec(temp,0,temp2,0);

scalMult(temp,0,1.3333);

scalMult(temp2,0,0.6667);

for(i=0;i<8;i++)

{

booleanflag=false;

for(j=0;j<4;j++)

if(i==sides[twistSide*4+j])

flag=true;

if(flag)

subVec(temp2,0,botCorners,i*3);

else

addVec(temp,0,topCorners,i*3);

}

for(i=0;i<24;i++)

{

topBlocks[i]=mainBlocks[i];

botBlocks[i]=mainBlocks[i];

}

for(i=0;i<6;i++)

{

if(i==twistSide)

{

botBlocks[i*4+1]=0;

botBlocks[i*4+3]=0;

}

else

{

k=-1;

for(j=0;j<4;j++)

if(nextSide[i*4+j]==twistSide)

k=j;

switch(k)

{

case0:

topBlocks[i*4+3]=1;

botBlocks[i*4+2]=1;

break;

case1:

topBlocks[i*4]=2;

botBlocks[i*4+1]=2;

break;

case2:

topBlocks[i*4+2]=2;

botBlocks[i*4+3]=2;

break;

case3:

topBlocks[i*4+1]=1;

botBlocks[i*4]=1;

break;

case-1:

topBlocks[i*4+1]=0;

topBlocks[i*4+3]=0;

break;

}

}

}

}

publicbooleankeyDown(Eventevent,inti)

{

if(i==114)

{

twisting=false;

naturalState=true;

for(this.i=0;this.i<54;this.i++)

sideCols[this.i]=this.i/9;

repaint();

}

elseif(i==115)

{

twisting=false;

naturalState=true;

for(this.i=0;this.i<20;this.i++)

colorTwist((int)(Math.random()*6),(int)(Math.random()*3+1.0));

repaint();

}

returnfalse;

}

publicbooleanmouseDrag(Eventevent,inti,intj)

{

if(!

twisting&&OKtoDrag)

{

OKtoDrag=false;

booleanflag=false;

for(this.i=0;this.i

{

doubled1=dragCorn[this.i*8+1]-dragCorn[this.i*8];

doubled2=dragCorn[this.i*8+5]-dragCorn[this.i*8+4];

doubled3=dragCorn[this.i*8+3]-dragCorn[this.i*8];

doubled4=dragCorn[this.i*8+7]-dragCorn[this.i*8+4];

doubled5=(d4*((double)lastX-dragCorn[this.i*8])-d3*((double)lastY-dragCorn[this.i*8+4]))/(d1*d4-d3*d2);

doubled6=(-d2*((double)lastX-dragCorn[this.i*8])+d1*((double)lastY-dragCorn[this.i*8+4]))/(d1*d4-d3*d2);

if(d5>0.0&&d5<1.0&&d6>0.0&&d6<1.0)

{

currDragDir[0]=dragDir[this.i*2];

currDragDir[1]=dragDir[this.i*2+1];

d=currDragDir[0]*(i-lastX)+currDragDir[1]*(j-lastY);

d=d*d/((currDragDir[0]*currDragDir[0]+currDragDir[1]*currDragDir[1])*((i-lastX)*(i-lastX)+(j-lastY)*(j-lastY)));

if(d>0.6)

{

flag=true;

twistSide=nearSide[this.i];

this.i=100;

}

}

}

if(flag)

{

if(naturalState)

{

cutUpCube();

naturalState=false;

}

twisting=true;

phi=0.02*(currDragDir[0]*(i-lastX)+currDragDir[1]*(j-lastY))/Math.sqrt(currDragDir[0]*currDragDir[0]+currDragDir[1]*currDragDir[1]);

repaint();

returnfalse;

}

}

OKtoDrag=false;

if(!

twisting)

{

dx=lastX-i;

copyVec(eX,0,temp,0);

scalMult(temp,0,(double)dx*0.016);

addVec(temp,0,eye,0);

vecProd(eY,0,eye,0,eX,0);

normalize(eX,0);

normalize(eye,0);

dy=j-lastY;

copyVec(eY,0,temp,0);

scalMult(temp,0,(double)dy*0.016);

addVec(temp,0,eye,0);

vecProd(eye,0,eX,0,eY,0);

normalize(eY,0);

normalize(eye,0);

lastX=i;

lastY=j;

repaint();

}

else

{

phi=0.02*(currDragDir[0]*(i-lastX)+currDragDir[1]*(j-lastY))/Math.sqrt(currDragDir[0]*currDragDir[0]+currDragDir[1]*currDragDir[1]);

repaint();

}

returnfalse;

}

publicbooleanmouseDown(Eventevent,inti,intj)

{

lastX=i;

lastY=j;

OKtoDrag=true;

returnfalse;

}

publicbooleanmouseUp(Eventevent,inti,intj)

{

if(twisting)

{

doubled;

twisting=false;

phibase+=phi;

phi=0.0;

for(d=phibase;d<0.0;d+=125.662)/*nullbody*/;

intk=(int)(d*3.183);

if(k%5==0||k%5==4)

{

k=(k+1)/5%4;

if(colDir[twistSide]<0)

k=(4-k)%4;

phibase=0.0;

naturalState=true;

colorTwist(twistSide,k);

}

repaint();

}

returnfalse;

}

publicvoidcolorTwist(inti1,intj1)

{

intk4=0;

intj4=j1*2;

for(intk1=0;k1<8;k1++)

{

buffer[j4]=sideCols[i1*9+circleOrder[k1]];

j4=(j4+1)%8;

}

for(inti2=0;i2<8;i2++)

sideCols[i1*9+circleOrder[i2]]=buffer[i2];

j4=j1*3;

for(intj2=0;j2<4;j2++)

{

for(inti3=0;i3<4;i3++)

if(nextSide[nextSide[i1*4+j2]*4+i3]==i1)

k4=i3;

for(intj3=0;j3<3;j3++)

{

switch(k4)

{

case0:

buffer[j4]=sideCols[nextSide[i1*4+j2]*9+j3];

break;

case1:

buffer[j4]=sideCols[nextSide[i1*4+j2]*9+2+3*j3];

break;

case2:

buffer[j4]

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1