魔方源代码JavaApplet小程序

上传人:仙*** 文档编号:31343027 上传时间:2021-10-11 格式:DOC 页数:16 大小:74KB
收藏 版权申诉 举报 下载
魔方源代码JavaApplet小程序_第1页
第1页 / 共16页
魔方源代码JavaApplet小程序_第2页
第2页 / 共16页
魔方源代码JavaApplet小程序_第3页
第3页 / 共16页
资源描述:

《魔方源代码JavaApplet小程序》由会员分享,可在线阅读,更多相关《魔方源代码JavaApplet小程序(16页珍藏版)》请在装配图网上搜索。

1、import java.awt.*;import java.applet.Applet;public final class rubik extends Applet int i; int j; int k; int n; int o; int p; int q; int lastX; int lastY; int dx; int dy; int rectX; int rectY; Color colList; Color bgcolor; final double sideVec = 0.0, 0.0, 1.0, 0.0, 0.0, -1, 0.0, -1, 0.0, 1.0, 0.0, 0

2、.0, 0.0, 1.0, 0.0, -1, 0.0, 0.0 ; final double corners = -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 ; double topCorners; double botCorners; final int sides = 4, 5, 6, 7, 3, 2, 1, 0, 0, 1, 5, 4, 1, 2, 6, 5, 2, 3, 7, 6, 0, 4, 7, 3 ; final

3、 int nextSide = 2, 3, 4, 5, 4, 3, 2, 5, 1, 3, 0, 5, 1, 4, 0, 2, 1, 5, 0, 3, 2, 0, 4, 1 ; final int mainBlocks = 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3 ; final int twistDir = -1, 1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, 1, 1, -1, 1, -1, 1 ; final int col

4、Dir = -1, -1, 1, -1, 1, -1 ; final int circleOrder = 0, 1, 2, 5, 8, 7, 6, 3 ; int topBlocks; int botBlocks; int sideCols; int sideW; int sideH; int dragReg; int twistSide; int nearSide; int buffer; double dragCorn; double dragDir; double eye = 0.3651, 0.1826, -0.9129 ; double eX = 0.9309, -0.0716, 0

5、.3581 ; double eY; double Teye; double TeX; double TeY; double light; double temp = 0.0, 0.0, 0.0 ; double temp2 = 0.0, 0.0, 0.0 ; double newCoord; double sx; double sy; double sdxh; double sdyh; double sdxv; double sdyv; double d; double t1; double t2; double t3; double t4; double t5; double t6; do

6、uble phi; double phibase; double Cphi; double Sphi; double currDragDir; boolean naturalState; boolean twisting; boolean OKtoDrag;double local0; Math m; Graphics offGraphics; Image offImage; public void init() offImage = createImage(120, 120); offGraphics = offImage.getGraphics(); rectX = new int4; r

7、ectY = new int4; newCoord = new double16; dragDir = new double24; dragCorn = new double96; topCorners = new double24; botCorners = new double24; topBlocks = new int24; botBlocks = new int24; buffer = new int12; nearSide = new int12; light = new double3; Teye = new double3; TeX = new double3; TeY = n

8、ew double3; currDragDir = new double2; eY = new double3; vecProd(eye, 0, eX, 0, eY, 0); normalize(eY, 0); colList = new Color120; for (i = 0; i 20; i+) colListi = new Color(103 + i * 8, 103 + i * 8, 103 + i * 8); colListi + 20 = new Color(i * 6, i * 6, 84 + i * 9); colListi + 40 = new Color(84 + i *

9、 9, i * 5, i * 5); colListi + 60 = new Color(i * 6, 84 + i * 9, i * 6); colListi + 80 = new Color(84 + i * 9, 84 + i * 9, i * 6); colListi + 100 = new Color(84 + i * 9, 55 + i * 8, i * 3); sideCols = new int54; for (i = 0; i 54; i+) sideColsi = i / 9; bgcolor = findBGColor(); resize(125, 125); repai

10、nt(); public Color findBGColor() Color color; String string2 = 0123456789abcdef; int an = new int6; String string1 = 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) ani = j; color = new Color(an0

11、* 16 + an1, an2 * 16 + an3, an4 * 16 + an5); else color = Color.lightGray; return color; public double scalProd(double ad1, int i, double ad2, int j) return ad1i * ad2j + ad1i + 1 * ad2j + 1 + ad1i + 2 * ad2j + 2; public double vNorm(double ad, int i) return Math.sqrt(adi * adi + adi + 1 * adi + 1 +

12、 adi + 2 * adi + 2); public double cosAng(double ad1, int i, double ad2, int j) return scalProd(ad1, i, ad2, j) / (vNorm(ad1, i) * vNorm(ad2, j); public void normalize(double ad, int i) local0 = vNorm(ad, i); adi = adi / local0; adi + 1 = adi + 1 / local0; adi + 2 = adi + 2 / local0; public void sca

13、lMult(double ad, int i, double d) adi = adi * d; adi + 1 = adi + 1 * d; adi + 2 = adi + 2 * d; public void addVec(double ad1, int i, double ad2, int j) ad2j += ad1i; ad2j + 1 += ad1i + 1; ad2j + 2 += ad1i + 2; public void subVec(double ad1, int i, double ad2, int j) ad2j -= ad1i; ad2j + 1 -= ad1i +

14、1; ad2j + 2 -= ad1i + 2; public void copyVec(double ad1, int i, double ad2, int j) ad2j = ad1i; ad2j + 1 = ad1i + 1; ad2j + 2 = ad1i + 2; public void vecProd(double ad1, int i, double ad2, int j, double ad3, int k) ad3k = ad1i + 1 * ad2j + 2 - ad1i + 2 * ad2j + 1; ad3k + 1 = ad1i + 2 * ad2j - ad1i *

15、 ad2j + 2; ad3k + 2 = ad1i * ad2j + 1 - ad1i + 1 * ad2j; public void cutUpCube() for (i = 0; i 24; i+) topCornersi = cornersi; botCornersi = cornersi; 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+) boo

