bezier: add region query
This commit is contained in:
parent
e5b85b559b
commit
3d53ee5eb1
30
bezier.cpp
30
bezier.cpp
@ -359,6 +359,36 @@ namespace util {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
template <size_t S>
|
||||||
|
util::region2f
|
||||||
|
util::bezier<S>::region (void) const
|
||||||
|
{
|
||||||
|
util::region2f r;
|
||||||
|
|
||||||
|
float x0 = m_points[0].x;
|
||||||
|
float y0 = m_points[0].y;
|
||||||
|
|
||||||
|
float x1 = x0;
|
||||||
|
float y1 = y0;
|
||||||
|
|
||||||
|
for (size_t i = 1; i < S+1; ++i) {
|
||||||
|
x0 = min (x0, m_points[i].x);
|
||||||
|
y0 = min (y0, m_points[i].y);
|
||||||
|
|
||||||
|
x1 = max (x1, m_points[i].x);
|
||||||
|
y1 = max (y1, m_points[i].y);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
x0,
|
||||||
|
y0,
|
||||||
|
x1 - x0,
|
||||||
|
y1 - y0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
template <size_t S>
|
template <size_t S>
|
||||||
util::point2f&
|
util::point2f&
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#define __UTIL_BEZIER_HPP
|
#define __UTIL_BEZIER_HPP
|
||||||
|
|
||||||
#include "point.hpp"
|
#include "point.hpp"
|
||||||
|
#include "region.hpp"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
@ -40,6 +41,8 @@ namespace util {
|
|||||||
|
|
||||||
float distance (point2f) const;
|
float distance (point2f) const;
|
||||||
|
|
||||||
|
region2f region (void) const;
|
||||||
|
|
||||||
point2f& operator[] (size_t idx);
|
point2f& operator[] (size_t idx);
|
||||||
const point2f& operator[] (size_t idx) const;
|
const point2f& operator[] (size_t idx) const;
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
template <size_t> void test_eval (void);
|
template <size_t> void test_eval (void);
|
||||||
template <size_t> void test_intersect (void);
|
template <size_t> void test_intersect (void);
|
||||||
|
template <size_t> void test_region (void);
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@ -161,6 +162,45 @@ test_intersect<3> (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
template <>
|
||||||
|
void
|
||||||
|
test_region<1> (void)
|
||||||
|
{
|
||||||
|
static const util::bezier<1> upright ({{0.f, 0.f}, {100.f, 100.f}});
|
||||||
|
static const util::bezier<1> downleft ({{100.f, 100.f}, {0.f, 0.f}});
|
||||||
|
static const util::bezier<1> vertical ({{0.f, 0.f}, {0.f, 100.f}});
|
||||||
|
static const util::bezier<1> horizontal ({{0.f, 0.f}, {100.f, 0.f}});
|
||||||
|
|
||||||
|
CHECK_EQ (upright.region (), util::region2f (0.f, 0.f, 100.f, 100.f));
|
||||||
|
CHECK_EQ (downleft.region (), util::region2f (0.f, 0.f, 100.f, 100.f));
|
||||||
|
CHECK_EQ (vertical.region (), util::region2f (0.f, 0.f, 0.f, 100.f));
|
||||||
|
CHECK_EQ (horizontal.region (), util::region2f (0.f, 0.f, 100.f, 0.f));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
template <>
|
||||||
|
void
|
||||||
|
test_region<2> (void)
|
||||||
|
{
|
||||||
|
static const util::bezier<2> upright({{0.f, 0.f}, {50.f, 50.f}, {100.f, 100.f}});
|
||||||
|
|
||||||
|
CHECK_EQ (upright.region (), util::region2f (0.0f, 0.f, 100.f, 100.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
template <>
|
||||||
|
void
|
||||||
|
test_region<3> (void)
|
||||||
|
{
|
||||||
|
static const util::bezier<3> upright({{0.f, 0.f}, {33.f, 33.f}, {67.f, 67.f}, {100.f, 100.f}});
|
||||||
|
|
||||||
|
CHECK_EQ (upright.region (), util::region2f (0.0f, 0.f, 100.f, 100.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
int
|
int
|
||||||
main (int, char**)
|
main (int, char**)
|
||||||
@ -173,5 +213,9 @@ main (int, char**)
|
|||||||
test_intersect<2> ();
|
test_intersect<2> ();
|
||||||
test_intersect<3> ();
|
test_intersect<3> ();
|
||||||
|
|
||||||
|
test_region<1> ();
|
||||||
|
test_region<2> ();
|
||||||
|
test_region<3> ();
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user