mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-02 09:52:27 -04:00
support three collinear points
This commit is contained in:
parent
1e0d35082d
commit
84ed9bd35b
@ -95,13 +95,9 @@ verify_points(const LPoint3f *begin, const LPoint3f *end) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create a plane to determine the planarity of the first three
|
||||
// points.
|
||||
Planef plane(begin[0], begin[1], begin[2]);
|
||||
LVector3f normal = plane.get_normal();
|
||||
float normal_length = normal.length();
|
||||
bool all_ok = IS_THRESHOLD_EQUAL(normal_length, 1.0f, 0.001f);
|
||||
bool all_ok = true;
|
||||
|
||||
// First, check for repeated or invalid points.
|
||||
const LPoint3f *pi;
|
||||
for (pi = begin; pi != end && all_ok; ++pi) {
|
||||
if ((*pi).is_nan()) {
|
||||
@ -117,6 +113,23 @@ verify_points(const LPoint3f *begin, const LPoint3f *end) {
|
||||
}
|
||||
}
|
||||
|
||||
if (all_ok) {
|
||||
// Create a plane to determine the planarity of the first three
|
||||
// points (or the first two points and the nth point thereafter, in
|
||||
// case the first three points happen to be collinear).
|
||||
bool got_normal = false;
|
||||
for (int i = 2; i < num_points && !got_normal; i++) {
|
||||
Planef plane(begin[0], begin[1], begin[i]);
|
||||
LVector3f normal = plane.get_normal();
|
||||
float normal_length = normal.length();
|
||||
got_normal = IS_THRESHOLD_EQUAL(normal_length, 1.0f, 0.001f);
|
||||
}
|
||||
|
||||
if (!got_normal) {
|
||||
all_ok = false;
|
||||
}
|
||||
}
|
||||
|
||||
return all_ok;
|
||||
}
|
||||
|
||||
@ -592,9 +605,16 @@ setup_points(const LPoint3f *begin, const LPoint3f *end) {
|
||||
_points.clear();
|
||||
|
||||
// Tell the base CollisionPlane class what its plane will be. We
|
||||
// can determine this from the first three 3-d points.
|
||||
Planef plane(begin[0], begin[1], begin[2]);
|
||||
set_plane(plane);
|
||||
// can determine this from the first three 3-d points (unless these
|
||||
// first three points happen to be collinear).
|
||||
bool got_normal = false;
|
||||
for (int i = 2; i < num_points && !got_normal; i++) {
|
||||
Planef plane(begin[0], begin[1], begin[2]);
|
||||
got_normal = (plane.get_normal().length_squared() > 0.1);
|
||||
if (got_normal) {
|
||||
set_plane(plane);
|
||||
}
|
||||
}
|
||||
|
||||
LVector3f normal = get_normal();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user