16、lean flag = false; for (j = 0; j 4; j+) if (i = sidestwistSide * 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+) topBlocksi = mainBlocksi; botBlocksi = mainBlocksi; for (i = 0; i 6; i+) if (i = twistSide) botBlocksi *

17、4 + 1 = 0; botBlocksi * 4 + 3 = 0; else k = -1; for (j = 0; j 4; j+) if (nextSidei * 4 + j = twistSide) k = j; switch (k) case 0: topBlocksi * 4 + 3 = 1; botBlocksi * 4 + 2 = 1; break; case 1: topBlocksi * 4 = 2; botBlocksi * 4 + 1 = 2; break; case 2: topBlocksi * 4 + 2 = 2; botBlocksi * 4 + 3 = 2;

18、break; case 3: topBlocksi * 4 + 1 = 1; botBlocksi * 4 = 1; break; case -1: topBlocksi * 4 + 1 = 0; topBlocksi * 4 + 3 = 0; break; public boolean keyDown(Event event, int i) if (i = 114) twisting = false; naturalState = true; for (this.i = 0; this.i 54; this.i+) sideColsthis.i = this.i / 9; repaint()

19、; else if (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(); return false; public boolean mouseDrag(Event event, int i, int j) if (!twisting & OKtoDrag) OKtoDrag = false; boolean flag =

20、false; for (this.i = 0; this.i 0.0 & d5 0.0 & d6 0.6) flag = true; twistSide = nearSidethis.i; this.i = 100; if (flag) if (naturalState) cutUpCube(); naturalState = false; twisting = true; phi = 0.02 * (currDragDir0 * (i - lastX) + currDragDir1 * (j - lastY) / Math.sqrt(currDragDir0 * currDragDir0 +

21、 currDragDir1 * currDragDir1); repaint(); return false; 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

22、); 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 * (currDragDir0 * (i - lastX) + currDragDir1 * (j - lastY) / Math.sqrt(currDragDir0 * currDragDir0 + currDragDir1 *

23、currDragDir1); repaint(); return false; public boolean mouseDown(Event event, int i, int j) lastX = i; lastY = j; OKtoDrag = true; return false; public boolean mouseUp(Event event, int i, int j) if (twisting) double d; twisting = false; phibase += phi; phi = 0.0; for (d = phibase; d 0.0; d += 125.66

24、2) /* null body */ ; int k = (int)(d * 3.183); if (k % 5 = 0 | k % 5 = 4) k = (k + 1) / 5 % 4; if (colDirtwistSide 0) k = (4 - k) % 4; phibase = 0.0; naturalState = true; colorTwist(twistSide, k); repaint(); return false; public void colorTwist(int i1, int j1) int k4 = 0; int j4 = j1 * 2; for (int k

25、1 = 0; k1 8; k1+) bufferj4 = sideColsi1 * 9 + circleOrderk1; j4 = (j4 + 1) % 8; for (int i2 = 0; i2 8; i2+) sideColsi1 * 9 + circleOrderi2 = bufferi2; j4 = j1 * 3; for (int j2 = 0; j2 4; j2+) for (int i3 = 0; i3 4; i3+) if (nextSidenextSidei1 * 4 + j2 * 4 + i3 = i1) k4 = i3; for (int j3 = 0; j3 3; j

26、3+) switch (k4) case 0: bufferj4 = sideColsnextSidei1 * 4 + j2 * 9 + j3; break; case 1: bufferj4 = sideColsnextSidei1 * 4 + j2 * 9 + 2 + 3 * j3; break; case 2: bufferj4 = sideColsnextSidei1 * 4 + j2 * 9 + 8 - j3; break; case 3: bufferj4 = sideColsnextSidei1 * 4 + j2 * 9 + 6 - 3 * j3; break; j4 = (j4

27、 + 1) % 12; j4 = 0; for (int k2 = 0; k2 4; k2+) for (int k3 = 0; k3 4; k3+) if (nextSidenextSidei1 * 4 + k2 * 4 + k3 = i1) k4 = k3; for (int i4 = 0; i4 3; i4+) switch (k4) case 0: sideColsnextSidei1 * 4 + k2 * 9 + i4 = bufferj4; break; case 1: sideColsnextSidei1 * 4 + k2 * 9 + 2 + 3 * i4 = bufferj4;

28、 break; case 2: sideColsnextSidei1 * 4 + k2 * 9 + 8 - i4 = bufferj4; break; case 3: sideColsnextSidei1 * 4 + k2 * 9 + 6 - 3 * i4 = bufferj4; break; j4+; public void paint(Graphics g) dragReg = 0; offGraphics.setColor(bgcolor); offGraphics.fillRect(0, 0, 120, 120); if (naturalState) fixBlock(eye, eX,

29、 eY, corners, mainBlocks, 0); else copyVec(eye, 0, Teye, 0); copyVec(eX, 0, TeX, 0); Cphi = Math.cos(phi + phibase); Sphi = -Math.sin(phi + phibase); switch (twistSide) case 0: Teye0 = Cphi * eye0 + Sphi * eye1; TeX0 = Cphi * eX0 + Sphi * eX1; Teye1 = -Sphi * eye0 + Cphi * eye1; TeX1 = -Sphi * eX0 +

30、 Cphi * eX1; break; case 1: Teye0 = Cphi * eye0 - Sphi * eye1; TeX0 = Cphi * eX0 - Sphi * eX1; Teye1 = Sphi * eye0 + Cphi * eye1; TeX1 = Sphi * eX0 + Cphi * eX1; break; case 2: Teye0 = Cphi * eye0 - Sphi * eye2; TeX0 = Cphi * eX0 - Sphi * eX2; Teye2 = Sphi * eye0 + Cphi * eye2; TeX2 = Sphi * eX0 + C

31、phi * eX2; break; case 3: Teye1 = Cphi * eye1 + Sphi * eye2; TeX1 = Cphi * eX1 + Sphi * eX2; Teye2 = -Sphi * eye1 + Cphi * eye2; TeX2 = -Sphi * eX1 + Cphi * eX2; break; case 4: Teye0 = Cphi * eye0 + Sphi * eye2; TeX0 = Cphi * eX0 + Sphi * eX2; Teye2 = -Sphi * eye0 + Cphi * eye2; TeX2 = -Sphi * eX0 +

32、 Cphi * eX2; break; case 5: Teye1 = Cphi * eye1 - Sphi * eye2; TeX1 = Cphi * eX1 - Sphi * eX2; Teye2 = Sphi * eye1 + Cphi * eye2; TeX2 = Sphi * eX1 + Cphi * eX2; break; vecProd(Teye, 0, TeX, 0, TeY, 0); if (scalProd(eye, 0, sideVec, twistSide * 3) 0.0) fixBlock(Teye, TeX, TeY, topCorners, topBlocks,

33、 2); fixBlock(eye, eX, eY, botCorners, botBlocks, 1); else fixBlock(eye, eX, eY, botCorners, botBlocks, 1); fixBlock(Teye, TeX, TeY, topCorners, topBlocks, 2); g.drawImage(offImage, 0, 0, this); public void update(Graphics g) paint(g); public void fixBlock(double ad1, double ad2, double ad3, double

34、ad4, int an, int i) copyVec(ad1, 0, light, 0); scalMult(light, 0, -3); addVec(ad2, 0, light, 0); subVec(ad3, 0, light, 0); for (this.i = 0; this.i 8; this.i+) newCoordthis.i * 2 = 60 + 35.1 * scalProd(ad4, this.i * 3, ad2, 0); newCoordthis.i * 2 + 1 = 60 - 35.1 * scalProd(ad4, this.i * 3, ad3, 0); f

35、or (this.i = 0; this.i 0.001) k = (int)(9.6 * (1.0 - cosAng(light, 0, sideVec, 3 * this.i); offGraphics.setColor(Color.black); for (j = 0; j 0) sx = newCoord2 * sidesthis.i * 4; sy = newCoord2 * sidesthis.i * 4 + 1; sdxh = (newCoord2 * sidesthis.i * 4 + 1 - sx) / sideW; sdxv = (newCoord2 * sidesthis

36、.i * 4 + 3 - sx) / sideH; sdyh = (newCoord2 * sidesthis.i * 4 + 1 + 1 - sy) / sideW; sdyv = (newCoord2 * sidesthis.i * 4 + 3 + 1 - sy) / sideH; p = anthis.i * 4 + 2; for (n = 0; n sideH; n+) q = anthis.i * 4; for (o = 0; o sideW; o+) rectX0 = (int)(sx + (double)o + 0.1) * sdxh + (double)n + 0.1) * s

37、dxv); rectX1 = (int)(sx + (double)o + 0.9) * sdxh + (double)n + 0.1) * sdxv); rectX2 = (int)(sx + (double)o + 0.9) * sdxh + (double)n + 0.9) * sdxv); rectX3 = (int)(sx + (double)o + 0.1) * sdxh + (double)n + 0.9) * sdxv); rectY0 = (int)(sy + (double)o + 0.1) * sdyh + (double)n + 0.1) * sdyv); rectY1 = (int)(sy + (double)o + 0.9) * sdyh + (double)n + 0.1) * sdyv); rectY2 = (int)(sy + (doubl

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!