00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef LINE_H_
00026 #define LINE_H_
00027
00028 #include <Core/Primitive/Vector3.h>
00029 #include <Core/Primitive/Matrix33.h>
00030 #include <Core/Primitive/Matrix34.h>
00031 #include <Core/Primitive/Matrix44.h>
00032
00033 namespace Lamp{
00034
00035 class AxisAlignedBox;
00036 class Capsule;
00037 class Cone;
00038 class OrientedBox;
00039 class Plane;
00040 class Ray;
00041 class Segment;
00042 class Sphere;
00043 class Triangle;
00044
00045
00046
00047
00048
00049
00050
00051 class Line{
00052 public:
00053
00054
00055
00056
00057 static const Line zero;
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 Line(){}
00068
00069
00070
00071
00072
00073
00074 inline Line(const Vector3& origin, const Vector3& direction) :
00075 origin_(origin), direction_(direction){
00076 }
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 inline Line(float originX, float originY, float originZ,
00088 float directionX, float directionY, float directionZ) :
00089 origin_(originX, originY, originZ),
00090 direction_(directionX, directionY, directionZ){
00091 }
00092
00093
00094
00095
00096
00097 inline explicit Line(const float* const source) :
00098 origin_(source[0], source[1], source[2]),
00099 direction_(source[3], source[4], source[5]){
00100 }
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 inline void set(const Vector3& origin, const Vector3& direction){
00111 origin_ = origin;
00112 direction_ = direction;
00113 }
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 inline void set(float originX, float originY, float originZ,
00125 float directionX, float directionY, float directionZ){
00126 origin_.set(originX, originY, originZ);
00127 direction_.set(directionX, directionY, directionZ);
00128 }
00129
00130
00131
00132
00133
00134 inline void set(const float* const source){
00135 origin_.set(source[0], source[1], source[2]);
00136 direction_.set(source[3], source[4], source[5]);
00137 }
00138
00139
00140
00141
00142
00143
00144 inline void setOrigin(const Vector3& origin){ origin_ = origin; }
00145
00146
00147
00148
00149
00150 inline void setDirection(const Vector3& direction){
00151 direction_ = direction;
00152 }
00153
00154
00155
00156
00157
00158
00159
00160
00161 inline const Vector3& getOrigin() const{ return origin_; }
00162
00163
00164
00165
00166
00167 inline const Vector3& getDirection() const{ return direction_; }
00168
00169
00170
00171
00172
00173
00174
00175
00176 inline bool isZero() const{
00177 return (direction_.epsilonEquals(Vector3::zero, Math::epsilon));
00178 }
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 inline Line transform(const Matrix33& matrix) const{
00189 return Line(matrix * origin_, matrix * direction_);
00190 }
00191
00192
00193
00194
00195
00196
00197 inline Line transform(const Matrix34& matrix) const{
00198 return Line(matrix * origin_, matrix.multiply33(direction_));
00199 }
00200
00201
00202
00203
00204
00205
00206 inline Line transform(const Matrix44& matrix) const{
00207 return Line(matrix * origin_, matrix.multiply33(direction_));
00208 }
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 float getDistance(const Vector3& point) const{
00219 return Math::sqrt(getSquaredDistance(point));
00220 }
00221
00222
00223
00224
00225
00226
00227 float getSquaredDistance(const Vector3& point) const;
00228
00229
00230
00231
00232
00233
00234
00235 float getDistance(const AxisAlignedBox& axisAlignedBox) const{
00236 return Math::sqrt(getSquaredDistance(axisAlignedBox));
00237 }
00238
00239
00240
00241
00242
00243
00244 float getSquaredDistance(const AxisAlignedBox& axisAlignedBox) const;
00245
00246
00247
00248
00249
00250
00251
00252 float getDistance(const Capsule& capsule) const{
00253 return Math::sqrt(getSquaredDistance(capsule));
00254 }
00255
00256
00257
00258
00259
00260
00261 float getSquaredDistance(const Capsule& capsule) const;
00262
00263
00264
00265
00266
00267
00268
00269 float getDistance(const Cone& cone) const{
00270 return Math::sqrt(getSquaredDistance(cone));
00271 }
00272
00273
00274
00275
00276
00277
00278 float getSquaredDistance(const Cone& cone) const;
00279
00280
00281
00282
00283
00284
00285
00286 float getDistance(const Line& line) const{
00287 return Math::sqrt(getSquaredDistance(line));
00288 }
00289
00290
00291
00292
00293
00294
00295 float getSquaredDistance(const Line& line) const;
00296
00297
00298
00299
00300
00301
00302
00303 float getDistance(const OrientedBox& orientedBox) const{
00304 return Math::sqrt(getSquaredDistance(orientedBox));
00305 }
00306
00307
00308
00309
00310
00311
00312 float getSquaredDistance(const OrientedBox& orientedBox) const;
00313
00314
00315
00316
00317
00318
00319
00320 float getDistance(const Plane& plane) const;
00321
00322
00323
00324
00325
00326
00327 float getSquaredDistance(const Plane& plane) const{
00328 float distance = getDistance(plane);
00329 return (distance * distance);
00330 }
00331
00332
00333
00334
00335
00336
00337
00338 float getDistance(const Ray& ray) const{
00339 return Math::sqrt(getSquaredDistance(ray));
00340 }
00341
00342
00343
00344
00345
00346
00347 float getSquaredDistance(const Ray& ray) const;
00348
00349
00350
00351
00352
00353
00354
00355 float getDistance(const Segment& segment) const{
00356 return Math::sqrt(getSquaredDistance(segment));
00357 }
00358
00359
00360
00361
00362
00363
00364 float getSquaredDistance(const Segment& segment) const;
00365
00366
00367
00368
00369
00370
00371
00372 float getDistance(const Sphere& sphere) const{
00373 return Math::sqrt(getSquaredDistance(sphere));
00374 }
00375
00376
00377
00378
00379
00380
00381 float getSquaredDistance(const Sphere& sphere) const;
00382
00383
00384
00385
00386
00387
00388
00389 float getDistance(const Triangle& triangle) const{
00390 return Math::sqrt(getSquaredDistance(triangle));
00391 }
00392
00393
00394
00395
00396
00397
00398 float getSquaredDistance(const Triangle& triangle) const;
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409 bool intersect(const Vector3& point, float range = Math::epsilon) const;
00410
00411
00412
00413
00414
00415
00416
00417 bool intersect(const AxisAlignedBox& axisAlignedBox) const;
00418
00419
00420
00421
00422
00423
00424
00425 bool intersect(const Capsule& capsule) const;
00426
00427
00428
00429
00430
00431
00432
00433 bool intersect(const Cone& cone) const;
00434
00435
00436
00437
00438
00439
00440
00441
00442 bool intersect(const Line& line, float range = Math::epsilon) const;
00443
00444
00445
00446
00447
00448
00449
00450 bool intersect(const OrientedBox& orientedBox) const;
00451
00452
00453
00454
00455
00456
00457
00458 bool intersect(const Plane& plane) const;
00459
00460
00461
00462
00463
00464
00465
00466
00467 bool intersect(const Ray& ray, float range = Math::epsilon) const;
00468
00469
00470
00471
00472
00473
00474
00475
00476 bool intersect(const Segment& segment, float range = Math::epsilon) const;
00477
00478
00479
00480
00481
00482
00483
00484 bool intersect(const Sphere& sphere) const;
00485
00486
00487
00488
00489
00490
00491
00492 bool intersect(const Triangle& triangle) const;
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502 inline bool operator ==(const Line& target) const{
00503 return ((origin_ == target.origin_) &&
00504 (direction_ == target.direction_));
00505 }
00506
00507
00508
00509
00510
00511
00512
00513 inline bool epsilonEquals(
00514 const Line& target, float epsilon) const{
00515 Assert(epsilon >= 0.f);
00516 return (origin_.epsilonEquals(target.origin_, epsilon) &&
00517 direction_.epsilonEquals(target.direction_, epsilon));
00518 }
00519
00520
00521
00522
00523
00524
00525 inline bool operator !=(const Line& target) const{
00526 return ((origin_ != target.origin_) ||
00527 (direction_ != target.direction_));
00528 }
00529
00530
00531
00532
00533
00534
00535
00536 inline bool notEpsilonEquals(
00537 const Line& target, float epsilon) const{
00538 Assert(epsilon >= 0.f);
00539 return (origin_.notEpsilonEquals(target.origin_, epsilon) ||
00540 direction_.notEpsilonEquals(target.direction_, epsilon));
00541 }
00542
00543
00544
00545
00546
00547
00548
00549
00550 inline String toString() const{
00551 String returnString;
00552 returnString.format("{ ( %.8f, %.8f, %.8f ) ( %.8f, %.8f, %.8f ) }",
00553 origin_.x, origin_.y, origin_.z,
00554 direction_.x, direction_.y, direction_.z);
00555 return returnString;
00556 }
00557
00558 private:
00559
00560
00561
00562
00563 Vector3 origin_;
00564
00565 Vector3 direction_;
00566
00567 };
00568
00569
00570 }
00571 #endif // End of LINE_H_
00572