git-svn-id: https://reactphysics3d.googlecode.com/svn/trunk@218 92aac97c-a6ce-11dd-a772-7fcde58d38e6
This commit is contained in:
parent
ad0cf1debc
commit
d8fd9b09b7
|
@ -33,3 +33,24 @@ Polygon3D::Polygon3D(const std::vector<Vector3D>& vertexList)
|
||||||
Polygon3D::~Polygon3D() {
|
Polygon3D::~Polygon3D() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO : Delete this function if not needed
|
||||||
|
// Return true if a point is in the same plane and inside the polygon
|
||||||
|
// Hypothesis : The point has to be on the same plane as the polygon.
|
||||||
|
/*
|
||||||
|
bool Polygon3D::isPointInside(const Vector3D& point) const {
|
||||||
|
// TODO : Implement this method
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// TODO : Delete this function if not needed
|
||||||
|
// Return the intersection point between a segment and an egde of the polygon.
|
||||||
|
// Hypothesis : The segment must be in the same plane as the polygon and it
|
||||||
|
// must intersection with at least one edge of the polygon.
|
||||||
|
/*
|
||||||
|
Vector3D Polygon3D::getEdgeIntersectionWithSegment(const Segment3D& segment) const {
|
||||||
|
// TODO : Implement this method
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,9 @@ class Polygon3D {
|
||||||
|
|
||||||
int getNbVertex() const; // Return the number of vertex of the polygon
|
int getNbVertex() const; // Return the number of vertex of the polygon
|
||||||
Vector3D getVertex(unsigned int index) const throw(std::invalid_argument); // Return a vertex of the polygon
|
Vector3D getVertex(unsigned int index) const throw(std::invalid_argument); // Return a vertex of the polygon
|
||||||
|
bool isPointInside(const Vector3D& point) const; // Return true if a point is in the same plane and inside the polygon
|
||||||
|
// TODO : Delete the following function if not needed
|
||||||
|
//Vector3D getEdgeIntersectionWithSegment(const Segment3D& segment) const; // Return the intersection point between a segment and an egde of the polygon
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO : Test the Polygon3D class
|
// TODO : Test the Polygon3D class
|
||||||
|
@ -64,7 +67,7 @@ inline Vector3D Polygon3D::getVertex(unsigned int index) const throw(std::invali
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // End of the ReactPhysics3D
|
} // End of the ReactPhysics3D namespace
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -29,17 +29,11 @@ Segment3D::Segment3D() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Constructor with arguments
|
// Constructor with arguments
|
||||||
Segment3D::Segment3D(Vector3D& pointA, Vector3D& pointB) {
|
Segment3D::Segment3D(const Vector3D& pointA, const Vector3D& pointB) {
|
||||||
this->pointA = pointA;
|
this->pointA = pointA;
|
||||||
this->pointB = pointB;
|
this->pointB = pointB;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy-constructor
|
|
||||||
Segment3D::Segment3D(const Segment3D& segment)
|
|
||||||
:pointA(segment.pointA), pointB(segment.pointB) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Destructor
|
// Destructor
|
||||||
Segment3D::~Segment3D() {
|
Segment3D::~Segment3D() {
|
||||||
|
|
||||||
|
|
|
@ -38,35 +38,52 @@ class Segment3D {
|
||||||
Vector3D pointB; // Point B of the line segment
|
Vector3D pointB; // Point B of the line segment
|
||||||
|
|
||||||
public :
|
public :
|
||||||
Segment3D(); // Constructor
|
Segment3D(); // Constructor
|
||||||
Segment3D(Vector3D& pointA, Vector3D& pointB); // Constructor with arguments
|
Segment3D(const Vector3D& pointA, const Vector3D& pointB); // Constructor with arguments
|
||||||
Segment3D(const Segment3D& segment); // Copy-constructor
|
~Segment3D(); // Destructor
|
||||||
~Segment3D(); // Destructor
|
|
||||||
|
|
||||||
Vector3D getPointA() const; // Return the point A
|
Vector3D getPointA() const; // Return the point A
|
||||||
void setPointA(const Vector3D& pointA); // Set the point A
|
void setPointA(const Vector3D& pointA); // Set the point A
|
||||||
Vector3D getPointB() const; // Return the point B
|
Vector3D getPointB() const; // Return the point B
|
||||||
void setPointB(const Vector3D& pointB); // Set the point B
|
void setPointB(const Vector3D& pointB); // Set the point B
|
||||||
|
Vector3D getSegmentVector() const; // Return the vector between points A and B
|
||||||
|
double getLength() const; // Return the length of the segment
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO : Test the Segment3D class
|
// TODO : Test the Segment3D class
|
||||||
|
|
||||||
|
// Return the point A
|
||||||
inline Vector3D Segment3D::getPointA() const {
|
inline Vector3D Segment3D::getPointA() const {
|
||||||
return pointA;
|
return pointA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the point A
|
||||||
inline void Segment3D::setPointA(const Vector3D& pointA) {
|
inline void Segment3D::setPointA(const Vector3D& pointA) {
|
||||||
this->pointA = pointA;
|
this->pointA = pointA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get the point B
|
||||||
inline Vector3D Segment3D::getPointB() const {
|
inline Vector3D Segment3D::getPointB() const {
|
||||||
return pointB;
|
return pointB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the point B
|
||||||
inline void Segment3D::setPointB(const Vector3D& pointB) {
|
inline void Segment3D::setPointB(const Vector3D& pointB) {
|
||||||
this->pointB = pointB;
|
this->pointB = pointB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return the vector between points A and B
|
||||||
|
inline Vector3D Segment3D::getSegmentVector() const {
|
||||||
|
return (pointB - pointA);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the length of the segment
|
||||||
|
inline double Segment3D::getLength() const {
|
||||||
|
return (pointB - pointA).length();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // End of the ReactPhysics3D namespace
|
} // End of the ReactPhysics3D namespace
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -52,6 +52,7 @@ class Vector3D {
|
||||||
void setAllValues(double x, double y, double z); // Set all the values of the vector
|
void setAllValues(double x, double y, double z); // Set all the values of the vector
|
||||||
double length() const; // Return the lenght of the vector
|
double length() const; // Return the lenght of the vector
|
||||||
Vector3D getUnit() const throw(MathematicsException); // Return the corresponding unit vector
|
Vector3D getUnit() const throw(MathematicsException); // Return the corresponding unit vector
|
||||||
|
Vector3D getOpposite() const; // Return the vector in the opposite direction
|
||||||
double scalarProduct(const Vector3D& vector) const; // Scalar product of two vectors
|
double scalarProduct(const Vector3D& vector) const; // Scalar product of two vectors
|
||||||
Vector3D crossProduct(const Vector3D& vector) const; // Cross product of two vectors
|
Vector3D crossProduct(const Vector3D& vector) const; // Cross product of two vectors
|
||||||
|
|
||||||
|
@ -107,6 +108,12 @@ inline double Vector3D::length() const {
|
||||||
return sqrt(x*x + y*y + z*z);
|
return sqrt(x*x + y*y + z*z);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return the vector in the opposite direction
|
||||||
|
// TODO : Test this function
|
||||||
|
inline Vector3D Vector3D::getOpposite() const {
|
||||||
|
return (Vector3D(0.0, 0.0, 0.0) - *this);
|
||||||
|
}
|
||||||
|
|
||||||
// Scalar product of two vectors (inline)
|
// Scalar product of two vectors (inline)
|
||||||
inline double Vector3D::scalarProduct(const Vector3D& vector) const {
|
inline double Vector3D::scalarProduct(const Vector3D& vector) const {
|
||||||
// Compute and return the result of the scalar product
|
// Compute and return the result of the scalar product
|
||||||
|
|
|
@ -33,6 +33,8 @@
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
#include "exceptions.h"
|
#include "exceptions.h"
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
#include <cassert>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
// ---------- Mathematics functions ---------- //
|
// ---------- Mathematics functions ---------- //
|
||||||
|
|
||||||
|
@ -55,6 +57,83 @@ inline reactphysics3d::Vector3D rotateVectorWithQuaternion(const reactphysics3d:
|
||||||
|
|
||||||
// Convert the result quaternion into a vector
|
// Convert the result quaternion into a vector
|
||||||
return quaternionResult.vectorV();
|
return quaternionResult.vectorV();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO : Test this method
|
||||||
|
// Move a set of points by a given vector.
|
||||||
|
// The method returns a set of points moved by the given vector.
|
||||||
|
inline std::vector<reactphysics3d::Vector3D> movePoints(const std::vector<reactphysics3d::Vector3D>& points, const reactphysics3d::Vector3D& vector) {
|
||||||
|
std::vector<reactphysics3d::Vector3D> result;
|
||||||
|
|
||||||
|
// For each point of the set
|
||||||
|
for (unsigned int i=0; i<points.size(); ++i) {
|
||||||
|
// Move the point
|
||||||
|
result.push_back(points.at(i) + vector);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the result set of points
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO : Test this method
|
||||||
|
// Return the intersection between two Segment3D that are on the same line. The result of the intersection
|
||||||
|
// will be another Segment3D.
|
||||||
|
inline reactphysics3d::Segment3D computeParallelSegmentsIntersection(const reactphysics3d::Segment3D& segment1, const reactphysics3d::Segment3D& segment2) {
|
||||||
|
// The two segments should be colinear
|
||||||
|
assert(equal(std::abs(segment1.getSegmentVector().scalarProduct(segment2.getSegmentVector())), segment1.getSegmentVector().length() * segment2.getSegmentVector().length()));
|
||||||
|
|
||||||
|
// Result segment
|
||||||
|
reactphysics3d::Segment3D resultSegment;
|
||||||
|
|
||||||
|
// Compute the vector of the line where both segments are
|
||||||
|
reactphysics3d::Vector3D lineVector = segment1.getSegmentVector();
|
||||||
|
|
||||||
|
// Compute the projection of the two points of the second segment on the line
|
||||||
|
double projSegment2PointA = lineVector.getUnit().scalarProduct(segment2.getPointA() - segment1.getPointA());
|
||||||
|
double projSegment2PointB = lineVector.getUnit().scalarProduct(segment2.getPointB() - segment1.getPointA());
|
||||||
|
|
||||||
|
std::cout << "Segment 2 - Proj A : " << projSegment2PointA << std::endl;
|
||||||
|
std::cout << "Segment 2 - Proj B : " << projSegment2PointB << std::endl;
|
||||||
|
std::cout << "Segment 1 - length : " << segment1.getLength() << std::endl;
|
||||||
|
|
||||||
|
// The projections intervals should intersect
|
||||||
|
assert(!(projSegment2PointA < 0.0 && projSegment2PointB < 0.0));
|
||||||
|
assert(!(projSegment2PointA > segment1.getLength() && projSegment2PointB > segment1.getLength()));
|
||||||
|
|
||||||
|
// Return the segment intersection according to the configuration of two projection intervals
|
||||||
|
if (projSegment2PointA >= 0 && projSegment2PointA <= segment1.getLength() && projSegment2PointB >= segment1.getLength()) {
|
||||||
|
resultSegment.setPointA(segment2.getPointA());
|
||||||
|
resultSegment.setPointB(segment1.getPointB());
|
||||||
|
return resultSegment;
|
||||||
|
}
|
||||||
|
else if (projSegment2PointA <= 0 && projSegment2PointB >= 0 && projSegment2PointB <= segment1.getLength()) {
|
||||||
|
resultSegment.setPointA(segment1.getPointA());
|
||||||
|
resultSegment.setPointB(segment2.getPointB());
|
||||||
|
return resultSegment;
|
||||||
|
}
|
||||||
|
else if (projSegment2PointA <= 0 && projSegment2PointB >= segment1.getLength()) {
|
||||||
|
return segment1;
|
||||||
|
}
|
||||||
|
else if (projSegment2PointA <= segment1.getLength() && projSegment2PointB <= segment1.getLength()) {
|
||||||
|
return segment2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We should never go here
|
||||||
|
assert(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO : Delete this method if not needed
|
||||||
|
// Return the intersection between a Segment3D and a Polygon3D that are on the same plane. The result of the intersection
|
||||||
|
// will be another Segment3D.
|
||||||
|
//inline reactphysics3d::Segment3D computeSegmentPolygonIntersection(const reactphysics3d::Segment3D& segment, const reactphysics3d::Polygon3D& polygon) {
|
||||||
|
// TODO : Implement this method
|
||||||
|
//}
|
||||||
|
|
||||||
|
// TODO : Delete this method if not needed
|
||||||
|
// Return the intersection between two Polygon3D that are on the same plane. The result of the intersection
|
||||||
|
// will be another Polygon3D.
|
||||||
|
//inline reactphysics3d::Polygon3D computePolygonPolygonIntersection(const reactphysics3d::Polygon3D& polygon1, const reactphysics3d::Polygon3D& polygon2) {
|
||||||
|
// TODO : Implement this method
|
||||||
|
//}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue
Block a user