source: trunk/packages/vizservers/nanovis/Vector3.h @ 2798

Last change on this file since 2798 was 2798, checked in by ldelgass, 13 years ago

Add emacs mode magic line in preparation for indentation cleanup

File size: 3.9 KB
Line 
1/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2/*
3 * ----------------------------------------------------------------------
4 * Vector3.h : Vector class with 3 components
5 *
6 * ======================================================================
7 *  AUTHOR:  Wei Qiao <qiaow@purdue.edu>
8 *           Purdue Rendering and Perceptualization Lab (PURPL)
9 *
10 *  Copyright (c) 2004-2006  Purdue Research Foundation
11 *
12 *  See the file "license.terms" for information on usage and
13 *  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
14 * ======================================================================
15 */
16#ifndef _VECTOR3_H_
17#define _VECTOR3_H_
18
19/*
20 * FIXME: The files that explicitly use the "rot*", "length", "distance", or
21 * "normalize" methods, should include the following headers.  Don't do it
22 * here.
23 */
24#include <math.h>
25#include "Mat4x4.h"
26
27class Vector3{
28private:
29    float radians(float degree) const {
30        return (M_PI * degree) / 180.0;
31    }
32public:
33    float x, y, z;
34    Vector3(void) {
35        /*empty*/
36    }
37    Vector3(float x_val, float y_val, float z_val) {
38        set(x_val, y_val, z_val);
39    }
40    Vector3 operator +(float scalar) {
41        return Vector3(x + scalar, y + scalar, z + scalar);
42    }
43    Vector3 operator -(float scalar) {
44        return Vector3(x - scalar, y - scalar, z - scalar);
45    }
46    Vector3 operator *(float scalar) {
47        return Vector3(x * scalar, y * scalar, z * scalar);
48    }
49    Vector3 operator /(float scalar) {
50        return Vector3(x / scalar, y / scalar, z / scalar);
51    }
52    Vector3 operator +(Vector3 &op2) {
53        return Vector3(x + op2.x, y + op2.y, z + op2.z);
54    }
55    Vector3 operator -(Vector3 &op2) {
56        return Vector3(x - op2.x, y - op2.y, z - op2.z);
57    }
58    float operator *(const Vector3 &op2){
59        return x*op2.x + y*op2.y + z*op2.z;
60    }
61    float dot(const Vector3& vec) const {
62        return x*vec.x + y*vec.y + z*vec.z;
63    }
64    bool equal(Vector3 &op2) {
65        return (x==op2.x) && (y==op2.y) && (z==op2.z);
66    }
67    Vector3 cross(Vector3 op2) {
68        return Vector3(y*op2.z - z*op2.y, z*op2.x - x*op2.z, x*op2.y - y*op2.x);
69    }
70    void operator<(Vector3 &op2) {
71        set(op2.x, op2.y, op2.z);
72    }
73    Vector3 operator ^(Vector3 &op2) {
74        return cross(op2);
75    }
76    Vector3 normalize(void) {
77        float len = length();
78        return Vector3(x / len, y / len, z / len);
79    }
80    Vector3 rot_x(float degree) {
81        float rad = radians(degree);
82        return Vector3(x,
83                       y*cos(rad) - z*sin(rad),
84                       y*sin(rad) + z*cos(rad));
85    }
86    Vector3 rot_y(float degree) {
87        float rad = radians(degree);
88        return Vector3(x*cos(rad) + z*sin(rad),
89                       y,
90                       -x*sin(rad) + z*cos(rad));
91    }
92    Vector3 rot_z(float degree) {
93        float rad = radians(degree);
94        return Vector3(x*cos(rad) - y*sin(rad),
95                       x*sin(rad) + y*cos(rad),
96                       z);
97    }
98    void set(float x_val, float y_val, float z_val) {
99        x = x_val, y = y_val, z = z_val;
100    }
101    void print(void){
102        TRACE("(x:%f, y:%f, z:%f)\n", x, y, z);
103    }
104    float distance(Vector3 &v) const {
105        return sqrtf(distanceSquare(v));
106    }
107    float distanceSquare(Vector3 &v) const {
108        return (x-v.x)*(x-v.x) + (y-v.y)*(y-v.y) + (z-v.z)*(z-v.z);
109    }
110    float distanceSquare(float vx, float vy, float vz) const {
111        return (x-vx)*(x-vx) + (y-vy)*(y-vy) + (z-vz)*(z-vz);
112    }
113    void transform(const Vector3& v, const Mat4x4& mat) {
114        const float* m = mat.m;
115        x = m[0] * v.x + m[4] * v.y + m[8]  * v.z + m[12];
116        y = m[1] * v.x + m[5] * v.y + m[9]  * v.z + m[13];
117        z = m[2] * v.x + m[6] * v.y + m[10] * v.z + m[14];
118    }
119    float length(void) const {
120        return sqrt(x*x + y*y + z*z);
121    }
122
123    Vector3 scale(const Vector3& scale)
124    {
125        Vector3 v;
126        v.x = x * scale.x;
127        v.y = y * scale.y;
128        v.z = z * scale.z;
129        return v;
130    }
131
132    friend Vector3 operator+(const Vector3& value1, const Vector3& value2);
133
134
135};
136
137inline Vector3 operator+(const Vector3& value1, const Vector3& value2)
138{
139        return Vector3(value1.x + value2.x, value1.y + value2.y, value1.z + value2.z);
140}
141
142#endif
Note: See TracBrowser for help on using the repository browser.