|
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 |
//-----------------------------------------------------------------------------
|