16#include "testing/testing.h"
37#define DEFAULT_TEST_ITER 8
40#define DEFAULT_TEST_POLY_NUM 12
42#define DEFAULT_TEST_RANDOM_SEED 123
45#define ROTATION_EPS 1e-6
56 for (
int p_index : points_map) {
57 points_hull[index++] = points[p_index];
66 reinterpret_cast<const float(*)[2]
>(points.data()), points.size(), points_hull_map.
data());
90TEST(convexhull_2d, IsConvex)
103 int i_prev = points_hull.
size() - 2;
104 int i_curr = points_hull.
size() - 1;
105 for (
int i_next = 0; i_next < points_hull.
size(); i_prev = i_curr, i_curr = i_next++) {
106 EXPECT_GE(
cross_tri_v2(points_hull[i_prev], points_hull[i_curr], points_hull[i_next]), 0.0f);
116 for (
float2 &p : points) {
144TEST(convexhull_2d, Lines_AxisAligned)
147 for (
int sign_x = -1; sign_x <= 2; sign_x += 2) {
155 for (
int sign_x = -1; sign_x <= 2; sign_x += 2) {
164 for (
int sign_y = -1; sign_y <= 2; sign_y += 2) {
172 for (
int sign_y = -1; sign_y <= 2; sign_y += 2) {
185 for (
float2 &p : points) {
199 for (
float2 &p : points) {
210TEST(convexhull_2d, Lines_Diagonal)
213 const float expected[4] = {45, -45, -45, 45};
215 for (
int sign_x = -1; sign_x <= 2; sign_x += 2) {
216 for (
int sign_y = -1; sign_y <= 2; sign_y += 2) {
227 const float expected[4] = {45, -45, -45, 45};
229 for (
int sign_x = -1; sign_x <= 2; sign_x += 2) {
230 for (
int sign_y = -1; sign_y <= 2; sign_y += 2) {
233 {1.0f * sign_x, 1.0f * sign_y},
234 {2.0f * sign_x, 2.0f * sign_y},
278 for (
int i = 0; i < points_num; i++) {
294TEST(convexhull_2d, OctagonAxisAligned)
300 for (
int i = 0; i < points_num; i++) {
328 const int points_num_reserved = 4;
337 for (
int i = points_num_reserved; i < points_num; i++) {
343 for (
int i = 0; i < points_num_reserved; i++) {
344 std::swap(points[i], points[rng.
get_int32(points_num)]);
348 const float2 translation = {
355 for (
float2 &p : points) {
359 p = (((p -
float2(0.5f, 0.5f)) * size) * rot_mat) + translation;
367 constexpr float size_margin = 0.1;
380 for (
const float2 &p : points) {
384 const float2 size_result = tempmax - tempmin;
385 float area_input = size[0] * size[1];
386 float area_result = size_result[0] * size_result[1];
387 EXPECT_LE(area_result, area_input + 1e-6f);
398TEST(convexhull_2d, Circle)
406 for (
int i = 0; i < points_num; i++) {
421TEST(convexhull_2d, Random)
429 for (
int i = 0; i < points_num; i++) {
int BLI_convexhull_2d(const float(*points)[2], int points_num, int r_points[])
float BLI_convexhull_aabb_fit_points_2d(const float(*points)[2], int points_num)
static blender::Array< float2 > convexhull_points_from_map(blender::Span< float2 > points, blender::Span< int > points_map)
static blender::Array< float2 > convexhull_2d_as_array(blender::Span< float2 > points)
#define DEFAULT_TEST_RANDOM_SEED
#define DEFAULT_TEST_POLY_NUM
static float convexhull_2d_aabb_fit_points_2d(blender::Span< float2 > points)
#define DEFAULT_TEST_ITER
TEST(convexhull_2d, IsConvex)
MINLINE float cross_tri_v2(const float v1[2], const float v2[2], const float v3[2])
float cross_poly_v2(const float verts[][2], unsigned int nr)
void sin_cos_from_fraction(int numerator, int denominator, float *r_sin, float *r_cos)
#define INIT_MINMAX2(min, max)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void shuffle(MutableSpan< T > values)
constexpr int64_t size() const
T min(const T &a, const T &b)
void min_max(const T &value, T &min, T &max)
MatT from_rotation(const RotationT &rotation)
VecBase< float, 2 > float2
static AngleRadianBase from_degree(const T °rees)