Blender V4.3
BLI_math_geom_test.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#include "testing/testing.h"
6
7#include "BLI_math_geom.h"
9
10using namespace blender;
11
12TEST(math_geom, DistToLine2DSimple)
13{
14 float p[2] = {5.0f, 1.0f}, a[2] = {0.0f, 0.0f}, b[2] = {2.0f, 0.0f};
15 float distance = dist_to_line_v2(p, a, b);
16 EXPECT_NEAR(1.0f, distance, 1e-6);
17}
18
19TEST(math_geom, DistToLineSegment2DSimple)
20{
21 float p[2] = {3.0f, 1.0f}, a[2] = {0.0f, 0.0f}, b[2] = {2.0f, 0.0f};
22 float distance = dist_to_line_segment_v2(p, a, b);
23 EXPECT_NEAR(sqrtf(2.0f), distance, 1e-6);
24}
25
26TEST(math_geom, IsectPointTri2D)
27{
28 float2 tri_cw[3] = {{-2, 1}, {4, 4}, {2, -3}};
29 float2 tri_ccw[3] = {{-2, 1}, {2, -3}, {4, 4}};
30
31 float2 inside1{0, 0};
32 float2 inside2{2, 2};
33 float2 inside3{2, -1};
34 float2 inside4{-1, 1};
35 EXPECT_EQ(-1, isect_point_tri_v2(inside1, tri_cw[0], tri_cw[1], tri_cw[2]));
36 EXPECT_EQ(+1, isect_point_tri_v2(inside1, tri_ccw[0], tri_ccw[1], tri_ccw[2]));
37 EXPECT_EQ(-1, isect_point_tri_v2(inside2, tri_cw[0], tri_cw[1], tri_cw[2]));
38 EXPECT_EQ(+1, isect_point_tri_v2(inside2, tri_ccw[0], tri_ccw[1], tri_ccw[2]));
39 EXPECT_EQ(-1, isect_point_tri_v2(inside3, tri_cw[0], tri_cw[1], tri_cw[2]));
40 EXPECT_EQ(+1, isect_point_tri_v2(inside3, tri_ccw[0], tri_ccw[1], tri_ccw[2]));
41 EXPECT_EQ(-1, isect_point_tri_v2(inside4, tri_cw[0], tri_cw[1], tri_cw[2]));
42 EXPECT_EQ(+1, isect_point_tri_v2(inside4, tri_ccw[0], tri_ccw[1], tri_ccw[2]));
43
44 float2 outside1{2, 4};
45 float2 outside2{-1, -1};
46 float2 outside3{0, 3};
47 float2 outside4{-4, 0};
48 EXPECT_EQ(0, isect_point_tri_v2(outside1, tri_cw[0], tri_cw[1], tri_cw[2]));
49 EXPECT_EQ(0, isect_point_tri_v2(outside1, tri_ccw[0], tri_ccw[1], tri_ccw[2]));
50 EXPECT_EQ(0, isect_point_tri_v2(outside2, tri_cw[0], tri_cw[1], tri_cw[2]));
51 EXPECT_EQ(0, isect_point_tri_v2(outside2, tri_ccw[0], tri_ccw[1], tri_ccw[2]));
52 EXPECT_EQ(0, isect_point_tri_v2(outside3, tri_cw[0], tri_cw[1], tri_cw[2]));
53 EXPECT_EQ(0, isect_point_tri_v2(outside3, tri_ccw[0], tri_ccw[1], tri_ccw[2]));
54 EXPECT_EQ(0, isect_point_tri_v2(outside4, tri_cw[0], tri_cw[1], tri_cw[2]));
55 EXPECT_EQ(0, isect_point_tri_v2(outside4, tri_ccw[0], tri_ccw[1], tri_ccw[2]));
56
57 float2 edge1{0, 2};
58 float2 edge2{1, -2};
59 EXPECT_EQ(-1, isect_point_tri_v2(edge1, tri_cw[0], tri_cw[1], tri_cw[2]));
60 EXPECT_EQ(+1, isect_point_tri_v2(edge1, tri_ccw[0], tri_ccw[1], tri_ccw[2]));
61 EXPECT_EQ(-1, isect_point_tri_v2(edge2, tri_cw[0], tri_cw[1], tri_cw[2]));
62 EXPECT_EQ(+1, isect_point_tri_v2(edge2, tri_ccw[0], tri_ccw[1], tri_ccw[2]));
63
64 float2 corner1{4, 4};
65 float2 corner2{2, -3};
66 EXPECT_EQ(-1, isect_point_tri_v2(corner1, tri_cw[0], tri_cw[1], tri_cw[2]));
67 EXPECT_EQ(+1, isect_point_tri_v2(corner1, tri_ccw[0], tri_ccw[1], tri_ccw[2]));
68 EXPECT_EQ(-1, isect_point_tri_v2(corner2, tri_cw[0], tri_cw[1], tri_cw[2]));
69 EXPECT_EQ(+1, isect_point_tri_v2(corner2, tri_ccw[0], tri_ccw[1], tri_ccw[2]));
70}
71
72TEST(math_geom, IsectPointQuad2D)
73{
74 float2 quad_cw[4] = {{-2, 1}, {4, 4}, {5, 1}, {2, -3}};
75 float2 quad_ccw[4] = {{-2, 1}, {2, -3}, {5, 1}, {4, 4}};
76
77 float2 inside1{0, 0};
78 float2 inside2{2, 2};
79 float2 inside3{3, -1};
80 float2 inside4{-1, 1};
81 EXPECT_EQ(-1, isect_point_quad_v2(inside1, quad_cw[0], quad_cw[1], quad_cw[2], quad_cw[3]));
82 EXPECT_EQ(+1, isect_point_quad_v2(inside1, quad_ccw[0], quad_ccw[1], quad_ccw[2], quad_ccw[3]));
83 EXPECT_EQ(-1, isect_point_quad_v2(inside2, quad_cw[0], quad_cw[1], quad_cw[2], quad_cw[3]));
84 EXPECT_EQ(+1, isect_point_quad_v2(inside2, quad_ccw[0], quad_ccw[1], quad_ccw[2], quad_ccw[3]));
85 EXPECT_EQ(-1, isect_point_quad_v2(inside3, quad_cw[0], quad_cw[1], quad_cw[2], quad_cw[3]));
86 EXPECT_EQ(+1, isect_point_quad_v2(inside3, quad_ccw[0], quad_ccw[1], quad_ccw[2], quad_ccw[3]));
87 EXPECT_EQ(-1, isect_point_quad_v2(inside4, quad_cw[0], quad_cw[1], quad_cw[2], quad_cw[3]));
88 EXPECT_EQ(+1, isect_point_quad_v2(inside4, quad_ccw[0], quad_ccw[1], quad_ccw[2], quad_ccw[3]));
89
90 float2 outside1{2, 4};
91 float2 outside2{-1, -1};
92 float2 outside3{0, 3};
93 float2 outside4{-4, 0};
94 EXPECT_EQ(0, isect_point_quad_v2(outside1, quad_cw[0], quad_cw[1], quad_cw[2], quad_cw[3]));
95 EXPECT_EQ(0, isect_point_quad_v2(outside1, quad_ccw[0], quad_ccw[1], quad_ccw[2], quad_ccw[3]));
96 EXPECT_EQ(0, isect_point_quad_v2(outside2, quad_cw[0], quad_cw[1], quad_cw[2], quad_cw[3]));
97 EXPECT_EQ(0, isect_point_quad_v2(outside2, quad_ccw[0], quad_ccw[1], quad_ccw[2], quad_ccw[3]));
98 EXPECT_EQ(0, isect_point_quad_v2(outside3, quad_cw[0], quad_cw[1], quad_cw[2], quad_cw[3]));
99 EXPECT_EQ(0, isect_point_quad_v2(outside3, quad_ccw[0], quad_ccw[1], quad_ccw[2], quad_ccw[3]));
100 EXPECT_EQ(0, isect_point_quad_v2(outside4, quad_cw[0], quad_cw[1], quad_cw[2], quad_cw[3]));
101 EXPECT_EQ(0, isect_point_quad_v2(outside4, quad_ccw[0], quad_ccw[1], quad_ccw[2], quad_ccw[3]));
102
103 float2 edge1{0, 2};
104 float2 edge2{1, -2};
105 EXPECT_EQ(-1, isect_point_quad_v2(edge1, quad_cw[0], quad_cw[1], quad_cw[2], quad_cw[3]));
106 EXPECT_EQ(+1, isect_point_quad_v2(edge1, quad_ccw[0], quad_ccw[1], quad_ccw[2], quad_ccw[3]));
107 EXPECT_EQ(-1, isect_point_quad_v2(edge2, quad_cw[0], quad_cw[1], quad_cw[2], quad_cw[3]));
108 EXPECT_EQ(+1, isect_point_quad_v2(edge2, quad_ccw[0], quad_ccw[1], quad_ccw[2], quad_ccw[3]));
109
110 float2 corner1{4, 4};
111 float2 corner2{2, -3};
112 EXPECT_EQ(-1, isect_point_quad_v2(corner1, quad_cw[0], quad_cw[1], quad_cw[2], quad_cw[3]));
113 EXPECT_EQ(+1, isect_point_quad_v2(corner1, quad_ccw[0], quad_ccw[1], quad_ccw[2], quad_ccw[3]));
114 EXPECT_EQ(-1, isect_point_quad_v2(corner2, quad_cw[0], quad_cw[1], quad_cw[2], quad_cw[3]));
115 EXPECT_EQ(+1, isect_point_quad_v2(corner2, quad_ccw[0], quad_ccw[1], quad_ccw[2], quad_ccw[3]));
116}
117
118TEST(math_geom, CrossPoly)
119{
120 const float tri_cw_2d[3][2] = {{-1, 0}, {0, 1}, {1, 0}};
121 const float tri_cw_3d[3][3] = {{-1, 0}, {0, 1}, {1, 0}};
122
123 const float tri_ccw_2d[3][2] = {{1, 0}, {0, 1}, {-1, 0}};
124 const float tri_ccw_3d[3][3] = {{1, 0}, {0, 1}, {-1, 0}};
125
126 auto cross_tri_v3_as_float3 = [](const float(*poly)[3]) -> float3 {
127 float n[3];
128 cross_tri_v3(n, UNPACK3(poly));
129 return float3(n[0], n[1], n[2]);
130 };
131
132 auto cross_poly_v3_as_float3 = [](const float(*poly)[3]) -> float3 {
133 float n[3];
134 cross_poly_v3(n, poly, 3);
135 return float3(n[0], n[1], n[2]);
136 };
137
138 /* Clockwise. */
139 EXPECT_EQ(cross_tri_v3_as_float3(tri_cw_3d)[2], -2);
140 EXPECT_EQ(cross_tri_v2(UNPACK3(tri_cw_2d)), -2);
141
142 EXPECT_EQ(cross_poly_v3_as_float3(tri_cw_3d)[2], -2);
143 EXPECT_EQ(cross_poly_v2(tri_cw_2d, 3), -2);
144
145 /* Counter clockwise. */
146 EXPECT_EQ(cross_tri_v3_as_float3(tri_ccw_3d)[2], 2);
147 EXPECT_EQ(cross_tri_v2(UNPACK3(tri_ccw_2d)), 2);
148
149 EXPECT_EQ(cross_poly_v3_as_float3(tri_ccw_3d)[2], 2);
150 EXPECT_EQ(cross_poly_v2(tri_ccw_2d, 3), 2);
151}
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
int isect_point_quad_v2(const float p[2], const float v1[2], const float v2[2], const float v3[2], const float v4[2])
MINLINE float cross_tri_v2(const float v1[2], const float v2[2], const float v3[2])
void cross_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[3])
Definition math_geom.cc:24
void cross_poly_v3(float n[3], const float verts[][3], unsigned int nr)
Definition math_geom.cc:166
float cross_poly_v2(const float verts[][2], unsigned int nr)
Definition math_geom.cc:147
float dist_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2])
Definition math_geom.cc:298
int isect_point_tri_v2(const float pt[2], const float v1[2], const float v2[2], const float v3[2])
float dist_to_line_v2(const float p[2], const float l1[2], const float l2[2])
Definition math_geom.cc:284
TEST(math_geom, DistToLine2DSimple)
#define UNPACK3(a)
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
local_group_size(16, 16) .push_constant(Type b
#define sqrtf(x)
draw_view in_light_buf[] float
static int corner1[12]
static int corner2[12]
VecBase< float, 3 > float3