魔方 3D 模型

qungxue發表於2016-10-23

一段時間,剛畢業的時候,想寫一個可以玩的魔方3D模型,隔了很久都沒有怎麼精力去寫,總以為這是要消耗挺多時間精力,去年一段時間,在週末時間還是難耐的想去實現自己的想法,最後用java swing寫了一個簡單的模型。

這邊就記錄下來。

當然現在已經是寫好了,完事後,只是放在硬碟上一直都沒有再去動,應為想安裝個linux系統,這邊準備格式化硬碟,就想著把他放到網上去,因為太懶,這邊只是附上簡單的東西。

當時的想法,整個模型的立體旋轉,子模組的旋轉,然後磁性粘合。

這邊通過點選來進行整體的模組和子模組旋轉的切換,旋轉是一直按住滑鼠左鍵滑動實現。

子模組的旋轉,先單擊整個模組,將滑鼠移動到制定要滑動的子模組,然後程式會根據你滑動的方向判斷要旋轉的子模組。

如果再單擊滑鼠,又切換到整個模組的旋轉,儘量可以人性化的去玩弄魔方:


最初的想法都是一樣的,建立子模組,組建成一個整體。

程式碼是java實現,main方法在test.java中。

程式碼下載:http://download.csdn.net/detail/qungxue/9661698

程式碼沒有分級,都是放在同一個包下面:


其中的思想是,一個魔方WholeCubeModel.java物件,有27塊小方塊(Cube.java)組成,LittleSquare.java就是小方塊組裝物件,每個小方塊又有6個面組成,沒個面抽象出來成SubFace.java,這邊Axis3D.java是控制元件座標點物件。RoateModel.java模型,主要是處理魔方的一些旋轉和自動磁性粘合操作,CubeComparator.java是一個比較器,為了魔方旋轉的時候旋轉的人性化和吻合人類視覺感官對畫出的模型組建進行排序。

這邊附上SubFace.java的程式碼:

package com.ake.magiccube;

import java.awt.Color;
import java.awt.Polygon;
/**
 * just write one class that for sub cube, and this properties of 
 * cube contains for points and one color.
 * if you want to ask me why this extends Polygon, it is just because 
 * I want to paint it on the panel.
 * @author Administrator
 *
 */
public class SubFace{
	// define the face is exposing or not 
	private boolean isExpose;
	//define the color
	private Color color;
	//add four point of this subface
	private Axis3D[] points;
	//set center point
	private Axis3D center;
	//add the polygon 
	private Polygon polygon;
	//子立方塊的邊長大小
	public static double size=100;
	//標誌是否是內部面
	private boolean isInside;


	public boolean isInside() {
		return isInside;
	}

	public void setInside(boolean isInside) {
		this.isInside = isInside;
	}

	public SubFace(){
		//set null color;
		isExpose = true;
		color = null;
		polygon= new Polygon();
		center = new Axis3D(0,0,0);
	}
	
	public Axis3D[] getPoints() {
		return points;
	}

	public void setPoints(Axis3D[] points) {
		this.points = points;
		center.setValue((points[0].getX()+points[2].getX())/2,(points[0].getY()+points[2].getY())/2,(points[0].getZ()+points[2].getZ())/2);
		this.flushPolygon();
	}

	public Polygon getPolygon() {
		return polygon;
	}

	public void setPolygon(Polygon polygon) {
		this.polygon = polygon;
	}

	public boolean isExpose() {
		return isExpose;
	}
	

	public void setExpose(boolean isExpose) {
		this.isExpose = isExpose;
	}

	public Color getColor() {
		return color;
	}

	public void setColor(Color color) {
		this.color = color;
	}
	
	//每次更新四個定點的座標時候,記得更新多邊形的資訊。
	public void flushPolygon(){
		//如果多邊形的長度大於4的話,我們就重置
				if (polygon.npoints>=4) {
					polygon.reset();
				}
				//新增多邊形的邊
				for (int i = 0; i < points.length; i++) {
					polygon.addPoint((int)points[i].getX(), (int)points[i].getY());
					//System.out.println("Polygon flush:["+points[i].getX()+","+points[i].getY()+"]");
				}
	}

	public Axis3D getCenter() {
//		center.setValue((points[0].getX()+points[2].getX())/2,(points[0].getY()+points[2].getY())/2,(points[0].getZ()+points[2].getZ())/2);
		return center;
	}

	public void setCenter(Axis3D center) {
		this.center = center;
	}
	
	
	
}



相關文章