Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
//  tstrokeoutline.h:
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
#ifndef T_STROKE_OUTLINE_H
Toshihiro Shimizu 890ddd
#define T_STROKE_OUTLINE_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tgeometry.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
#ifdef TVECTORIMAGE_EXPORTS
Toshihiro Shimizu 890ddd
#define DVAPI DV_EXPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_EXPORT_VAR
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define DVAPI DV_IMPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_IMPORT_VAR
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
#pragma warning(disable : 4251)
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//forward declaration
Toshihiro Shimizu 890ddd
class TStroke;
Toshihiro Shimizu 890ddd
class TRegion;
Toshihiro Shimizu 890ddd
class TRegionOutline;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  FIXME
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
struct TOutlinePoint {
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
  VEDERE COMMENTI DI TStrokeOutline
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	double x, y; //  coordinate geometriche del punto sull'outline per il valore 't' del parametro
Toshihiro Shimizu 890ddd
	double u, v; //  coordinate di texture del punto (v = "ascissa curvilinea", u = "parametro di ampiezza")
Toshihiro Shimizu 890ddd
	//TPointD tangent;  //  vettore tangente alla centerline (nel punto che ha lo stesso parametro 't' (approssimazione...))
Toshihiro Shimizu 890ddd
	//TPointD normal; //  vettore normale alla centerline (nel punto che ha lo stesso parametro 't' (approssimazione...))
Toshihiro Shimizu 890ddd
	int stepCount; //  contatore incrementale per il campionamento di outline procedurali
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TOutlinePoint(double x_,
Toshihiro Shimizu 890ddd
				  double y_,
Toshihiro Shimizu 890ddd
				  //TPointD tangent_ = TPointD(),
Toshihiro Shimizu 890ddd
				  //TPointD normal_ = TPointD(),
Toshihiro Shimizu 890ddd
				  int stepCount_, // = 0,
Toshihiro Shimizu 890ddd
				  double u_,	  // = 0,
Toshihiro Shimizu 890ddd
				  double v_)	  // = 0)
Toshihiro Shimizu 890ddd
		: x(x_),
Toshihiro Shimizu 890ddd
		  y(y_),
Toshihiro Shimizu 890ddd
		  u(u_),
Toshihiro Shimizu 890ddd
		  v(v_),
Toshihiro Shimizu 890ddd
		  //tangent(tangent_),
Toshihiro Shimizu 890ddd
		  //normal(normal_),
Toshihiro Shimizu 890ddd
		  stepCount(stepCount_)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TOutlinePoint(const TPointD &p,
Toshihiro Shimizu 890ddd
				  //const TPointD &tangent_ = TPointD(),
Toshihiro Shimizu 890ddd
				  //const TPointD &normal = TPointD(),
Toshihiro Shimizu 890ddd
				  int stepCount_,   // = 0,
Toshihiro Shimizu 890ddd
				  const TPointD &t) // = TPointD())
Toshihiro Shimizu 890ddd
		: x(p.x),
Toshihiro Shimizu 890ddd
		  y(p.y),
Toshihiro Shimizu 890ddd
		  u(t.x),
Toshihiro Shimizu 890ddd
		  v(t.y),
Toshihiro Shimizu 890ddd
		  //tangent(tangent_),
Toshihiro Shimizu 890ddd
		  //normal(normal),
Toshihiro Shimizu 890ddd
		  stepCount(stepCount_)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TOutlinePoint(const TPointD &p, int stepCount_)
Toshihiro Shimizu 890ddd
		: x(p.x),
Toshihiro Shimizu 890ddd
		  y(p.y),
Toshihiro Shimizu 890ddd
		  u(0),
Toshihiro Shimizu 890ddd
		  v(0),
Toshihiro Shimizu 890ddd
		  //tangent(tangent_),
Toshihiro Shimizu 890ddd
		  //normal(normal),
Toshihiro Shimizu 890ddd
		  stepCount(stepCount_)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TOutlinePoint(const TPointD &p)
Toshihiro Shimizu 890ddd
		: x(p.x),
Toshihiro Shimizu 890ddd
		  y(p.y),
Toshihiro Shimizu 890ddd
		  u(0),
Toshihiro Shimizu 890ddd
		  v(0),
Toshihiro Shimizu 890ddd
		  stepCount(0)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline TPointD convert(const TOutlinePoint &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TPointD(p.x, p.y);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  FIXME
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
class DVAPI TStrokeOutline
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
  gli elementi (TOutlinePoint) di m_outline rappresentano punti situati alternativamente 
Toshihiro Shimizu 890ddd
  sulle facce pari/dispari dell'outline (pari a destra/dispari a sinistra nel verso di 
Toshihiro Shimizu 890ddd
  disegno della centerline). Il calcolo delle coordinate geometriche TPointD(x, y)
Toshihiro Shimizu 890ddd
  di tali punti e' effettuato utilizzando la rappresentazione parametrica (di parametro 't' 
Toshihiro Shimizu 890ddd
  in [0, 1]) della centerline e delle facce pari/dispari dell'outline: i punti 
