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