/* * Copyright (c) 1996 CONNIE K. PENG All Rights Reserved. * * Permission to use, copy, modify, and distribute this software * and its documentation for NON-COMMERCIAL purposes. * */ public class Vector { public float element[]; public Vector() { element = new float[4]; element[0] = element[1] = element[2] = 0; element[3] = 1; } public Vector(Vector v) { element = new float[4]; for (int i = 0; i < 4; i++) element[i] = v.element[i]; } public Vector(float x, float y, float z) { element = new float[4]; element[0] = x; element[1] = y; element[2] = z; element[3] = 1; } public void set_element(float x, float y, float z) { element[0] = x; element[1] = y; element[2] = z; element[3] = 1; } public void make_vector() { element[3] = 0; } public void make_point() { element[3] = 1; } public void add(Vector v) { for (int i = 0; i < 4; i++) element[i] += v.element[i]; } public void sub(Vector v) { for (int i = 0; i < 4; i++) element[i] -= v.element[i]; } public Vector negative() { for (int i = 0; i < 3; i++) element[i] = - element[i]; return this; } public void scale (float f) { for (int i = 0; i < 3; i++) element[i] *= f; } public float magnitude() { float square = 0; for (int i = 0; i < 3; i++) square += element[i] * element[i]; return (float) Math.sqrt(square); } public float dot_product(Vector v) { float f = 0; for (int i = 0; i < 3; i++) f += element[i] * v.element[i]; return f; } public Vector cross_product(Vector v) { Vector cross = new Vector(); cross.element[0] = element[1] * v.element[2] - element[2] * v.element[1]; cross.element[1] = element[2] * v.element[0] - element[0] * v.element[2]; cross.element[2] = element[0] * v.element[1] - element[1] * v.element[0]; return cross; } public void orthogonal() { Matrix m = new Matrix(); m.rotatez(90); this.multiply(m); } public void multiply(Matrix m) { float[] e = new float[4]; for (int i = 0; i < 4; i++) { e[i] = 0; for (int j = 0; j < 4; j++) e[i] += element[j] * m.element[i][j]; } for (int i = 0; i < 4; i++) element[i] = e[i]; } // perspective transformation of a vector public void perspective(int distance) { element[0] = (element[0] / element[2]) * distance; element[1] = (element[1] / element[2]) * distance; element[2] = - 1 / element[2]; } public void print() { System.out.print("(" + element[0] + "," + element[1] + "," + element[2] + "," + element[3] + ")"); } }