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