Toshihiro Shimizu 890ddd
  p(2k) = (TPointD)m_outline[2k], p(2k + 1) = (TPointD)m_outline[2k + 1] (che si ottengono 
Toshihiro Shimizu 890ddd
  per lo stesso valore di 't' da 2 DIVERSE equazioni per le 2 facce pari/dispari dell'outline) 
Toshihiro Shimizu 890ddd
  sono totalmente scorrelati. In particolare 0.5*(p(2k) + p(2k + 1)) non coincide con il punto 
Toshihiro Shimizu 890ddd
  della centerline che si ottiene per lo stesso valore di 't' (stessa cosa dicasi per 
Toshihiro Shimizu 890ddd
  tangenti/normali sulla centerline rispetto alla media di quelle sull'outline): l'ottima 
Toshihiro Shimizu 890ddd
  approssimazione sperimentale induce pero' a considerarli praticamente uguali nelle stroke 
Toshihiro Shimizu 890ddd
  procedurali (stessa cosa dicasi per tangenti/normali). Si ottengono cosi' le seguenti:
Toshihiro Shimizu 890ddd
  m_outline[2k].tangent == m_outline[2k + 1].tangent
Toshihiro Shimizu 890ddd
  m_outline[2k].normal == m_outline[2k + 1].normal
Toshihiro Shimizu 890ddd
  m_outline[2k].stepCount == m_outline[2k + 1].stepCount
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  I membri di ogni elemento (TOutlinePoint) di m_outline hanno la seguente interpretazione:
Toshihiro Shimizu 890ddd
  TPointD(x, y) rappresenta la posizione geometrica del punto sull'outline;
Toshihiro Shimizu 890ddd
  'u' ("parametro di ampiezza") e 'v' ("ascissa curvilinea") sono significativi solo per 
Toshihiro Shimizu 890ddd
      stroke di tipo TTextureStyle e rappresentano i parametri di texture;
Toshihiro Shimizu 890ddd
  tangent/normal (significativi solo per stroke procedurali) rappresentano i vettori 
Toshihiro Shimizu 890ddd
      tangente/normale alla centerline nel punto (sulla centerline) che ha lo stesso 't' di 
Toshihiro Shimizu 890ddd
      quello considerato di m_outline (approssimazione...);
Toshihiro Shimizu 890ddd
  stepCount (significativo solo per stroke procedurali) indicizza in modo crescente le coppie 
Toshihiro Shimizu 890ddd
      di punti m_outline[2k], m_outline[2k + 1] richieste (IN ECCESSO) dal passo procedurale:
Toshihiro Shimizu 890ddd
      in pratica, nel caso di stroke procedurale, m_outline contiene tutti i punti richiesti dal 
Toshihiro Shimizu 890ddd
      passo (m_lengthStep: contato sulla centerline) di generazione della stroke procedurale 
Toshihiro Shimizu 890ddd
      (per questi TOutlinePoint, stepCount e' crescente sulle coppie: 
Toshihiro Shimizu 890ddd
        1)  m_outline[0].stepCount == m_outline[1].stepCount == 1;
Toshihiro Shimizu 890ddd
        2)  m_outline[2k].stepCount == m_outline[2k + 1].stepCount;
Toshihiro Shimizu 890ddd
        3)  se m_outline[2k + 1] e' un punto richiesto dal passo procedurale (m_lengthStep) e 
Toshihiro Shimizu 890ddd
            m_outline[2k + 2h] e' un il punto successivo richiesto dal passo (m_lengthStep), 
Toshihiro Shimizu 890ddd
            allora
Toshihiro Shimizu 890ddd
          3.1)  m_outline[2k + s].stepCount = 0  (s = 2, ... , 2h - 1);
Toshihiro Shimizu 890ddd
          3.2)  m_outline[2k + 2h].stepCount = m_outline[2k + 1].stepCount + 1;)
Toshihiro Shimizu 890ddd
          3.3)  m_outline[2k + 2h].stepCount = m_outline[2k + 2h + 1].stepCount;
Toshihiro Shimizu 890ddd
       )
Toshihiro Shimizu 890ddd
       ed inoltre tutti quelli che servono per "addolcire" la linearizzazione a tratti 
Toshihiro Shimizu 890ddd
       dell'outline (per questi TOutlinePoint, stepCount e' 0 (facilita i controlli...)) 
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	std::vector<toutlinepoint> m_outline;</toutlinepoint>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TStrokeOutline() {}
Toshihiro Shimizu 890ddd
	~TStrokeOutline() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	std::vector<toutlinepoint> &getArray()</toutlinepoint>
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return m_outline;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TStrokeOutline(const TStrokeOutline &);
Toshihiro Shimizu 890ddd
	TStrokeOutline &operator=(const TStrokeOutline &);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void addOutlinePoint(const TOutlinePoint &);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DVAPI TStrokeOutline getOutline(const TStroke &stroke);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TQuadratic;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DVAPI std::vector<tquadratic> getOutlineWithQuadratic(const TStroke &stroke);</tquadratic>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DVAPI void computeOutlines(const TStroke *stroke, int startQuad, int endQuad, std::vector<tquadratic *=""> &quadArray, double error2);</tquadratic>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace TOutlineUtil
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI OutlineParameter
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	double m_lengthStep; //  max lengthStep (sulla centerline) per la linearizzazione dell'outline
Toshihiro Shimizu 890ddd
	OutlineParameter(double lengthStep = 0)
Toshihiro Shimizu 890ddd
		: m_lengthStep(lengthStep)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//per adesso implementata in tellipticbrush.cpp (per motivi storici)
Toshihiro Shimizu 890ddd
DVAPI void makeOutline(const TStroke &stroke, TStrokeOutline &outline, const OutlineParameter ¶m);
Toshihiro Shimizu 890ddd
DVAPI void makeOutline(const TStroke &path, const TStroke &brush, const TRectD &brushBox,
Toshihiro Shimizu 890ddd
					   TStrokeOutline &outline, const OutlineParameter ¶m);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DVAPI void makeOutline(const TStroke &path, const TRegion &brush, const TRectD &brushBox,
Toshihiro Shimizu 890ddd
					   TRegionOutline &outline);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DVAPI TRectD computeBBox(const TStroke &stroke);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif // T_STROKE_OUTLINE_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
// End Of File
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------