|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifndef TCG_POLYLINE_OPS
|
|
Toshihiro Shimizu |
890ddd |
#define TCG_POLYLINE_OPS
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// tcg includes
|
|
Toshihiro Shimizu |
890ddd |
#include "traits.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "containers_reader.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "point.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "point_ops.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
namespace tcg
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
namespace polyline_ops
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Polyline Basic Operations
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*!
|
|
Toshihiro Shimizu |
890ddd |
Computes the length of the polyline between the specified point iterators.
|
|
Toshihiro Shimizu |
890ddd |
\return The input polyline's length
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename forit=""></typename>
|
|
Toshihiro Shimizu |
890ddd |
double length(ForIt begin, ForIt end)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
typedef typename std::iterator_traits<forit>::value_type point_type;</forit>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
double result = 0.0;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
for (ForIt jt = begin, it = ++jt; jt != end; it = jt, ++jt)
|
|
Toshihiro Shimizu |
890ddd |
result += tcg::point_ops::dist(*it, *jt);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
return result;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*!
|
|
Toshihiro Shimizu |
890ddd |
Computes the area enclosed by the input polyline's \a closure.
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
\note The input polyline is implicitly \a connected at the endpoints
|
|
Toshihiro Shimizu |
890ddd |
with a straight segment. This has obviously makes no difference
|
|
Toshihiro Shimizu |
890ddd |
if the supplied polyline already had coincident endpoints.
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
\return The area enclosed by the polyline's \a closure.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename forit=""></typename>
|
|
Toshihiro Shimizu |
890ddd |
double area(ForIt begin, ForIt end)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
typedef typename std::iterator_traits<forit>::value_type point_type;</forit>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
double result = 0.0;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (begin != end) {
|
|
Toshihiro Shimizu |
890ddd |
ForIt jt = begin, it = jt++;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
for (; jt != end; it = jt++)
|
|
Toshihiro Shimizu |
890ddd |
result += 0.5 *
|
|
Toshihiro Shimizu |
890ddd |
(tcg::point_traits<point_type>::y(*jt) + tcg::point_traits<point_type>::y(*it)) *</point_type></point_type>
|
|
Toshihiro Shimizu |
890ddd |
(tcg::point_traits<point_type>::x(*jt) - tcg::point_traits<point_type>::x(*it));</point_type></point_type>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
result += 0.5 *
|
|
Toshihiro Shimizu |
890ddd |
(tcg::point_traits<point_type>::y(*begin) + tcg::point_traits<point_type>::y(*it)) *</point_type></point_type>
|
|
Toshihiro Shimizu |
890ddd |
(tcg::point_traits<point_type>::x(*begin) - tcg::point_traits<point_type>::x(*it));</point_type></point_type>
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
return result;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Quadratic Conversions
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*!
|
|
Toshihiro Shimizu |
890ddd |
Standard direct conversion function used in polyline-to-quadratics conversion.
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
Point a has already been inserted in the output; this function must add the
|
|
Toshihiro Shimizu |
890ddd |
remaining part of a sequence of quadratics approximating the triplet (a, *bt, c).
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//Note: typename iter_type::value_type == point_type
|
|
Toshihiro Shimizu |
890ddd |
template <typename iter_type="" point_type,="" typename=""></typename>
|
|
Toshihiro Shimizu |
890ddd |
void tripletToQuadratics(const point_type &a, const iter_type &bt, const point_type &c,
|
|
Toshihiro Shimizu |
890ddd |
tcg::sequential_reader<std::vector<point_type>> &output)</std::vector<point_type>
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
//Direct conversion
|
|
Toshihiro Shimizu |
890ddd |
output.addElement(*bt);
|
|
Toshihiro Shimizu |
890ddd |
output.addElement(c);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*!
|
|
Toshihiro Shimizu |
890ddd |
Performs a conversion of the specified polyline into a sequence of quadratics, then
|
|
Toshihiro Shimizu |
890ddd |
applies a quadratics sub-sequence optimal merging algorithm.
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
A user-made local triplet-to-quadratics conversion can be supplied to recognize corners
|
|
Toshihiro Shimizu |
890ddd |
or supply a tight starting approximation.
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
\warning Passed polylines with equal endpoints are interpreted as closed (circular) polylines;
|
|
Toshihiro Shimizu |
890ddd |
in this case, the resulting endpoints of the quadratic sequence will be displaced to
|
|
Toshihiro Shimizu |
890ddd |
the first segment mid-point.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename containers_reader,="" iter_type,="" toquadsfunc="" typename=""></typename>
|
|
Toshihiro Shimizu |
890ddd |
void toQuadratics(iter_type begin, iter_type end, containers_reader &output,
|
|
Toshihiro Shimizu |
890ddd |
toQuadsFunc &toQuads = &tripletToQuadratics<
|
|
Toshihiro Shimizu |
890ddd |
typename iter_type::value_type, iter_type>,
|
|
Toshihiro Shimizu |
890ddd |
double mergeTol = 1.0);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Standard Polyline Evaluators
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*!
|
|
Toshihiro Shimizu |
890ddd |
Calculates the (weighted) standard deviation of a polyline's sub-paths with respect
|
|
Toshihiro Shimizu |
890ddd |
to the segment connecting the endpoints.
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
\warning For efficiency reasons, the returned value is the actual standard
|
|
Toshihiro Shimizu |
890ddd |
deviation, times the endpoints-segment length.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename ranit=""></typename>
|
|
Toshihiro Shimizu |
890ddd |
class StandardDeviationEvaluator
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Toshihiro Shimizu |
890ddd |
typedef RanIt iterator_type;
|
|
Toshihiro Shimizu |
890ddd |
typedef typename std::iterator_traits<ranit>::difference_type diff_type;</ranit>
|
|
Toshihiro Shimizu |
890ddd |
typedef typename std::iterator_traits<ranit>::value_type point_type;</ranit>
|
|
Toshihiro Shimizu |
890ddd |
typedef typename tcg::point_traits<point_type>::value_type value_type;</point_type>
|
|
Toshihiro Shimizu |
890ddd |
typedef double penalty_type;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Toshihiro Shimizu |
890ddd |
iterator_type m_begin, m_end;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
std::vector<double> m_sums_x, m_sums_y; //!< Sums of the points coordinates</double>
|
|
Toshihiro Shimizu |
890ddd |
std::vector<double> m_sums2_x, m_sums2_y; //!< Sums of the points coordinates' squares</double>
|
|
Toshihiro Shimizu |
890ddd |
std::vector<double> m_sums_xy; //!< Sums of the coordinates products</double>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Toshihiro Shimizu |
890ddd |
StandardDeviationEvaluator(const iterator_type &begin, const iterator_type &end);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
penalty_type penalty(const iterator_type &a, const iterator_type &b);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
const iterator_type &begin() const { return m_begin; }
|
|
Toshihiro Shimizu |
890ddd |
const iterator_type &end() const { return m_end; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
const std::vector<double> &sums_x() const { return m_sums_x; }</double>
|
|
Toshihiro Shimizu |
890ddd |
const std::vector<double> &sums_y() const { return m_sums_y; }</double>
|
|
Toshihiro Shimizu |
890ddd |
const std::vector<double> &sums2_x() const { return m_sums2_x; }</double>
|
|
Toshihiro Shimizu |
890ddd |
const std::vector<double> &sums2_y() const { return m_sums2_y; }</double>
|
|
Toshihiro Shimizu |
890ddd |
const std::vector<double> &sums_xy() const { return m_sums_xy; }</double>
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
} //namespace tcg::polyline_ops
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifdef INCLUDE_HPP
|
|
Toshihiro Shimizu |
890ddd |
#include "hpp/polyline_ops.hpp"
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#endif //TCG_POLYLINE_OPS
|