1 package com.insanityengine.ghia.m3; 2 3 /*** 4 * 5 * <P> 6 * Why isn't this called P5? I dunno... it is a 5-dimensional point 7 * three coordinates in the "physical" space and two in texture space. 8 * </P> 9 * 10 * @author BrianHammond 11 * 12 * $Header: /usr/local/cvsroot/ghia/src/java/com/insanityengine/ghia/m3/Pt3.java,v 1.13 2005/03/25 13:48:17 brian Exp $ 13 * 14 */ 15 16 public class Pt3 { 17 18 19 public float x, y, z; 20 public float s, t; 21 22 /*** 23 * 24 * Constructor 25 * 26 */ 27 public Pt3() { 28 } 29 30 /*** 31 * 32 * Constructor 33 * 34 */ 35 public Pt3( float d ) { 36 set( d ); 37 } 38 39 /*** 40 * 41 * Copy Constructor 42 * 43 */ 44 public Pt3( Pt3 that ) { 45 set( that ); 46 } 47 48 /*** 49 * 50 * Constructor 51 * 52 * @param x coordinate 53 * @param y coordinate 54 * @param z coordinate 55 * 56 */ 57 public Pt3( float x, float y, float z ) { 58 set( x, y, z ); 59 } 60 61 /*** 62 * 63 * Set (x,y,z) to d 64 * 65 * @param d value to set to 66 * 67 * @return this 68 * 69 */ 70 public final Pt3 set( float d ) { 71 return set( d, d, d ); 72 } 73 74 /*** 75 * 76 * Set the point to (x,y,z) 77 * 78 * @param x coordinate 79 * @param y coordinate 80 * @param z coordinate 81 * 82 * @return this 83 * 84 */ 85 public final Pt3 set( float x, float y, float z ) { 86 this.x = x; 87 this.y = y; 88 this.z = z; 89 return this; 90 } 91 92 /*** 93 * 94 * Copy that point 95 * 96 * @param that 97 * 98 * @return this 99 * 100 */ 101 public final Pt3 set( Pt3 that ) { 102 set( that.x, that.y, that.z ); 103 s = that.s; 104 t = that.t; 105 return this; 106 } 107 108 /*** 109 * 110 * Swap with that point 111 * 112 * @param that point 113 * 114 * @return this 115 * 116 */ 117 public final Pt3 swap( Pt3 that ) { 118 float a = x; 119 float b = y; 120 float c = z; 121 this.x = that.x; 122 this.y = that.y; 123 this.z = that.z; 124 that.x = a; 125 that.y = b; 126 that.z = c; 127 a = this.s; 128 b = this.t; 129 this.s = that.s; 130 this.t = that.t; 131 that.s = a; 132 that.t = b; 133 return this; 134 } 135 136 /*** 137 * 138 * Calculate the dot product with that point 139 * 140 * @param that point to use 141 * 142 * @return dot produce 143 * 144 */ 145 public final float dot( Pt3 that ) { 146 return ( 147 this.x * that.x + 148 this.y * that.y + 149 this.z * that.z 150 ); 151 } 152 153 /*** 154 * 155 * Calculate the distance squared to that point 156 * 157 * @param that point to use 158 * 159 * @return squared distance to that point 160 * 161 */ 162 public final float distance2( Pt3 that ) { 163 return ( 164 + ( that.x - this.x ) * ( that.x - this.x ) 165 + ( that.y - this.y ) * ( that.y - this.y ) 166 + ( that.z - this.z ) * ( that.z - this.z ) 167 ); 168 } 169 170 /*** 171 * 172 * add 173 * 174 * @param d 175 * 176 * @return a Pt3 177 * 178 */ 179 public final Pt3 add( float d ) { 180 return add( d, d, d ); 181 } 182 183 /*** 184 * 185 * add 186 * 187 * @param x 188 * @param y 189 * @param z 190 * 191 * @return a Pt3 192 * 193 */ 194 public final Pt3 add( float x, float y, float z ) { 195 this.x += x; 196 this.y += y; 197 this.z += z; 198 return this; 199 } 200 201 /*** 202 * 203 * Add that point from this point 204 * 205 * @param that point to use 206 * 207 * @return this 208 * 209 */ 210 public final Pt3 add( Pt3 that ) { 211 return add( that.x, that.y, that.z ); 212 } 213 /*** 214 * 215 * Subtract that point from this point 216 * 217 * @param that point to use 218 * 219 * @return this 220 * 221 */ 222 public final Pt3 subtract( Pt3 that ) { 223 this.x -= that.x; 224 this.y -= that.y; 225 this.z -= that.z; 226 return this; 227 } 228 229 /*** 230 * 231 * Multiply this point by a scalar 232 * 233 * @param scalar to multiply by 234 * 235 * @return this 236 * 237 */ 238 public final Pt3 multiply( float scalar ) { 239 x *= scalar; 240 y *= scalar; 241 z *= scalar; 242 return this; 243 } 244 245 /*** 246 * 247 * Divide this point by a scalar 248 * 249 * @param scalar to divide by 250 * 251 * @return this 252 * 253 */ 254 public final Pt3 divide( float scalar ) { 255 if ( 0 == scalar ) { 256 x /= scalar; 257 y /= scalar; 258 z /= scalar; 259 } 260 return this; 261 } 262 263 /*** 264 * 265 * Normalize the length of the the point (as a vector) to 266 * a unit vector 267 * 268 * @return this 269 * 270 */ 271 public final Pt3 normalize() { 272 float d = ( float ) Math.sqrt( x * x + y * y + z * z ); 273 if ( 0 != d ) { 274 x /= d; 275 y /= d; 276 z /= d; 277 } 278 return this; 279 } 280 281 /*** 282 * 283 * Given three points, calculate the normal vector into 284 * this point 285 * 286 * @param pt1 to use 287 * @param pt2 to use 288 * @param pt3 to use 289 * 290 * @return this 291 * 292 */ 293 public final Pt3 normal( Pt3 pt1, Pt3 pt2, Pt3 pt3 ) { 294 float ax = pt1.x - pt2.x; 295 float ay = pt1.y - pt2.y; 296 float az = pt1.z - pt2.z; 297 298 float bx = pt3.x - pt2.x; 299 float by = pt3.y - pt2.y; 300 float bz = pt3.z - pt2.z; 301 302 x = ( ay * bz - az * by ); 303 y = ( az * bx - ax * bz ); 304 z = ( ax * by - ay * bx ); 305 306 ax = ( float ) Math.sqrt( x * x + y * y + z * z ); 307 if ( 0 != ax ) { 308 x /= ax; 309 y /= ax; 310 z /= ax; 311 } 312 return this; 313 } 314 315 /*** 316 * 317 * Subtract pt2 from pt1 and store the result in this point 318 * 319 * @param pt1 to use 320 * @param pt2 to use 321 * 322 * @return this 323 * 324 */ 325 public final Pt3 minus( Pt3 pt1, Pt3 pt2 ) { 326 x = pt1.x - pt2.x; 327 y = pt1.y - pt2.y; 328 z = pt1.z - pt2.z; 329 return this; 330 } 331 332 /*** 333 * 334 * Add pt1 to pt2 and store the result in this point 335 * 336 * @param pt1 to use 337 * @param pt2 to use 338 * 339 * @return this 340 * 341 */ 342 public final Pt3 plus( Pt3 pt1, Pt3 pt2 ) { 343 x = pt1.x + pt2.x; 344 y = pt1.y + pt2.y; 345 z = pt1.z + pt2.z; 346 return this; 347 } 348 349 /*** 350 * 351 * Calculate the cross product and store the result in this point 352 * 353 * @param pt1 to use 354 * @param pt2 to use 355 * 356 * @return this 357 * 358 */ 359 public final Pt3 cross( Pt3 pt1, Pt3 pt2 ) { 360 x = ( pt1.y * pt2.z - pt1.z * pt2.y ); 361 y = ( pt1.z * pt2.x - pt1.x * pt2.z ); 362 z = ( pt1.x * pt2.y - pt1.y * pt2.x ); 363 return this; 364 } 365 366 /*** 367 * 368 * Multiply the point by the matrix and store the result in this point 369 * 370 * @param matrix to multiply 371 * @param point to multiply 372 * 373 * @return this 374 * 375 */ 376 public final Pt3 multiply( Mat4 matrix, Pt3 point ) { 377 x = ( 378 point.x * matrix.mat[ 0 ][ 0 ] + 379 point.y * matrix.mat[ 0 ][ 1 ] + 380 point.z * matrix.mat[ 0 ][ 2 ] + 381 1 * matrix.mat[ 0 ][ 3 ] 382 ); 383 384 y = ( 385 point.x * matrix.mat[ 1 ][ 0 ] + 386 point.y * matrix.mat[ 1 ][ 1 ] + 387 point.z * matrix.mat[ 1 ][ 2 ] + 388 1 * matrix.mat[ 1 ][ 3 ] 389 ); 390 391 z = ( 392 point.x * matrix.mat[ 2 ][ 0 ] + 393 point.y * matrix.mat[ 2 ][ 1 ] + 394 point.z * matrix.mat[ 2 ][ 2 ] + 395 1 * matrix.mat[ 2 ][ 3 ] 396 ); 397 return this; 398 } 399 400 /*** 401 * 402 * Convert to string representation 403 * 404 * @return string representation 405 * 406 */ 407 public String toString() { 408 return ( 409 "pt3" + "(" + x + " , " + y + " , " + z + " )" 410 ); 411 } 412 413 /*** 414 * 415 * Get the value of x 416 * 417 * @return the value of x 418 * 419 */ 420 public final float getX() { 421 return x; 422 } 423 424 /*** 425 * 426 * Set the value of x 427 * 428 * @param newValue of x 429 * 430 */ 431 public final void setX( float newValue ) { 432 x = newValue; 433 } 434 435 /*** 436 * 437 * Get the value of y 438 * 439 * @return the value of y 440 * 441 */ 442 public final float getY() { 443 return y; 444 } 445 446 /*** 447 * 448 * Set the value of y 449 * 450 * @param newValue of y 451 * 452 */ 453 public final void setY( float newValue ) { 454 y = newValue; 455 } 456 457 /*** 458 * 459 * Get the value of z 460 * 461 * @return the value of z 462 * 463 */ 464 public final float getZ() { 465 return z; 466 } 467 468 /*** 469 * 470 * Set the value of z 471 * 472 * @param newValue of z 473 * 474 */ 475 public final void setZ( float newValue ) { 476 z = newValue; 477 } 478 479 /*** 480 * 481 * Get the value of s 482 * 483 * @return the value of s 484 * 485 */ 486 public final float getS() { 487 return s; 488 } 489 490 /*** 491 * 492 * Set the value of s 493 * 494 * @param newValue of s 495 * 496 */ 497 public final void setS( float newValue ) { 498 s = newValue; 499 } 500 501 /*** 502 * 503 * Get the value of t 504 * 505 * @return the value of t 506 * 507 */ 508 public final float getT() { 509 return t; 510 } 511 512 /*** 513 * 514 * Set the value of t 515 * 516 * @param newValue of t 517 * 518 */ 519 public final void setT( float newValue ) { 520 t = newValue; 521 } 522 523 } 524 525 /*** 526 * 527 * $Log: Pt3.java,v $ 528 * Revision 1.13 2005/03/25 13:48:17 brian 529 * make toString less verbose... 530 * 531 * Revision 1.12 2005/03/25 13:08:17 brian 532 * make divide less silly 533 * 534 * Revision 1.11 2005/03/19 17:50:02 brian 535 * repackaging 536 * 537 * Revision 1.10 2005/03/15 05:45:33 brian 538 * reduce code dup 539 * 540 * Revision 1.9 2005/03/12 04:58:47 brian 541 * call the methods set instead of copy 542 * 543 * Revision 1.8 2005/03/11 23:35:31 brian 544 * major refactoring to add in com.insanityengine.ghia.libograf.State bitz 545 * 546 * Revision 1.7 2004/09/01 18:30:00 brian 547 * added the add method I should added before but it is added now... 548 * 549 * Revision 1.6 2004/09/01 01:10:42 brian 550 * fix class level javadoc placement 551 * 552 * Revision 1.5 2004/09/01 00:11:06 brian 553 * author, log and header stuff 554 * 555 * 556 */