Judgment of C2 or C4 intersection of NURBS curve.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

66 lines
3.7 KiB

#include <iostream>
#include "include/C2C4.h"
using namespace std;
int main()
{
C2C4 c2C4;
c2C4.srf1.degree_u = 2;
c2C4.srf1.degree_v = 2;
c2C4.srf1.knots_u = { 0, 0, 0, 0.1, 0.5, 0.8, 1, 1, 1 };
c2C4.srf1.knots_v = { 0, 0, 0, 0.2, 0.7, 0.8, 1, 1, 1 };
c2C4.srf1.control_points = { 6, 6, {
glm::vec3(-1, 0, 0), glm::vec3(0, 1, 6), glm::vec3(1, 0, 4), glm::vec3(2, 0.5, 3), glm::vec3(3, 3, 1), glm::vec3(4, -5, 0),
glm::vec3(-2, 1, 1.2), glm::vec3(1, 2, 3), glm::vec3(2, 2, 3), glm::vec3(-1, -0.3, 2), glm::vec3(-1, 2, 0), glm::vec3(7, -8, 2),
glm::vec3(-3.4, 2, 3), glm::vec3(2, 3, 0), glm::vec3(4, 3, 7), glm::vec3(-2, 0, -0.2), glm::vec3(1, 1.7, 5), glm::vec3(9, -10.3, 6),
glm::vec3(-1.5, 3.2, 1), glm::vec3(2.6, 7, -2), glm::vec3(5, 0.8, 4.2), glm::vec3(-4, 1, 4), glm::vec3(2.1, 4, -2), glm::vec3(11, -6, 4),
glm::vec3(-0.2, 2, 0), glm::vec3(5, 3, 2), glm::vec3(5, 1.5, 1.4), glm::vec3(-3, 2, 5), glm::vec3(0.8, 1.3, 0), glm::vec3(15, -2, 0.9),
glm::vec3(3, 1.4, -1), glm::vec3(6, 2, 4), glm::vec3(-1, 0, -2), glm::vec3(0, 2.8, 2), glm::vec3(-0.5, 2, 1.2), glm::vec3(7, -3, -2),
}};
c2C4.srf1.weights = {6, 6, {0.3, 0.8, 0.5, 0.8, 0.6, 0.7,
0.2, 0.3, 0.6, 0.4, 0.9, 0.3,
0.8, 0.6, 0.3, 0.4, 0.6, 0.7,
0.5, 0.7, 0.8, 0.7, 0.3, 0.6,
0.7, 0.4, 0.6, 0.8, 0.5, 0.6,
0.4, 0.6, 0.4, 0.6, 0.9, 0.3
}};
c2C4.srf2.degree_u = 2;
c2C4.srf2.degree_v = 2;
c2C4.srf2.knots_u = { 0, 0, 0, 0.2, 0.5, 0.7, 1, 1, 1 };
c2C4.srf2.knots_v = { 0, 0, 0, 0.2, 0.6, 0.8, 1, 1, 1 };
c2C4.srf2.control_points = { 6, 6, {
glm::vec3(-1, 0, -2), glm::vec3(0, 1, 6), glm::vec3(1, 0, 4), glm::vec3(2, 0, 3), glm::vec3(3, 3, 1), glm::vec3(4, -5, 0),
glm::vec3(-2, 1, 1), glm::vec3(1, 2, 3), glm::vec3(2, 2, 3), glm::vec3(-1, 0, 2), glm::vec3(-1, 2, 0), glm::vec3(7, -5, 2),
glm::vec3(-3, 2, 3), glm::vec3(2, 3, 0), glm::vec3(4, 3, 7), glm::vec3(-2, 0, 0), glm::vec3(1, 1, 5), glm::vec3(3, -2, 4),
glm::vec3(-1, 3, 2), glm::vec3(2, 4, -2), glm::vec3(5, 0, 4), glm::vec3(-4, 1, 4), glm::vec3(2, 4, -2), glm::vec3(4, -3, 4),
glm::vec3(0, 2, 0), glm::vec3(5, 3, 2), glm::vec3(5, 1, 1), glm::vec3(-3, 2, 5), glm::vec3(0, 1.3, 0), glm::vec3(2, -2, 0),
glm::vec3(3, 2, -2), glm::vec3(6, 2, 4), glm::vec3(-1, 0, -2), glm::vec3(0, 2, 2), glm::vec3(0, 2, 1.2), glm::vec3(2, -3, -2),
}};
c2C4.srf2.weights = {6, 6, {0.3, 0.8, 0.5, 0.8, 0.6, 0.7,
0.2, 0.3, 0.6, 0.4, 0.9, 0.3,
0.8, 0.6, 0.3, 0.4, 0.6, 0.7,
0.5, 0.7, 0.8, 0.7, 0.3, 0.6,
0.7, 0.4, 0.6, 0.8, 0.5, 0.6,
0.4, 0.6, 0.4, 0.6, 0.9, 0.3
}};
if (!surfaceIsValid(c2C4.srf1) || !surfaceIsValid(c2C4.srf2)) {
// check if degree, knots and control points are configured as per
// #knots == #control points + degree + 1
printf("Invalid format as NURBS surfaces!\n");
return -1;
} else {
printf("Valid NURBS surface!\n");
}
auto res = c2C4.c2OrC4();
if(res.first) {
printf("It belongs to the C2 situation!\n");
} else if(res.second) {
printf("It belongs to the C4 situation!\n"
"The third-order sub-determinant(s) can be zero when excluding the following in the Jacobian matrix:\n"
"(index starts from 0) col(s)\n");
for(auto col: c2C4.c4ExcludeCols) printf("%d\n", col);
}
return 0;
}