90 lines
1.5 KiB
C++
90 lines
1.5 KiB
C++
|
/**
|
||
|
@file Line.cpp
|
||
|
|
||
|
Line class
|
||
|
|
||
|
@maintainer Morgan McGuire, graphics3d.com
|
||
|
|
||
|
@created 2001-06-02
|
||
|
@edited 2006-01-28
|
||
|
*/
|
||
|
|
||
|
#include "G3D/Line.h"
|
||
|
#include "G3D/Plane.h"
|
||
|
|
||
|
namespace G3D {
|
||
|
|
||
|
Vector3 Line::intersection(const Plane& plane) const {
|
||
|
float d;
|
||
|
Vector3 normal = plane.normal();
|
||
|
plane.getEquation(normal, d);
|
||
|
float rate = _direction.dot(normal);
|
||
|
|
||
|
if (rate == 0) {
|
||
|
|
||
|
return Vector3::inf();
|
||
|
|
||
|
} else {
|
||
|
float t = -(d + _point.dot(normal)) / rate;
|
||
|
|
||
|
return _point + _direction * t;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
Line::Line(class BinaryInput& b) {
|
||
|
deserialize(b);
|
||
|
}
|
||
|
|
||
|
|
||
|
void Line::serialize(class BinaryOutput& b) const {
|
||
|
_point.serialize(b);
|
||
|
_direction.serialize(b);
|
||
|
}
|
||
|
|
||
|
|
||
|
void Line::deserialize(class BinaryInput& b) {
|
||
|
_point.deserialize(b);
|
||
|
_direction.deserialize(b);
|
||
|
}
|
||
|
|
||
|
|
||
|
Vector3 Line::closestPoint(const Vector3& pt) const {
|
||
|
float t = _direction.dot(pt - _point);
|
||
|
return _point + _direction * t;
|
||
|
}
|
||
|
|
||
|
|
||
|
Vector3 Line::point() const {
|
||
|
return _point;
|
||
|
}
|
||
|
|
||
|
|
||
|
Vector3 Line::direction() const {
|
||
|
return _direction;
|
||
|
}
|
||
|
|
||
|
|
||
|
Vector3 Line::closestPoint(const Line& B, float& minDist) const {
|
||
|
const Vector3& P1 = _point;
|
||
|
const Vector3& U1 = _direction;
|
||
|
|
||
|
Vector3 P2 = B.point();
|
||
|
Vector3 U2 = B.direction();
|
||
|
|
||
|
const Vector3& P21 = P2 - P1;
|
||
|
const Vector3& M = U2.cross(U1);
|
||
|
float m2 = M.length();
|
||
|
|
||
|
Vector3 R = P21.cross(M) / m2;
|
||
|
|
||
|
float t1 = R.dot(U2);
|
||
|
|
||
|
minDist = (float)abs(P21.dot(M)) / sqrt(m2);
|
||
|
|
||
|
return P1 + t1 * U1;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|