Changeset View
Changeset View
Standalone View
Standalone View
tests/gtests/blenlib/BLI_math_geom_test.cc
| Context not available. | |||||
| #include "BLI_math.h" | #include "BLI_math.h" | ||||
| #define WEIGHTED_POINT(p1, p2, p3, w1, w2, w3) {p1[0]*w1 + p2[0]*w2 + p3[0]*w3, p1[1]*w1 + p2[1]*w2 + p3[1]*w3, p1[2]*w1 + p2[2]*w2 + p3[2]*w3} | |||||
| #define COLUMN_PRODUCT_5(A, B, row) (A[0]*B[0][row] + A[1]*B[1][row] + A[2]*B[2][row] + A[3]*B[3][row] + A[4]*B[4][row]) | |||||
| TEST(math_geom, DistToLine2DSimple) | TEST(math_geom, DistToLine2DSimple) | ||||
| { | { | ||||
| float p[2] = {5.0f, 1.0f}, | float p[2] = {5.0f, 1.0f}, | ||||
| Context not available. | |||||
| float distance = dist_to_line_segment_v2(p, a, b); | float distance = dist_to_line_segment_v2(p, a, b); | ||||
| EXPECT_NEAR(sqrtf(2.0f), distance, 1e-6); | EXPECT_NEAR(sqrtf(2.0f), distance, 1e-6); | ||||
| } | } | ||||
| TEST(math_geom, IsectPointPoly2DSimpleSquare) | |||||
| { | |||||
| float square[][2] = {{0.0f, 1.0f}, {-1.0f, 0.0f}, {0.0f, -1.0f}, {1.0f, 0.0f}}, | |||||
| p_inside[1][2] = {{0.0f, 0.0f}}, | |||||
| p_outside[4][2] = {{-2.0f, 0.0f}, {2.0f, 0.0f}, {0.0f, -2.0f}, {0.0f, 2.0f}}; | |||||
| int square_vertices_quantity = 4; | |||||
| bool holes_in_square = false; /* currently unused */ | |||||
| for (int i = 0; i<1; i++) EXPECT_TRUE(isect_point_poly_v2(p_inside[i], square, square_vertices_quantity, holes_in_square)); | |||||
| for (int i = 0; i<4; i++) EXPECT_FALSE(isect_point_poly_v2(p_outside[i], square, square_vertices_quantity, holes_in_square)); | |||||
| } | |||||
| TEST(math_geom, IsectPointPoly2DConvex) | |||||
| { | |||||
| float potato[][2] = {{1.0f, 1.0f}, {2.5f, 0.5f}, {3.75f, 1.0f}, {4.0f, 2.5f}, {1.5f, 5.0f}, {0.5f, 3.5f}, {0.5f, 2.5f}}, | |||||
| p_inside[3][2] = {{1.000001f, 1.000001f}, {2.0f, 2.5f}, {0.5000001f, 3.0f}}, | |||||
| p_outside[5][2] = {{0.999999f, 0.999999f}, {5.0f, 2.5f}, {0.499999f, 3.0f}}; | |||||
| int potato_vertices_quantity = 7; | |||||
| bool holes_in_potato = false; /* currently unused */ | |||||
| for(int i = 0; i<1; i++) EXPECT_TRUE(isect_point_poly_v2(p_inside[i], potato, potato_vertices_quantity, holes_in_potato)); | |||||
| for(int i = 0; i<4; i++) EXPECT_FALSE(isect_point_poly_v2(p_outside[i], potato, potato_vertices_quantity, holes_in_potato)); | |||||
| } | |||||
| TEST(math_geom, IsectPointPoly2DDoubleSquare) | |||||
| { | |||||
| float square[][2] = {{0.0f, 1.0f}, {-1.0f, 0.0f}, {0.0f, -1.0f}, {1.0f, 0.0f}, {0.0f, 1.0f}, | |||||
| {0.0f, 0.5f}, {0.5f, 0.0f}, {0.0f, -0.5f}, {-0.5f, 0.0f}, {0.0f, 0.5f}}, | |||||
| p_inside[4][2] = {{0.75f, 0.0f}, {-0.75f, 0.0f}, {0.0f, -0.75f}, {0.0f, 0.75f}}, | |||||
| p_outside[5][2] = {{0.0f, 0.0f}, {-2.0f, 0.0f}, {2.0f, 0.0f}, {0.0f, -2.0f}, {0.0f, 2.0f}}; | |||||
| int square_vertices_quantity = 10; | |||||
| bool holes_in_square = false; /* currently unused */ | |||||
| for(int i = 0; i<1; i++) EXPECT_TRUE(isect_point_poly_v2(p_inside[i], square, square_vertices_quantity, holes_in_square)); | |||||
| for(int i = 0; i<4; i++) EXPECT_FALSE(isect_point_poly_v2(p_outside[i], square, square_vertices_quantity, holes_in_square)); | |||||
| } | |||||
| TEST(math_geom, IsectPointQuad2DSimpleSquare) | |||||
| { | |||||
| float square[][2] = {{0.0f, 1.0f}, {-1.0f, 0.0f}, {0.0f, -1.0f}, {1.0f, 0.0f}}, | |||||
| p_inside[1][2] = {{0.0f, 0.0f}}; | |||||
| for(int i = 0; i<1; i++) EXPECT_TRUE(isect_point_quad_v2(p_inside[i], square[0], square[1], square[2], square[3])); | |||||
| } | |||||
| TEST(math_geom, IsectPointQuad2DSimpleSquareOutside) | |||||
| { | |||||
| float square[][2] = {{0.0f, 1.0f}, {-1.0f, 0.0f}, {0.0f, -1.0f}, {1.0f, 0.0f}}, | |||||
| p_outside[4][2] = {{-2.0f, 0.0f}, {2.0f, 0.0f}, {0.0f, -2.0f}, {0.0f, 2.0f}}; | |||||
| for(int i = 0; i<4; i++) EXPECT_FALSE(isect_point_quad_v2(p_outside[i], square[0], square[1], square[2], square[3])); | |||||
| } | |||||
| TEST(math_geom, IsectPointTri2DSimpleTriangle) | |||||
| { | |||||
| float triangle[3][2] = {{-1.0f, -1.0f}, {1.0f, -1.0f}, {0.0f, 1.0f}}, | |||||
| p[2] = {0.0f, 0.0f}; | |||||
| EXPECT_EQ(1,isect_point_tri_v2(p, triangle[0], triangle[1], triangle[2])); | |||||
| } | |||||
| TEST(math_geom, IsectPointTri2DSimpleTriangleOutside) | |||||
| { | |||||
| float triangle[3][2] = {{-1.0f, -1.0f}, {0.0f, 1.0f}, {1.0f, -1.0f}}, | |||||
| p[2] = {2.0f, 2.0f}; | |||||
| EXPECT_EQ(0,isect_point_tri_v2(p, triangle[0], triangle[1], triangle[2])); | |||||
| } | |||||
| TEST(math_geom, IsectPointTri2DSimpleTriangleReversed) | |||||
| { | |||||
| float triangle[3][2] = {{-1.0f, -1.0f}, {0.0f, 1.0f}, {1.0f, -1.0f}}, | |||||
| p[2] = {0.0f, 0.0f}; | |||||
| EXPECT_EQ(-1,isect_point_tri_v2(p, triangle[0], triangle[1], triangle[2])); | |||||
| } | |||||
| TEST(math_geom, IsectPointTri2DManyTriangles) | |||||
| { | |||||
| for(float x1 = 4.001f; x1 <= 12.0f; x1 += 2.71828f) for(float y1 = 0.001f; y1 <= 10.0f; y1 += 2.71828f) | |||||
| for(float x2 = x1 + 0.001f; x2 <= 15.02f; x2 += 2.71828f) for(float y2 = 0.001f; y2 <= y2 - 3.1f; y2 += 2.71828f) | |||||
| for(float w1 = 0.01f; w1 <= 0.999f; w1 += 0.113f) for(float w2 = 0.001f; w2 <= 1.0f - w1 - 0.0012; w2 += 0.1212f) | |||||
| { | |||||
| float a[2] = {0.0f, 0.0f}, | |||||
| b[2] = {x1, y1}, | |||||
| c[2] = {x2, y2}, | |||||
| p[2] = {w1*x1 + w2*x2, w1*y1 + w2*y2}; | |||||
| EXPECT_EQ(1,isect_point_tri_v2(p, a, b, c)); | |||||
| } | |||||
| } | |||||
| TEST(math_geom, IsectPointTri2DManyTrianglesReversed) | |||||
| { | |||||
| for(float x1 = 4.001f; x1 <= 12.0f; x1 += 2.71828f) for(float y1 = 0.001f; y1 <= 10.0f; y1 += 2.71828f) | |||||
| for(float x2 = x1 + 0.001f; x2 <= 15.02f; x2 += 2.71828f) for(float y2 = 0.001f; y2 <= y2 - 3.1f; y2 += 2.71828f) | |||||
| for(float w1 = 0.01f; w1 <= 0.999f; w1 += 0.113f) for(float w2 = 0.001f; w2 <= 1.0f - w1 - 0.0012; w2 += 0.1212f) | |||||
| { | |||||
| float a[2] = {0.0f, 0.0f}, | |||||
| b[2] = {x2, y2}, | |||||
| c[2] = {x1, y1}, | |||||
| p[2] = {w1*x1 + w2*x2, w1*y1 + w2*y2}; | |||||
| EXPECT_EQ(-1,isect_point_tri_v2(p, a, b, c)); | |||||
| } | |||||
| } | |||||
| TEST(math_geom, IsectPointTri2DManyTrianglesOutside) | |||||
| { | |||||
| for(float x1 = 4.001f; x1 <= 12.0f; x1 += 2.71828f) for(float y1 = 0.001f; y1 <= 10.0f; y1 += 2.71828f) | |||||
| for(float x2 = x1 + 0.001f; x2 <= 15.02f; x2 += 2.71828f) for(float y2 = 0.001f; y2 <= y2 - 3.1f; y2 += 2.71828f) | |||||
| { | |||||
| float a[2] = {0.0f, 0.0f}, | |||||
| b[2] = {x1, y1}, | |||||
| c[2] = {x2, y2}, | |||||
| p[2] = {-0.01f, -0.01f}; | |||||
| EXPECT_EQ(0,isect_point_tri_v2(p, a, b, c)); | |||||
| } | |||||
| } | |||||
| TEST(math_geom, InteprWeightsFace3DSingle) | |||||
| { | |||||
| float a[3] = {0.0f, 0.0f, 0.0f}, | |||||
| b[3] = {1.0f, 0.0f, 0.0f}, | |||||
| c[3] = {0.0f, 1.0f, 0.0f}, | |||||
| d[3] = {0.0f, 0.0f, 1.0f}, | |||||
| p[3] = {0.0f, 0.0f, 0.0f}, | |||||
| weights[4] = {0.0f, 0.0f, 0.0f}; | |||||
| interp_weights_face_v3(weights,a,b,c,d,p); | |||||
| EXPECT_NEAR(weights[0],1.0f, 0.000001f); | |||||
| EXPECT_NEAR(weights[1],0.0f, 0.000001f); | |||||
| EXPECT_NEAR(weights[2],0.0f, 0.000001f); | |||||
| EXPECT_NEAR(weights[3],0.0f, 0.000001f); | |||||
| } | |||||
| TEST(math_geom, InteprWeightsFace3DSingleWithNull) | |||||
| { | |||||
| float a[3] = {0.0f, 0.0f, 0.0f}, | |||||
| b[3] = {1.0f, 0.0f, 0.0f}, | |||||
| c[3] = {0.0f, 1.0f, 0.0f}, | |||||
| d[3] = {0.0f, 0.0f, 1.0f}, | |||||
| p[3] = {0.0f, 1.0f, 0.0f}, | |||||
| weights[4] = {0.0f, 0.0f, 0.0f}; | |||||
| interp_weights_face_v3(weights,a,b,c,d,p); | |||||
| EXPECT_NEAR(weights[0],0.0f, 0.000001f); | |||||
| EXPECT_NEAR(weights[1],0.0f, 0.000001f); | |||||
| EXPECT_NEAR(weights[2],1.0f, 0.000001f); | |||||
| EXPECT_NEAR(weights[3],0.0f, 0.000001f); | |||||
| } | |||||
| TEST(math_geom, InteprWeightsFace3DDouble) | |||||
| { | |||||
| float a[3] = {0.0f, 0.0f, 0.0f}, | |||||
| b[3] = {2.0f, 0.0f, 0.0f}, | |||||
| c[3] = {0.0f, 2.0f, 0.0f}, | |||||
| d[3] = {0.0f, 0.0f, 1.0f}, | |||||
| p[3] = {1.0f, 1.0f, 0.0f}, | |||||
| weights[4] = {0.0f, 0.0f, 0.0f}; | |||||
| interp_weights_face_v3(weights,a,b,c,d,p); | |||||
| EXPECT_NEAR(weights[0],0.0f, 0.000001f); | |||||
| EXPECT_NEAR(weights[1],0.5f, 0.000001f); | |||||
| EXPECT_NEAR(weights[2],0.5f, 0.000001f); | |||||
| EXPECT_NEAR(weights[3],0.0f, 0.000001f); | |||||
| } | |||||
| TEST(math_geom, InteprWeightsPoly2DSingle) | |||||
| { | |||||
| float v[][2] = {{0.0f, 0.0f}, | |||||
| {1.0f, 0.0f}, | |||||
| {0.0f, 1.0f}}, | |||||
| p[2] = {0.0f, 0.0f}, | |||||
| weights[3] = {0.0f, 0.0f, 0.0f}; | |||||
| interp_weights_poly_v2(weights,v,3,p); | |||||
| EXPECT_NEAR(weights[0],1.0f, 0.000001f); | |||||
| EXPECT_NEAR(weights[1],0.0f, 0.000001f); | |||||
| EXPECT_NEAR(weights[2],0.0f, 0.000001f); | |||||
| } | |||||
| TEST(math_geom, InteprWeightsPoly2DDouble) | |||||
| { | |||||
| float v[][2] = {{2.0f, 0.0f}, | |||||
| {0.0f, 2.0f}}, | |||||
| p[2] = {1.0f, 1.0f}, | |||||
| weights[2] = {0.0f, 0.0f}; | |||||
| interp_weights_poly_v2(weights,v,2,p); | |||||
| EXPECT_NEAR(weights[0],0.5f, 0.000001f); | |||||
| EXPECT_NEAR(weights[1],0.5f, 0.000001f); | |||||
| } | |||||
| TEST(math_geom, InteprWeightsPoly2DTriple) | |||||
| { | |||||
| float v[][2] = {{2.0f, 0.0f}, | |||||
| {0.0f, 2.0f}, | |||||
| {0.0f, 0.0f}}, | |||||
| p[2] = {0.5f, 0.5f}, | |||||
| weights[3] = {0.0f, 0.0f, 0.0f}; | |||||
| interp_weights_poly_v2(weights,v,3,p); | |||||
| EXPECT_NEAR(weights[0],0.25f, 0.000001f); | |||||
| EXPECT_NEAR(weights[1],0.25f, 0.000001f); | |||||
| EXPECT_NEAR(weights[2],0.5f, 0.000001f); | |||||
| } | |||||
| TEST(math_geom, InteprWeightsPoly2DVariousPolySomePoints) | |||||
| { | |||||
| float v[][2] = {{2.0f, 5.0f}, | |||||
| {3.3f, 1.2f}, | |||||
| {2.1f, 8.9f}, | |||||
| {3.6f, 5.4f}, | |||||
| {0.7f, 9.3f}}, | |||||
| point[][2] = {{7.3f, 1.5f}, | |||||
| {5.6f, 2.9f}, | |||||
| {-0.5f, -3.3f}, | |||||
| {11.5f, -0.5f}, | |||||
| {2.3f, -9.5f}}, | |||||
| weights[5] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f}; | |||||
| interp_weights_poly_v2(weights,v,5,point[0]); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 0), point[0][0], 0.001f); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 1), point[0][1], 0.001f); | |||||
| interp_weights_poly_v2(weights,v,5,point[1]); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 0), point[1][0], 0.001f); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 1), point[1][1], 0.001f); | |||||
| interp_weights_poly_v2(weights,v,5,point[2]); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 0), point[2][0], 0.001f); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 1), point[2][1], 0.001f); | |||||
| interp_weights_poly_v2(weights,v,5,point[3]); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 0), point[3][0], 0.001f); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 1), point[3][1], 0.001f); | |||||
| interp_weights_poly_v2(weights,v,5,point[4]); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 0), point[4][0], 0.01f); /* that's sad */ | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 1), point[4][1], 0.01f); | |||||
| } | |||||
| TEST(math_geom, InteprWeightsPoly3DSimple) | |||||
| { | |||||
| float v[][3] = {{0.0f, 0.0f, 0.0f}, | |||||
| {0.0f, 0.0f, 0.1f}, | |||||
| {0.1f, 0.0f, 0.0f}, | |||||
| {0.0f, 0.1f, 0.0f}}, | |||||
| p[3] = {0.0f, 0.0f, 0.0f}, | |||||
| weights[4] = {0.0f, 0.0f, 0.0f}; | |||||
| interp_weights_poly_v3(weights,v,4,p); | |||||
| EXPECT_NEAR(weights[0],1.0f, 0.000001f); | |||||
| EXPECT_NEAR(weights[1],0.0f, 0.000001f); | |||||
| EXPECT_NEAR(weights[2],0.0f, 0.000001f); | |||||
| EXPECT_NEAR(weights[3],0.0f, 0.000001f); | |||||
| } | |||||
| TEST(math_geom, InteprWeightsPoly3DDouble) | |||||
| { | |||||
| float v[][3] = {{2.0f, 0.0f, 0.0f}, | |||||
| {0.0f, 2.0f, 0.0f}}, | |||||
| p[3] = {1.0f, 1.0f, 0.0f}, | |||||
| weights[2] = {0.0f, 0.0f}; | |||||
| interp_weights_poly_v3(weights,v,3,p); | |||||
| EXPECT_NEAR(weights[0],0.5f, 0.000001f); | |||||
| EXPECT_NEAR(weights[1],0.5f, 0.000001f); | |||||
| } | |||||
| TEST(math_geom, InteprWeightsPoly3DTriple) | |||||
| { | |||||
| float v[][3] = {{3.0f, 0.0f, 0.0f}, | |||||
| {0.0f, 3.0f, 0.0f}, | |||||
| {0.0f, 0.0f, 3.0f}}, | |||||
| p[3] = {1.0f, 1.0f, 1.0f}, | |||||
| weights[3] = {0.0f, 0.0f, 0.0f}; | |||||
| interp_weights_poly_v3(weights,v,3,p); | |||||
| EXPECT_NEAR(weights[0],0.333333f, 0.000001f); | |||||
| EXPECT_NEAR(weights[1],0.333333f, 0.000001f); | |||||
| EXPECT_NEAR(weights[2],0.333333f, 0.000001f); | |||||
| } | |||||
| TEST(math_geom, InteprWeightsPoly3DQuadrupleReal3D) | |||||
| { | |||||
| float v[][3] = {{3.0f, 0.0f, 0.0f}, | |||||
| {0.0f, 3.0f, 0.0f}, | |||||
| {0.0f, 0.0f, 3.0f}, | |||||
| {0.0f, 0.0f, 0.0f}}, | |||||
| p[3] = {0.6f, 0.6f, 0.6f}, | |||||
| weights[4] = {0.0f, 0.0f, 0.0f, 0.0f}; | |||||
| interp_weights_poly_v3(weights,v,4,p); | |||||
| EXPECT_NEAR(weights[0]*v[0][0] + weights[1]*v[1][0] + weights[2]*v[2][0] + weights[3]*v[3][0],p[0], 0.04f); | |||||
| EXPECT_NEAR(weights[0]*v[0][1] + weights[1]*v[1][1] + weights[2]*v[2][1] + weights[3]*v[3][1],p[1], 0.04f); | |||||
| EXPECT_NEAR(weights[0]*v[0][2] + weights[1]*v[1][2] + weights[2]*v[2][2] + weights[3]*v[3][2],p[2], 0.04f); | |||||
| EXPECT_NEAR(weights[0],0.2f, 0.031f); | |||||
| EXPECT_NEAR(weights[1],0.2f, 0.031f); | |||||
| EXPECT_NEAR(weights[2],0.2f, 0.031f); | |||||
| EXPECT_NEAR(weights[3],0.4f, 0.031f); | |||||
| } | |||||
| #if 0 | |||||
| TEST(math_geom, InterpWeightsPoly3DVariousFlatHiPrecision) | |||||
| { | |||||
| float v[5][3] = {{5.2f, 3.1f, 4.2f}, | |||||
| {5.2f*0.45f + 4.7f*0.45f + 2.5f*0.1f, 3.1f*0.45f - 1.9f*0.45f + 7.9f*0.1f, 4.2f*0.45f + 3.3f*0.45f - 0.1f*0.1f}, | |||||
| {4.7f, -1.9f, 3.3f}, | |||||
| {5.2f*0.1f + 4.7f*0.45f + 2.5f*0.45f, 3.1f*0.1f - 1.9f*0.45f + 7.9f*0.45f, 4.2f*0.1f + 3.3f*0.45f - 0.1f*0.45f}, | |||||
| {2.5f, 7.9f, -8.1f}}, | |||||
| points[5][3] = {WEIGHTED_POINT(v[0], v[2], v[4], 0.4f, 0.2f, 0.4f), | |||||
| WEIGHTED_POINT(v[0], v[2], v[4], 0.3f, 0.4f, 0.3f), | |||||
| WEIGHTED_POINT(v[0], v[2], v[4], 0.2f, 0.7f, 0.1f), | |||||
| WEIGHTED_POINT(v[0], v[2], v[4], -0.3f, 0.8f, 0.5f), | |||||
| WEIGHTED_POINT(v[0], v[2], v[4], 0.2f, 0.8f, 0.0f)}, | |||||
| weights[5]; | |||||
| interp_weights_poly_v3(weights,v,5,points[0]); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 0), points[0][0], 0.0001f); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 1), points[0][1], 0.0001f); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 2), points[0][2], 0.0001f); | |||||
| interp_weights_poly_v3(weights,v,5,points[1]); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 0), points[1][0], 0.0001f); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 1), points[1][1], 0.0001f); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 2), points[1][2], 0.0001f); | |||||
| interp_weights_poly_v3(weights,v,5,points[2]); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 0), points[2][0], 0.0001f); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 1), points[2][1], 0.0001f); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 2), points[2][2], 0.0001f); | |||||
| interp_weights_poly_v3(weights,v,5,points[3]); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 0), points[3][0], 0.0001f); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 1), points[3][1], 0.0001f); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 2), points[3][2], 0.0001f); | |||||
| interp_weights_poly_v3(weights,v,5,points[4]); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 0), points[4][0], 0.0001f); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 1), points[4][1], 0.0001f); | |||||
| EXPECT_NEAR(COLUMN_PRODUCT_5(weights, v, 2), points[4][2], 0.0001f); | |||||
| } | |||||
| #endif | |||||
| TEST(math_geom, IsPolyConvex2DSimple) | |||||
| { | |||||
| float points[][2] = {{1.0f, 1.0f}, | |||||
| {2.0f, 2.0f}, | |||||
| {1.0f, 3.0f}}; | |||||
| int quantity = 3; | |||||
| EXPECT_TRUE(is_poly_convex_v2(points, quantity)); | |||||
| } | |||||
| TEST(math_geom, IsPolyConvex2DNonconvexSimple) | |||||
| { | |||||
| float points[][2] = {{1.0f, 1.0f}, | |||||
| {2.0f, 2.0f}, | |||||
| {1.0f, 3.0f}, | |||||
| {1.5f, 2.0f}}; | |||||
| int quantity = 4; | |||||
| EXPECT_FALSE(is_poly_convex_v2(points, quantity)); | |||||
| } | |||||
| TEST(math_geom, IsPolyConvex2DOctagonConvex) | |||||
| { | |||||
| float points[][2] = {{-1.0f, -1.0f}, | |||||
| {0.0f, -1.0001f}, | |||||
| {1.0f, -1.0f}, | |||||
| {1.00001f, 0.0f}, | |||||
| {1.0f, 1.0f}, | |||||
| {0.0f, 1.00002f}, | |||||
| {-1.0f, 1.0f}, | |||||
| {-1.00001f, 0.0f}}; | |||||
| int quantity = 8; | |||||
| EXPECT_TRUE(is_poly_convex_v2(points, quantity)); | |||||
| } | |||||
| TEST(math_geom, IsPolyConvex2DOctagonNonconvex) | |||||
| { | |||||
| float points[][2] = {{-1.0f, -1.0f}, | |||||
| {0.0f, -0.99999f}, | |||||
| {1.0f, -1.0f}, | |||||
| {1.00001f, 0.0f}, | |||||
| {1.0f, 1.0f}, | |||||
| {0.0f, 1.00002f}, | |||||
| {-1.0f, 1.0f}, | |||||
| {-1.00001f, 0.0f}}; | |||||
| int quantity = 8; | |||||
| EXPECT_FALSE(is_poly_convex_v2(points, quantity)); | |||||
| } | |||||
| TEST(math_geom, AreaPoly2DSimplest) | |||||
| { | |||||
| float v[][2] = {{0.0f, 0.0f}, | |||||
| {1.0f, 0.0f}, | |||||
| {1.0f, 1.0f}, | |||||
| {0.0f, 1.0f}}; | |||||
| EXPECT_NEAR(area_poly_v2(v, 4), 1.0f, 0.00001f); | |||||
| } | |||||
| TEST(math_geom, AreaPoly2DSimplestReversed) | |||||
| { | |||||
| float v[][2] = {{0.0f, 0.0f}, | |||||
| {1.0f, 0.0f}, | |||||
| {1.0f, 1.0f}, | |||||
| {0.0f, 1.0f}}; | |||||
| EXPECT_NEAR(area_poly_v2(v, 4), 1.0f, 0.00001f); | |||||
| } | |||||
| TEST(math_geom, AreaPoly2DTriangles) | |||||
| { | |||||
| for(float pos = -7.34f; pos < 10.0f; pos += 3.12f) { | |||||
| float v[][2] = {{0.0f, 0.0f}, | |||||
| {1.0f, 0.0f}, | |||||
| {pos, 2.0f}}; | |||||
| EXPECT_NEAR(area_poly_v2(v, 3), 1.0f, 0.00001f); | |||||
| } | |||||
| } | |||||
| TEST(math_geom, AreaPoly2DOctagon) | |||||
| { | |||||
| float v[][2] = {{0.0f, 0.0f}, | |||||
| {3.0f, -1.0f}, | |||||
| {4.0f, 2.0f}, | |||||
| {2.0f, 1.0f}, | |||||
| {2.0f, 4.0f}, | |||||
| {4.0f, 4.0f}, | |||||
| {3.0f, 6.0f}, | |||||
| {-2.0f, 5.0f}}; | |||||
| EXPECT_NEAR(area_poly_v2(v, 8), 23.5f, 0.00001f); | |||||
| } | |||||
| TEST(math_geom, AreaPoly2DStar) | |||||
| { | |||||
| float v[][2] = {{1.0f, 1.0f}, | |||||
| {0.0f, 4.0f}, | |||||
| {-1.0f, 1.0f}, | |||||
| {-4.0f, 0.0f}, | |||||
| {-1.0f, -1.0f}, | |||||
| {0.0f, -4.0f}, | |||||
| {1.0f, -1.0f}, | |||||
| {4.0f, 0.0f}}; | |||||
| EXPECT_NEAR(area_poly_v2(v, 8), 16.0f, 0.00001f); | |||||
| } | |||||
| TEST(math_geom, NormalPoly3DSimplest) | |||||
| { | |||||
| float v[][3] = {{1.0f, 1.0f, 0.0f}, | |||||
| {-1.0f, 1.0f, 0.0f}, | |||||
| {-1.0f, -1.0f, 0.0f}, | |||||
| {1.0f, -1.0f, 0.0f}}, | |||||
| result[3]; | |||||
| normal_poly_v3(result, v, 4); | |||||
| EXPECT_NEAR(result[0], 0.0f, 0.00001f); | |||||
| EXPECT_NEAR(result[1], 0.0f, 0.00001f); | |||||
| EXPECT_NEAR(result[2], 1.0f, 0.00001f); | |||||
| } | |||||
| TEST(math_geom, NormalPoly3DLarger) | |||||
| { | |||||
| float v[][3] = {{2.0f, 2.0f, 0.0f}, | |||||
| {-2.0f, 2.0f, 0.0f}, | |||||
| {-2.0f, -2.0f, 0.0f}, | |||||
| {2.0f, -2.0f, 0.0f}}, | |||||
| result[3]; | |||||
| normal_poly_v3(result, v, 4); | |||||
| EXPECT_NEAR(result[0], 0.0f, 0.00001f); | |||||
| EXPECT_NEAR(result[1], 0.0f, 0.00001f); | |||||
| EXPECT_NEAR(result[2], 1.0f, 0.00001f); | |||||
| } | |||||
| TEST(math_geom, NormalPoly3DLargerMoved) | |||||
| { | |||||
| float v[][3] = {{4.0f, 4.0f, 0.0f}, | |||||
| {0.0f, 4.0f, 0.0f}, | |||||
| {0.0f, 0.0f, 0.0f}, | |||||
| {4.0f, 0.0f, 0.0f}}, | |||||
| result[3]; | |||||
| normal_poly_v3(result, v, 4); | |||||
| EXPECT_NEAR(result[0], 0.0f, 0.00001f); | |||||
| EXPECT_NEAR(result[1], 0.0f, 0.00001f); | |||||
| EXPECT_NEAR(result[2], 1.0f, 0.00001f); | |||||
| } | |||||
| TEST(math_geom, NormalPoly3DLargerMovedReversed) | |||||
| { | |||||
| float v[][3] = {{4.0f, 0.0f, 0.0f}, | |||||
| {0.0f, 0.0f, 0.0f}, | |||||
| {0.0f, 4.0f, 0.0f}, | |||||
| {4.0f, 4.0f, 0.0f}}, | |||||
| result[3]; | |||||
| normal_poly_v3(result, v, 4); | |||||
| EXPECT_NEAR(result[0], 0.0f, 0.00001f); | |||||
| EXPECT_NEAR(result[1], 0.0f, 0.00001f); | |||||
| EXPECT_NEAR(result[2], -1.0f, 0.00001f); | |||||
| } | |||||
| TEST(math_geom, NormalPoly3DTriangle) | |||||
| { | |||||
| float v[][3] = {{1.0f, 0.0f, 0.0f}, | |||||
| {0.0f, 1.0f, 0.0f}, | |||||
| {0.0f, 0.0f, 1.0f}}, | |||||
| result[3]; | |||||
| normal_poly_v3(result, v, 3); | |||||
| EXPECT_NEAR(result[0]*result[0], 0.333333f, 0.00001f); | |||||
| EXPECT_NEAR(result[1]*result[1], 0.333333f, 0.00001f); | |||||
| EXPECT_NEAR(result[2]*result[2], 0.333333f, 0.00001f); | |||||
| } | |||||
| TEST(math_geom, NormalPoly3DVarious) | |||||
| { | |||||
| float point[3] = {7.0f, 5.0f, 9.0f}; | |||||
| float sum = point[0] + point[1] + point[2]; | |||||
| point[0] = sqrt(point[0]/sum); | |||||
| point[1] = sqrt(point[1]/sum); | |||||
| point[2] = sqrt(point[2]/sum); | |||||
| float v[][3] = {{4.5f, 2.8f, -(4.5f*(point[0]/point[2]) + 2.8f*(point[1]/point[2]) + 1.0f)}, | |||||
| {3.1f, 6.4f, -(3.1f*(point[0]/point[2]) + 6.4f*(point[1]/point[2]) + 1.0f)}, | |||||
| {2.4f, 7.1f, -(2.4f*(point[0]/point[2]) + 7.1f*(point[1]/point[2]) + 1.0f)}, | |||||
| {1.9f, 6.3f, -(1.9f*(point[0]/point[2]) + 6.3f*(point[1]/point[2]) + 1.0f)}}, | |||||
| result[3]; | |||||
| normal_poly_v3(result, v, 4); | |||||
| EXPECT_NEAR(point[0], result[0], 0.00001f); | |||||
| EXPECT_NEAR(point[1], result[1], 0.00001f); | |||||
| EXPECT_NEAR(point[2], result[2], 0.00001f); | |||||
| } | |||||
| TEST(math_geom, NormalPoly3DVariousReversed) | |||||
| { | |||||
| float point[3] = {7.0f, 5.0f, 9.0f}; | |||||
| float sum = point[0] + point[1] + point[2]; | |||||
| point[0] = sqrt(point[0]/sum); | |||||
| point[1] = sqrt(point[1]/sum); | |||||
| point[2] = sqrt(point[2]/sum); | |||||
| float v[][3] = {{1.9f, 6.3f, -(1.9f*(point[0]/point[2]) + 6.3f*(point[1]/point[2]) + 1.0f)}, | |||||
| {2.4f, 7.1f, -(2.4f*(point[0]/point[2]) + 7.1f*(point[1]/point[2]) + 1.0f)}, | |||||
| {3.1f, 6.4f, -(3.1f*(point[0]/point[2]) + 6.4f*(point[1]/point[2]) + 1.0f)}, | |||||
| {4.5f, 2.8f, -(4.5f*(point[0]/point[2]) + 2.8f*(point[1]/point[2]) + 1.0f)}}, | |||||
| result[3]; | |||||
| normal_poly_v3(result, v, 4); | |||||
| EXPECT_NEAR(-point[0], result[0], 0.00001f); | |||||
| EXPECT_NEAR(-point[1], result[1], 0.00001f); | |||||
| EXPECT_NEAR(-point[2], result[2], 0.00001f); | |||||
| } | |||||
| TEST(math_geom, CrossPoly2DSimplest) | |||||
| { | |||||
| float v[][2] = {{0.0f, 1.0f}, | |||||
| {1.0f, 1.0f}, | |||||
| {1.0f, 0.0f}, | |||||
| {0.0f, 0.0f}}; | |||||
| EXPECT_NEAR(cross_poly_v2(v, 4), 2.0f, 0.00001f); | |||||
| } | |||||
| TEST(math_geom, CrossPoly2DSimplestReversed) | |||||
| { | |||||
| float v[][2] = {{0.0f, 0.0f}, | |||||
| {1.0f, 0.0f}, | |||||
| {1.0f, 1.0f}, | |||||
| {0.0f, 1.0f}}; | |||||
| EXPECT_NEAR(cross_poly_v2(v, 4), -2.0f, 0.00001f); | |||||
| } | |||||
| TEST(math_geom, CrossPoly2DTriangles) | |||||
| { | |||||
| for(float pos = -7.34f; pos < 10.0f; pos += 3.12f) { | |||||
| float v[][2] = {{pos, 2.0f}, | |||||
| {1.0f, 0.0f}, | |||||
| {0.0f, 0.0f}}; | |||||
| EXPECT_NEAR(cross_poly_v2(v, 3), 2.0f, 0.00001f); | |||||
| } | |||||
| } | |||||
| TEST(math_geom, CrossPoly2DOctagon) | |||||
| { | |||||
| float v[][2] = {{-2.0f, 5.0f}, | |||||
| {3.0f, 6.0f}, | |||||
| {4.0f, 4.0f}, | |||||
| {2.0f, 4.0f}, | |||||
| {2.0f, 1.0f}, | |||||
| {4.0f, 2.0f}, | |||||
| {3.0f, -1.0f}, | |||||
| {0.0f, 0.0f}}; | |||||
| EXPECT_NEAR(cross_poly_v2(v, 8), 47.0f, 0.00001f); | |||||
| } | |||||
| TEST(math_geom, CrossPoly2DStar) | |||||
| { | |||||
| float v[][2] = {{4.0f, 0.0f}, | |||||
| {1.0f, -1.0f}, | |||||
| {0.0f, -4.0f}, | |||||
| {-1.0f, -1.0f}, | |||||
| {-4.0f, 0.0f}, | |||||
| {-1.0f, 1.0f}, | |||||
| {0.0f, 4.0f}, | |||||
| {1.0f, 1.0f}}; | |||||
| EXPECT_NEAR(cross_poly_v2(v, 8), 32.0f, 0.00001f); | |||||
| } | |||||
| Context not available. | |||||