亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? polygonmodeling.java

?? 如果對java3D感興趣的朋友
?? JAVA
字號:
//made by Hu Pan  2004.9.8

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class polygonModeling extends Applet implements KeyListener, ActionListener{

	private Image offScreenImage;
	private Ticker t;
	private paste[] Paste;
	private model[] models;
	private int numOfVisiblePolygons;
	private vector cameraPosition; // the change of camera position with respect of (0,0,0);
	private vector viewDirection; //  the view direction of the camera
	private boolean seeThrough;

	private double xzRotate, yzRotate;

	private boolean UP_TYPED, DOWN_TYPED, RIGHT_TYPED, LEFT_TYPED, MOVE_FOWARD, MOVE_BACKWORD, SLIDE_LEFT, SLIDE_RIGHT;
	private double forward, backward, slideLeft, slideRight;

	int time;

	public void init(){
		Paste = new paste[10000000];
		models = new model[6];

		models[0] = new desk(new vector(-18,-18,45));
		models[1] = new book(new vector(-7,-1.97,46.1));
		models[2] = new lamp(new vector(2,-1.97,56));
		models[3] = new chair(new vector(-10,-20,32));
		models[4] = new pencil(new vector(0,-1.9, 46));
		models[5] = new floor(new vector(-28,-17.9,25)); //back ground

		cameraPosition = new vector(0,0,0);
		viewDirection = new vector(0,0,1);

		addKeyListener(this);
		requestFocus();

		t = new Ticker(35);
		t.addActionListener(this);
		t.start();

	}



	public void actionPerformed(ActionEvent e){

		//============================control=============================================
		if(MOVE_FOWARD){
			if(forward < 0.5)
				forward += 0.05;
			cameraPosition = cameraPosition.subtract(viewDirection.unit().scale(forward));
		} else
			forward = 0;

		if(MOVE_BACKWORD){
			if(backward < 0.5)
				backward += 0.05;
			cameraPosition = cameraPosition.add(viewDirection.unit().scale(backward));
		} else
			backward = 0;

		if(SLIDE_LEFT){
			if(slideLeft<0.5)
				slideLeft += 0.05;
			vector left = viewDirection.cross(new vector(-viewDirection.x, -1000000, -viewDirection.z));
			cameraPosition = cameraPosition.add(left.unit().scale(slideLeft));
		} else
			slideLeft = 0;

		if(SLIDE_RIGHT){
			if(slideRight<0.5)
				slideRight += 0.05;
			vector right = viewDirection.cross(new vector(viewDirection.x, 1000000, viewDirection.z));
			cameraPosition = cameraPosition.add(right.unit().scale(slideRight));
		} else
			slideRight = 0;

		if(UP_TYPED){
			if(yzRotate < Math.PI/2){
				yzRotate+=0.03;
				if(yzRotate > Math.PI/2)
					yzRotate = Math.PI/2 - 0.001;
			}
		}

		if(DOWN_TYPED){
			if(yzRotate > -Math.PI/2){
				yzRotate-=0.03;
				if(yzRotate < -Math.PI/2)
					yzRotate =  -Math.PI/2 + 0.001;
			}
		}

		if(LEFT_TYPED){
			viewDirection = viewDirection.rotate_XZ(0.03);
			xzRotate-=0.03;
		}

		if(RIGHT_TYPED){
			xzRotate+=0.03;
			viewDirection = viewDirection.rotate_XZ(-0.03);
		}

		viewDirection = viewDirection.rotate_vertical(yzRotate);
		//=================================end control============================================




		//update the models' vertics accordiong to the user's move (camera's orientation)
		for(int i = 0; i < models.length; i++)
			models[i].update(cameraPosition, xzRotate, yzRotate);



		//sort models so that they are drawn in the right order
		sortModels();



		//load polygons of the models
		numOfVisiblePolygons = 0;
		for(int i = 0; i <  models.length-1; i++){
			int start = numOfVisiblePolygons;
			for(int j = 0; j < models[i].getPolygon().length; j++){
				if(models[i].getPolygon()[j].visible){
					Paste[numOfVisiblePolygons] = models[i].getPolygon()[j];
					numOfVisiblePolygons++;
				}
			}
			//sort polygons of the model so that they are drawn in the right order;
			sortPolygon(start, numOfVisiblePolygons);
		}



		repaint();
	}


	//sort models
	private void sortModels(){
		for(int i = 1; i < models.length-1; i++){
			for(int j = 0; j <models.length - i-1; j++){
				if(compare1(models[j], models[j+1])){
					model temp = models[j+1];
					models[j+1] = models[j];
					models[j] = temp;
				}
			}
		}
	}

	//sort polygons
	private boolean compare1(model a, model b){

		paste[] aPaste = a.getBoundary();
		paste[] bPaste = b.getBoundary();
		vector difference = a.getCentre().subtract(b.getCentre());

		boolean insideA = true;
		boolean insideB = true;

		vector origin = new vector(0,0,0);
		for(int i = 0; i < 6; i++){
			if(origin.subtract(aPaste[i].centre).dot(aPaste[i].normal) > 0)
			insideA = false;
		}

		for(int i = 0; i < 6; i++){
			if(origin.subtract(bPaste[i].centre).dot(bPaste[i].normal) > 0)
			insideB = false;
		}

		if(insideA)
			return true;

		if(insideB)
			return false;

		boolean bCantBeSeen = true;
		for(int i = 0; i < 6; i++){
			if(bPaste[i].visible){
				bCantBeSeen = false;
				break;
			}
		}
		if(bCantBeSeen)
			return true;

		paste comparebleA =  aPaste[0];
		for(int i = 0; i < 6; i++){
			if(aPaste[i].visible){
				comparebleA = aPaste[i];
				break;
			}
		}

		for(int i = 0; i < 6; i++){
			if(aPaste[i].visible){
				if(Math.abs(comparebleA.normal.dot(difference)) < Math.abs(aPaste[i].normal.dot(difference)))
					comparebleA = aPaste[i];
			}
		}

		paste comparebleB =  bPaste[0];
		for(int i = 0; i < 6; i++){
			if(bPaste[i].visible){
				comparebleB = bPaste[i];
				break;
			}
		}

		for(int i = 0; i < 6; i++){
			if(bPaste[i].visible){
				if(Math.abs(comparebleB.normal.dot(difference)) < Math.abs(bPaste[i].normal.dot(difference)))
					comparebleB = bPaste[i];
			}
		}

		try{
		if(compare2(comparebleA, comparebleB))
			return true;
		}catch(Exception e){}

		return false;
	}

	//sort polygon
	private void sortPolygon(int start, int finish){
		for(int i = start + 1; i < finish; i++){
			for(int j = start; j <finish - 1; j++){
				if(compare2(Paste[j], Paste[j+1])){
					paste temp = Paste[j+1];
					Paste[j+1] = Paste[j];
					Paste[j] = temp;
				}
			}
		}
	}

	//check if polygon a is completely inside the plane spand by polygon b (use painter's method)
	public boolean compare2(paste a, paste b){
		if(a.zMax < b.zMin)
			return true;
		if(a.zMin > b.zMax)
			return false;
		if(a.points[0].z < b.points[0].z && a.points[1].z < b.points[1].z && a.points[2].z < b.points[2].z && a.points[3].z < b.points[3].z)
			return true;



		boolean inside = true;
		for(int i = 0; i < b.points.length; i++){
			if(b.points[i].subtract(a.centre).unit().dot(a.normal) > 0.0001 ){
				inside = false;
				break;
			}

		}
		if(inside)
			return true;


		inside = true;
		for(int i = 0; i <a.points.length; i++){
			if(a.points[i].subtract(b.centre).unit().dot(b.normal) < -0.0001 ){
				inside = false;
				break;
			}
		}

		if(inside)
			return true;

		return false;
	}

	public void paint(Graphics g){
		// draw back ground polygons first which always need to be draw at first
		for(int i = 0; i < models[models.length-1].getPolygon().length; i++){
			if(models[models.length-1].getPolygon()[i].visible){
				if(!seeThrough)
					models[models.length-1].getPolygon()[i].draw(g);
			}
		}


		//then draw the polygon that are sorted
		for(int i = 0; i < numOfVisiblePolygons; i++){
			try{
			if(Paste[i].innerPaste != null){
				for(int j = 0; j < Paste[i].innerPaste.length; j++){
					Paste[i].innerPaste[j].wireFrameOn = seeThrough;
					Paste[i].innerPaste[j].draw(g);
				}
			}
			else{
				Paste[i].wireFrameOn = seeThrough;
				Paste[i].draw(g);
			}
			}catch(Exception e){}
		}
	}

	public void keyPressed(KeyEvent e){
		if(e.getKeyCode() == KeyEvent.VK_UP)
			UP_TYPED = true;
		else if(e.getKeyCode() == KeyEvent.VK_DOWN)
			DOWN_TYPED = true;
		else if(e.getKeyCode() == KeyEvent.VK_LEFT)
			LEFT_TYPED = true;
		else if(e.getKeyCode() == KeyEvent.VK_RIGHT)
			RIGHT_TYPED = true;
		else if(e.getKeyChar() == 'w')
			MOVE_FOWARD = true;
		else if(e.getKeyChar() == 's')
			MOVE_BACKWORD = true;
		else if(e.getKeyChar() == 'a')
			SLIDE_LEFT = true;
		else if(e.getKeyChar() == 'd')
			SLIDE_RIGHT = true;

		if(e.getKeyChar() == 'o')
			seeThrough = true;
		if(e.getKeyChar() == 'p')
			seeThrough = false;
	}


	public void keyReleased(KeyEvent e){
		if(e.getKeyCode() == KeyEvent.VK_UP)
			UP_TYPED = false;
		else if(e.getKeyCode() == KeyEvent.VK_DOWN)
			DOWN_TYPED = false;
		else if(e.getKeyCode() == KeyEvent.VK_LEFT)
			LEFT_TYPED = false;
		else if(e.getKeyCode() == KeyEvent.VK_RIGHT)
			RIGHT_TYPED = false;
		else if(e.getKeyChar() == 'w')
			MOVE_FOWARD = false;
		else if(e.getKeyChar() == 's')
			MOVE_BACKWORD = false;
		else if(e.getKeyChar() == 'a')
			SLIDE_LEFT = false;
		else if(e.getKeyChar() == 'd')
			SLIDE_RIGHT = false;
	}


	public void keyTyped(KeyEvent e){}
	public void update(Graphics g) {
		Graphics offScreenGraphics;
		if (offScreenImage == null) {
		offScreenImage = createImage(640, 480);
		}
		offScreenGraphics = offScreenImage.getGraphics();
		offScreenGraphics.setColor(Color.white);
		offScreenGraphics.fillRect(0, 0, 640, 480);
		paint(offScreenGraphics);
		g.drawImage(offScreenImage, 0, 0, this);
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产日韩综合av| 国产精品欧美一级免费| 日本韩国欧美三级| 国产一区二区精品久久99| 亚洲成av人影院在线观看网| 欧美韩国日本不卡| 精品国产污污免费网站入口 | 五月天久久比比资源色| 国产欧美日韩视频一区二区| 欧美另类z0zxhd电影| 成人午夜在线播放| 麻豆91在线观看| 偷偷要91色婷婷| 午夜成人免费视频| 视频一区在线播放| 秋霞午夜鲁丝一区二区老狼| 亚洲免费在线视频一区 二区| 一区在线观看免费| 欧美国产激情一区二区三区蜜月 | 欧美tickle裸体挠脚心vk| 欧美高清hd18日本| 91精品国产福利在线观看| 91精品欧美综合在线观看最新| 91丨porny丨蝌蚪视频| 色综合久久88色综合天天6| 一本久久a久久免费精品不卡| 在线看一区二区| 7777精品伊人久久久大香线蕉的 | 欧美做爰猛烈大尺度电影无法无天| www.欧美日韩国产在线| 色综合久久中文字幕综合网 | 中文字幕久久午夜不卡| 综合欧美亚洲日本| 日韩高清中文字幕一区| 成人的网站免费观看| 欧美亚洲动漫另类| 久久美女高清视频| 一区二区免费在线| 成人免费视频播放| 91精品国产入口在线| 中文字幕国产一区| 青青草国产精品亚洲专区无| 国产高清精品在线| 欧美午夜精品久久久久久超碰| 欧美影视一区在线| 欧美经典一区二区三区| 亚洲成人精品影院| 北条麻妃国产九九精品视频| 91精品久久久久久久99蜜桃| 亚洲免费观看在线视频| 亚洲欧洲三级电影| 国内精品伊人久久久久影院对白| 一本一道综合狠狠老| 国产婷婷精品av在线| 久久国产欧美日韩精品| 欧美主播一区二区三区美女| 日本一区二区电影| 另类的小说在线视频另类成人小视频在线 | 色综合网站在线| 精品国产伦一区二区三区免费 | 亚洲国产乱码最新视频| 色综合天天综合狠狠| 中文字幕一区二区三区不卡在线| 午夜一区二区三区视频| 激情伊人五月天久久综合| 六月丁香综合在线视频| 欧美少妇一区二区| 亚洲不卡av一区二区三区| av在线播放成人| 亚洲卡通动漫在线| 欧美视频第二页| 日本不卡视频在线观看| 91精品国产综合久久香蕉的特点 | 色欧美日韩亚洲| 亚洲最色的网站| 国产精品久久久久久亚洲伦| 成人av午夜影院| 亚洲天堂成人网| 丁香五精品蜜臀久久久久99网站| 99精品久久久久久| 日韩视频在线永久播放| 七七婷婷婷婷精品国产| 亚洲精品一区二区三区在线观看| 国产综合色在线| 亚洲三级理论片| 欧美日韩一区二区三区不卡| 偷拍一区二区三区四区| 日韩欧美亚洲另类制服综合在线| 激情小说亚洲一区| 亚洲欧美另类久久久精品| 色播五月激情综合网| 老司机免费视频一区二区三区| 国产午夜精品理论片a级大结局| 91视频在线观看免费| 蜜臀久久久久久久| 成人欧美一区二区三区黑人麻豆| 欧美日本一区二区| 一区二区三区免费网站| 欧美本精品男人aⅴ天堂| 波多野结衣亚洲| 国产在线视频一区二区三区| 亚洲三级在线免费| 国产女人水真多18毛片18精品视频| 欧美三片在线视频观看 | 欧美一卡二卡三卡四卡| 在线观看91视频| 成人av中文字幕| 福利一区二区在线| 国产剧情一区二区三区| 蜜桃一区二区三区在线观看| 亚洲成人在线观看视频| 亚洲精品乱码久久久久久黑人 | 日韩一区二区三区av| 欧美视频日韩视频在线观看| 色呦呦一区二区三区| 成人黄色小视频| 成人免费高清视频在线观看| 久久精品国产久精国产| 免费高清视频精品| 久久国产尿小便嘘嘘尿| 精品一区二区三区久久| 国产在线视频不卡二| 国产精品主播直播| 成人高清伦理免费影院在线观看| 国产成人精品影视| 972aa.com艺术欧美| 91免费在线播放| 91.麻豆视频| 久久丝袜美腿综合| 国产精品视频免费看| 亚洲欧美国产三级| 免费观看日韩电影| 亚洲三级在线观看| 99视频有精品| 波多野结衣视频一区| 欧洲一区在线观看| 欧美大度的电影原声| 中文av一区特黄| 精品盗摄一区二区三区| 国产精品久久久久7777按摩| 一区二区三区四区激情| 蜜桃免费网站一区二区三区| 国产夫妻精品视频| 欧美日韩久久一区二区| 中文字幕精品一区| 日韩电影一区二区三区四区| 成人午夜看片网址| 这里只有精品视频在线观看| 国产日韩在线不卡| 日韩不卡免费视频| 91在线视频18| 国产午夜精品在线观看| 奇米影视在线99精品| 成人av动漫在线| 久久在线观看免费| 日本女优在线视频一区二区| 99久久精品免费观看| 久久久影视传媒| 美女国产一区二区三区| 欧美日韩成人综合| 亚洲另类一区二区| 9i看片成人免费高清| 久久精品一级爱片| 寂寞少妇一区二区三区| 欧美一级高清大全免费观看| 亚洲综合色丁香婷婷六月图片| 成人高清免费观看| 日本一区二区三区四区| 国产精品资源网站| 久久综合精品国产一区二区三区| 三级一区在线视频先锋| 欧美日本乱大交xxxxx| 午夜欧美在线一二页| 欧美美女网站色| 久久国内精品视频| 日韩一级高清毛片| 国产精品国产自产拍在线| 国内精品伊人久久久久av影院| 日韩欧美国产精品一区| 国产一区在线不卡| 国产精品热久久久久夜色精品三区 | 中文字幕一区二区三区在线不卡 | 国产成人精品免费视频网站| 欧美激情在线观看视频免费| 国产剧情在线观看一区二区| 中文字幕第一页久久| 欧洲色大大久久| 免费视频最近日韩| 国产精品激情偷乱一区二区∴| 99国产精品99久久久久久| 日本一不卡视频| 1000部国产精品成人观看| 4438x亚洲最大成人网| 国产老女人精品毛片久久| 亚洲免费视频中文字幕| 精品国产乱子伦一区| 91免费国产在线观看| 国产一区二区伦理| 亚洲风情在线资源站| 国产精品天美传媒|