Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//#include "tutil.h"
Toshihiro Shimizu 890ddd
//#include "tgl.h"
Toshihiro Shimizu 890ddd
#include "colorfxutils.h"
Toshihiro Shimizu 890ddd
#include "drawutil.h"
Toshihiro Shimizu 890ddd
#include "tregion.h"
Toshihiro Shimizu 890ddd
#include "tflash.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
RubberDeform::RubberDeform() : m_pPolyOri(0), m_polyLoc()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
RubberDeform::RubberDeform(std::vector<t3dpointd> *pPolyOri, const double rf) : m_pPolyOri(pPolyOri),</t3dpointd>
Toshihiro Shimizu 890ddd
																		   m_polyLoc()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	copyOri2Loc();
Toshihiro Shimizu 890ddd
	TRectD bbox;
Toshihiro Shimizu 890ddd
	getBBox(bbox);
Toshihiro Shimizu 890ddd
	double d = tdistance(TPointD(bbox.x0, bbox.y0), TPointD(bbox.x1, bbox.y1));
Toshihiro Shimizu 890ddd
	d = d / 20;
Toshihiro Shimizu 890ddd
	refinePoly(d);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
RubberDeform::~RubberDeform()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void RubberDeform::deformStep()
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 3bfa54
	std::vector<t3dpointd> tmpv;</t3dpointd>
Shinya Kitaoka 3bfa54
	std::vector<t3dpointd>::iterator itb = m_polyLoc.begin();</t3dpointd>
Shinya Kitaoka 3bfa54
	std::vector<t3dpointd>::iterator ite = m_polyLoc.end();</t3dpointd>
Shinya Kitaoka 3bfa54
	for (std::vector<t3dpointd>::iterator it = itb; it != ite; ++it) {</t3dpointd>
Shinya Kitaoka 3bfa54
		std::vector<t3dpointd>::iterator it1 = it == (ite - 1) ? itb : it + 1;</t3dpointd>
Toshihiro Shimizu 890ddd
		double q = 0.5;
Toshihiro Shimizu 890ddd
		double qq = 1.0 - q;
Toshihiro Shimizu 890ddd
		tmpv.push_back(T3DPointD(qq * it->x + q * it1->x, qq * it->y + q * it1->y, qq * it->z + q * it1->z));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	m_polyLoc = tmpv;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void RubberDeform::deform(const double n)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (n <= 0 || n >= 100)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	double q = (double)n / 100.0;
Toshihiro Shimizu 890ddd
	TRectD bbox;
Toshihiro Shimizu 890ddd
	getBBox(bbox);
Toshihiro Shimizu 890ddd
	double d0 = ((bbox.y1 - bbox.y0) * 0.5 + (bbox.x1 - bbox.x0) * 0.5) * 0.5;
Toshihiro Shimizu 890ddd
	double d = d0;
Toshihiro Shimizu 890ddd
	while ((d / d0) > q) {
Toshihiro Shimizu 890ddd
		deformStep();
Toshihiro Shimizu 890ddd
		getBBox(bbox);
Toshihiro Shimizu 890ddd
		d = ((bbox.y1 - bbox.y0) * 0.5 + (bbox.x1 - bbox.x0) * 0.5) * 0.5;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	copyLoc2Ori();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double RubberDeform::avgLength()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_polyLoc.size() <= 0)
Toshihiro Shimizu 890ddd
		return 0.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double avgD = 0.0;
Shinya Kitaoka 3bfa54
	std::vector<t3dpointd>::iterator itb = m_polyLoc.begin();</t3dpointd>
Shinya Kitaoka 3bfa54
	std::vector<t3dpointd>::iterator ite = m_polyLoc.end();</t3dpointd>
Shinya Kitaoka 3bfa54
	for (std::vector<t3dpointd>::iterator it = itb; it != ite; ++it) {</t3dpointd>
Shinya Kitaoka 3bfa54
		std::vector<t3dpointd>::iterator it1 = it == (ite - 1) ? itb : it + 1;</t3dpointd>
Toshihiro Shimizu 890ddd
		avgD += tdistance(*it, *it1);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return avgD / (double)m_polyLoc.size();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void RubberDeform::getBBox(TRectD &bbox)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_polyLoc.size() <= 0) {
Toshihiro Shimizu 890ddd
		bbox.x0 = bbox.y0 = 0;
Toshihiro Shimizu 890ddd
		bbox.x1 = bbox.y1 = -1;
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	bbox.x0 = bbox.x1 = m_polyLoc[0].x;
Toshihiro Shimizu 890ddd
	bbox.y0 = bbox.y1 = m_polyLoc[0].y;
Toshihiro Shimizu 890ddd
	for (int i = 1; i < (int)m_polyLoc.size(); i++) {
Toshihiro Shimizu 890ddd
		bbox.x0 = tmin(bbox.x0, m_polyLoc[i].x);
Toshihiro Shimizu 890ddd
		bbox.x1 = tmax(bbox.x1, m_polyLoc[i].x);
Toshihiro Shimizu 890ddd
		bbox.y0 = tmin(bbox.y0, m_polyLoc[i].y);
Toshihiro Shimizu 890ddd
		bbox.y1 = tmax(bbox.y1, m_polyLoc[i].y);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void RubberDeform::refinePoly(const double rf)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double refineL = rf <= 0.0 ? avgLength() : rf;
Shinya Kitaoka 3bfa54
	std::vector<t3dpointd> tmpv;</t3dpointd>
Toshihiro Shimizu 890ddd
	int nb = m_polyLoc.size();
Toshihiro Shimizu 890ddd
	for (int j = 0; j < nb; j++) {
Toshihiro Shimizu 890ddd
		T3DPointD a(m_polyLoc[j]);
Toshihiro Shimizu 890ddd
		T3DPointD b(j == (nb - 1) ? m_polyLoc[0] : m_polyLoc[j + 1]);
Toshihiro Shimizu 890ddd
		tmpv.push_back(a);
Toshihiro Shimizu 890ddd
		double d = tdistance(a, b);
Toshihiro Shimizu 890ddd
		if (d > refineL) {
Toshihiro Shimizu 890ddd
			int n = (int)(d / refineL) + 1;
Toshihiro Shimizu 890ddd
			double q = 1.0 / (double)n;
Toshihiro Shimizu 890ddd
			for (int i = 1; i < n; i++) {
Toshihiro Shimizu 890ddd
				double qq = q * (double)i;
Toshihiro Shimizu 890ddd
				double qq1 = 1.0 - qq;
Toshihiro Shimizu 890ddd
				T3DPointD p(T3DPointD(qq1 * a.x + qq * b.x, qq1 * a.y + qq * b.y, qq1 * a.z + qq * b.z));
Toshihiro Shimizu 890ddd
				tmpv.push_back(p);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	m_polyLoc = tmpv;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// ------------------- SFlashUtils -------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SFlashUtils::computeOutline(const TRegion *region,
Toshihiro Shimizu 890ddd
								 TRegionOutline::PointVector &polyline) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!region)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const double pixelSize = 1.0;
Toshihiro Shimizu 890ddd
	polyline.clear();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	std::vector<tpointd> polyline2d;</tpointd>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int edgeSize = region->getEdgeCount();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int i = 0; i < edgeSize; i++) {
Toshihiro Shimizu 890ddd
		TEdge &edge = *region->getEdge(i);
Toshihiro Shimizu 890ddd
		stroke2polyline(polyline2d, *edge.m_s, pixelSize, edge.m_w0, edge.m_w1);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	int pointNumber = polyline2d.size();
Toshihiro Shimizu 890ddd
	polyline.reserve(pointNumber);
Toshihiro Shimizu 890ddd
	for (int j = 0; j < pointNumber; j++) {
Toshihiro Shimizu 890ddd
		polyline.push_back(T3DPointD(polyline2d[j], 0.0));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SFlashUtils::computeRegionOutline()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_r)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int subRegionNumber = m_r->getSubregionCount();
Toshihiro Shimizu 890ddd
	TRegionOutline::PointVector app;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_ro.m_exterior.clear();
Toshihiro Shimizu 890ddd
	computeOutline(m_r, app);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_ro.m_exterior.push_back(app);
Toshihiro Shimizu 890ddd
	m_ro.m_interior.clear();
Toshihiro Shimizu 890ddd
	m_ro.m_interior.reserve(subRegionNumber);
Toshihiro Shimizu 890ddd
	for (int i = 0; i < subRegionNumber; i++) {
Toshihiro Shimizu 890ddd
		app.clear();
Toshihiro Shimizu 890ddd
		computeOutline(m_r->getSubregion(i), app);
Toshihiro Shimizu 890ddd
		m_ro.m_interior.push_back(app);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_ro.m_bbox = m_r->getBBox();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
void SFlashUtils::PointVector2QuadsArray(const std::vector<t3dpointd> &pv,</t3dpointd>
Shinya Kitaoka 3bfa54
										 std::vector<tquadratic *=""> &quadArray,</tquadratic>
Shinya Kitaoka 3bfa54
										 std::vector<tquadratic *=""> &toBeDeleted,</tquadratic>
Toshihiro Shimizu 890ddd
										 const bool isRounded) const
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 3bfa54
	std::vector<t3dpointd>::const_iterator ipv = pv.begin();</t3dpointd>
Shinya Kitaoka 3bfa54
	std::vector<t3dpointd>::const_iterator ipve = pv.end();</t3dpointd>
Toshihiro Shimizu 890ddd
	int nbPv = pv.size();
Toshihiro Shimizu 890ddd
	quadArray.clear();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (isRounded) {
Toshihiro Shimizu 890ddd
		if (nbPv <= 2) {
Toshihiro Shimizu 890ddd
			if (nbPv == 1) {
Toshihiro Shimizu 890ddd
				TPointD p0, p1, p2;
Toshihiro Shimizu 890ddd
				p0 = TPointD(pv[0].x, pv[0].y);
Toshihiro Shimizu 890ddd
				p1 = TPointD(pv[0].x, pv[0].y);
Toshihiro Shimizu 890ddd
				p2 = TPointD(pv[0].x, pv[0].y);
Toshihiro Shimizu 890ddd
				quadArray.push_back(new TQuadratic(p0, p1, p2));
Toshihiro Shimizu 890ddd
				toBeDeleted.push_back(quadArray.back());
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			if (nbPv == 2) {
Toshihiro Shimizu 890ddd
				TPointD p0, p1, p2;
Toshihiro Shimizu 890ddd
				p0 = TPointD(pv[0].x, pv[0].y);
Toshihiro Shimizu 890ddd
				p1 = TPointD((pv[0].x + pv[1].x) / 2, (pv[0].y + pv[1].y) / 2);
Toshihiro Shimizu 890ddd
				p2 = TPointD(pv[1].x, pv[1].y);
Toshihiro Shimizu 890ddd
				quadArray.push_back(new TQuadratic(p0, p1, p2));
Toshihiro Shimizu 890ddd
				toBeDeleted.push_back(quadArray.back());
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (int i = 0; i < (nbPv - 2); i++) {
Toshihiro Shimizu 890ddd
			TPointD p0, p1, p2;
Toshihiro Shimizu 890ddd
			p0 = TPointD((pv[i].x + pv[i + 1].x) / 2, (pv[i].y + pv[i + 1].y) / 2);
Toshihiro Shimizu 890ddd
			p1 = TPointD(pv[i + 1].x, pv[i + 1].y);
Toshihiro Shimizu 890ddd
			p2 = TPointD((pv[i + 1].x + pv[i + 2].x) / 2, (pv[i + 1].y + pv[i + 2].y) / 2);
Toshihiro Shimizu 890ddd
			quadArray.push_back(new TQuadratic(p0, p1, p2));
Toshihiro Shimizu 890ddd
			toBeDeleted.push_back(quadArray.back());
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		TPointD p0, p1, p2;
Toshihiro Shimizu 890ddd
		p0 = TPointD((pv[nbPv - 2].x + pv[nbPv - 1].x) / 2, (pv[nbPv - 2].y + pv[nbPv - 1].y) / 2);
Toshihiro Shimizu 890ddd
		p1 = TPointD(pv[nbPv - 1].x, pv[nbPv - 1].y);
Toshihiro Shimizu 890ddd
		p2 = TPointD((pv[0].x + pv[1].x) / 2, (pv[0].y + pv[1].y) / 2);
Toshihiro Shimizu 890ddd
		quadArray.push_back(new TQuadratic(p0, p1, p2));
Toshihiro Shimizu 890ddd
		toBeDeleted.push_back(quadArray.back());
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		for (int i = 0; i < (nbPv - 1); i++) {
Toshihiro Shimizu 890ddd
			TPointD p0, p1, p2;
Toshihiro Shimizu 890ddd
			p0 = TPointD(pv[i].x, pv[i].y);
Toshihiro Shimizu 890ddd
			p2 = TPointD(pv[i + 1].x, pv[i + 1].y);
Toshihiro Shimizu 890ddd
			p1 = TPointD((p0.x + p2.x) * 0.5, (p0.y + p2.y) * 0.5);
Toshihiro Shimizu 890ddd
			quadArray.push_back(new TQuadratic(p0, p1, p2));
Toshihiro Shimizu 890ddd
			toBeDeleted.push_back(quadArray.back());
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		TPointD p0, p1, p2;
Toshihiro Shimizu 890ddd
		p0 = TPointD(pv[nbPv - 1].x, pv[nbPv - 1].y);
Toshihiro Shimizu 890ddd
		p2 = TPointD(pv[0].x, pv[0].y);
Toshihiro Shimizu 890ddd
		p1 = TPointD((p0.x + p2.x) * 0.5, (p0.y + p2.y) * 0.5);
Toshihiro Shimizu 890ddd
		quadArray.push_back(new TQuadratic(p0, p1, p2));
Toshihiro Shimizu 890ddd
		toBeDeleted.push_back(quadArray.back());
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SFlashUtils::drawRegionOutline(TFlash &flash, const bool isRounded) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_r)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	std::vector<std::vector<tquadratic *="">> quads;</std::vector<tquadratic>
Shinya Kitaoka 3bfa54
	std::vector<tquadratic *=""> toBeDeleted;</tquadratic>
Shinya Kitaoka 3bfa54
	std::vector<tquadratic *=""> quadArray;</tquadratic>
Toshihiro Shimizu 890ddd
	PointVector2QuadsArray(*(m_ro.m_exterior.begin()), quadArray, toBeDeleted, isRounded);
Toshihiro Shimizu 890ddd
	quads.push_back(quadArray);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::const_iterator iinter = m_ro.m_interior.begin();
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::const_iterator iinter_end = m_ro.m_interior.end();
Toshihiro Shimizu 890ddd
	for (; iinter != iinter_end; iinter++) {
Toshihiro Shimizu 890ddd
		PointVector2QuadsArray(*iinter, quadArray, toBeDeleted, isRounded);
Toshihiro Shimizu 890ddd
		quads.push_back(quadArray);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.drawPolygon(quads);
Toshihiro Shimizu 890ddd
	clearPointerContainer(toBeDeleted);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
int SFlashUtils::nbDiffVerts(const std::vector<tpointd> &pv) const</tpointd>
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 3bfa54
	std::vector<tpointd> lpv;</tpointd>
Toshihiro Shimizu 890ddd
	bool isMissing[4] = {true, true, true, true};
Toshihiro Shimizu 890ddd
	if (pv.size() == 0)
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
	lpv.push_back(pv[0]);
Toshihiro Shimizu 890ddd
	isMissing[0] = false;
Toshihiro Shimizu 890ddd
	for (int i = 1; i < (int)pv.size(); i++) {
Toshihiro Shimizu 890ddd
		bool isDiff = true;
Toshihiro Shimizu 890ddd
		for (int j = 0; j < (int)lpv.size() && isDiff; j++)
Toshihiro Shimizu 890ddd
			isDiff = lpv[j] == pv[i] ? false : isDiff;
Toshihiro Shimizu 890ddd
		if (isDiff) {
Toshihiro Shimizu 890ddd
			lpv.push_back(pv[i]);
Toshihiro Shimizu 890ddd
			isMissing[i] = false;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return lpv.size();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
	TPointD p[3];
Toshihiro Shimizu 890ddd
	TPixel32 col[2];
Toshihiro Shimizu 890ddd
//	TPixel32 lc1,lc2;
Toshihiro Shimizu 890ddd
	if ( pv[0]==pv[1] ) {
Toshihiro Shimizu 890ddd
		p[0]=pv[0];
Toshihiro Shimizu 890ddd
		p[1]=pv[2];
Toshihiro Shimizu 890ddd
		p[2]=pv[3];
Toshihiro Shimizu 890ddd
		col[0]=c1;
Toshihiro Shimizu 890ddd
		col[1]=c2;
Toshihiro Shimizu 890ddd
	} else if ( pv[0]==pv[2] ) {
Toshihiro Shimizu 890ddd
		p[0]=pv[3];
Toshihiro Shimizu 890ddd
		p[1]=pv[0];
Toshihiro Shimizu 890ddd
		p[2]=pv[1];
Toshihiro Shimizu 890ddd
		col[0]=c2;
Toshihiro Shimizu 890ddd
		col[1]=c1;
Toshihiro Shimizu 890ddd
	} else if ( pv[0]==pv[3] ) {
Toshihiro Shimizu 890ddd
		p[0]=pv[2];
Toshihiro Shimizu 890ddd
		p[1]=pv[0];
Toshihiro Shimizu 890ddd
		p[2]=pv[1];
Toshihiro Shimizu 890ddd
		col[0]=c2;
Toshihiro Shimizu 890ddd
		col[1]=c1;
Toshihiro Shimizu 890ddd
	} else if ( pv[1]==pv[2] ) {
Toshihiro Shimizu 890ddd
		p[0]=pv[3];
Toshihiro Shimizu 890ddd
		p[1]=pv[0];
Toshihiro Shimizu 890ddd
		p[2]=pv[1];
Toshihiro Shimizu 890ddd
		col[0]=c2;
Toshihiro Shimizu 890ddd
		col[1]=c1;
Toshihiro Shimizu 890ddd
	} else if ( pv[1]==pv[3] ) {
Toshihiro Shimizu 890ddd
		p[0]=pv[2];
Toshihiro Shimizu 890ddd
		p[1]=pv[0];
Toshihiro Shimizu 890ddd
		p[2]=pv[1];
Toshihiro Shimizu 890ddd
		col[0]=c2;
Toshihiro Shimizu 890ddd
		col[1]=c1;
Toshihiro Shimizu 890ddd
	} else if ( pv[2]==pv[3] ) {
Toshihiro Shimizu 890ddd
		p[0]=pv[2];
Toshihiro Shimizu 890ddd
		p[1]=pv[0];
Toshihiro Shimizu 890ddd
		p[2]=pv[1];
Toshihiro Shimizu 890ddd
		col[0]=c2;
Toshihiro Shimizu 890ddd
		col[1]=c1;
Toshihiro Shimizu 890ddd
	} 
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD pt1[4]={pv[0],pv[1],pv[2],pv[3]};	
Toshihiro Shimizu 890ddd
	TPointD pt2[3]={p[0],p[1],p[2]};	
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD uu=p[0]-p[1];
Toshihiro Shimizu 890ddd
	TPointD up=(p[0]+p[1])*0.5;
Toshihiro Shimizu 890ddd
	uu=normalize(uu);
Toshihiro Shimizu 890ddd
	uu=rotate90(uu);
Toshihiro Shimizu 890ddd
	TPointD up1=up+uu;
Toshihiro Shimizu 890ddd
	TPointD up2=up-uu;
Toshihiro Shimizu 890ddd
	double d1=tdistance(up1,p[2]);
Toshihiro Shimizu 890ddd
	double d2=tdistance(up2,p[2]);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	std::vector<tpointd> lpv;</tpointd>
Toshihiro Shimizu 890ddd
	if ( d1>d2 ) {
Toshihiro Shimizu 890ddd
		lpv=pv;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		TPointD sw=p[1];
Toshihiro Shimizu 890ddd
		p[1]=p[2];
Toshihiro Shimizu 890ddd
		p[2]=sw;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double a=tdistance(p[1],p[2]);
Toshihiro Shimizu 890ddd
	double b=tdistance(p[2],p[0]);
Toshihiro Shimizu 890ddd
	double c=tdistance(p[0],p[1]);
Toshihiro Shimizu 890ddd
	double x=(b*b-c*c-a*a)/(-2.0*a);
Toshihiro Shimizu 890ddd
	double m=sqrt(c*c-x*x);
Toshihiro Shimizu 890ddd
	TPointD u=p[2]-p[1];
Toshihiro Shimizu 890ddd
	u=normalize(u);
Toshihiro Shimizu 890ddd
	TPointD q(p[1]+u*x);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    const double flashGrad=16384.0;  // size of gradient square
Toshihiro Shimizu 890ddd
    flash.setGradientFill(true,col[0],col[1]);
Toshihiro Shimizu 890ddd
//	TPointD center=pv[0]*0.75+((p[1]+p[2])*0.5)*0.25;
Toshihiro Shimizu 890ddd
	TPointD center=pv[0];
Toshihiro Shimizu 890ddd
	TPointD e(p[2]-p[1]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double angle=rad2degree(atan(e));
Toshihiro Shimizu 890ddd
	angle= angle<=0 ? 270+angle : angle-90;
Toshihiro Shimizu 890ddd
    TRotation rM(angle);
Toshihiro Shimizu 890ddd
	TTranslation tM(center.x,center.y);
Toshihiro Shimizu 890ddd
	TScale sM(m/flashGrad,2*tmax(x,a-x)/flashGrad);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    flash.setFillStyleMatrix(tM*rM*sM);
Shinya Kitaoka 3bfa54
	std::vector<tpointd> pp;</tpointd>
Toshihiro Shimizu 890ddd
	pp.push_back(p[0]);
Toshihiro Shimizu 890ddd
	pp.push_back(p[1]);
Toshihiro Shimizu 890ddd
	pp.push_back(p[2]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    flash.drawPolyline(pp);	
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
void SFlashUtils::Triangle2Quad(std::vector<tpointd> &p) const</tpointd>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPointD e;
Toshihiro Shimizu 890ddd
	int i, j;
Toshihiro Shimizu 890ddd
	i = j = -1;
Toshihiro Shimizu 890ddd
	if (p[0] == p[1]) {
Toshihiro Shimizu 890ddd
		i = 0;
Toshihiro Shimizu 890ddd
		j = 1;
Toshihiro Shimizu 890ddd
		e = p[2] - p[3];
Toshihiro Shimizu 890ddd
	} else if (p[0] == p[2]) {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	} else if (p[0] == p[3]) {
Toshihiro Shimizu 890ddd
		i = 0;
Toshihiro Shimizu 890ddd
		j = 3;
Toshihiro Shimizu 890ddd
		e = p[2] - p[1];
Toshihiro Shimizu 890ddd
	} else if (p[1] == p[2]) {
Toshihiro Shimizu 890ddd
		i = 1;
Toshihiro Shimizu 890ddd
		j = 2;
Toshihiro Shimizu 890ddd
		e = p[3] - p[0];
Toshihiro Shimizu 890ddd
	} else if (p[1] == p[3]) {
Toshihiro Shimizu 890ddd
	} else if (p[2] == p[3]) {
Toshihiro Shimizu 890ddd
		i = 2;
Toshihiro Shimizu 890ddd
		j = 3;
Toshihiro Shimizu 890ddd
		e = p[0] - p[1];
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	e = normalize(e);
Toshihiro Shimizu 890ddd
	p[j] = p[i] + e * 0.001;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SFlashUtils::drawGradedPolyline(TFlash &flash,
Shinya Kitaoka 3bfa54
									 std::vector<tpointd> &pvv,</tpointd>
Toshihiro Shimizu 890ddd
									 const TPixel32 &c1,
Toshihiro Shimizu 890ddd
									 const TPixel32 &c2) const
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 3bfa54
	std::vector<tpointd> pv;</tpointd>
Toshihiro Shimizu 890ddd
	pv = pvv;
Toshihiro Shimizu 890ddd
	int nbDV = nbDiffVerts(pv);
Toshihiro Shimizu 890ddd
	if (nbDV < 3 || nbDV > 4)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	if (nbDV == 3)
Toshihiro Shimizu 890ddd
		Triangle2Quad(pv);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Direction Of polyline
Toshihiro Shimizu 890ddd
	TPointD u = pv[0] - pv[1];
Toshihiro Shimizu 890ddd
	TPointD up = (pv[0] + pv[1]) * 0.5;
Toshihiro Shimizu 890ddd
	u = normalize(u);
Toshihiro Shimizu 890ddd
	u = rotate90(u);
Toshihiro Shimizu 890ddd
	TPointD up1 = up + u;
Toshihiro Shimizu 890ddd
	TPointD up2 = up - u;
Toshihiro Shimizu 890ddd
	double d1 = (tdistance(up1, pv[2]) + tdistance(up1, pv[3])) * 0.5;
Toshihiro Shimizu 890ddd
	double d2 = (tdistance(up2, pv[2]) + tdistance(up2, pv[3])) * 0.5;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	std::vector<tpointd> lpv;</tpointd>
Toshihiro Shimizu 890ddd
	if (d1 > d2) {
Toshihiro Shimizu 890ddd
		lpv = pv;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		lpv.push_back(pv[1]);
Toshihiro Shimizu 890ddd
		lpv.push_back(pv[0]);
Toshihiro Shimizu 890ddd
		lpv.push_back(pv[3]);
Toshihiro Shimizu 890ddd
		lpv.push_back(pv[2]);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Transformation of gradient square
Toshihiro Shimizu 890ddd
	const double flashGrad = 16384.0; // size of gradient square
Toshihiro Shimizu 890ddd
	flash.setGradientFill(true, c1, c2, 0);
Toshihiro Shimizu 890ddd
	TPointD p0((lpv[0] + lpv[3]) * 0.5);
Toshihiro Shimizu 890ddd
	TPointD p1((lpv[1] + lpv[2]) * 0.5);
Toshihiro Shimizu 890ddd
	double lv = (tdistance(p0, p1));
Toshihiro Shimizu 890ddd
	double lh = 0.5 * (tdistance(lpv[0], lpv[3]) + tdistance(lpv[1], lpv[2]));
Toshihiro Shimizu 890ddd
	TPointD center = 0.25 * lpv[0] + 0.25 * lpv[1] + 0.25 * lpv[2] + 0.25 * lpv[3];
Toshihiro Shimizu 890ddd
	TPointD e(p0 - p1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double angle = rad2degree(atan(e));
Toshihiro Shimizu 890ddd
	angle = angle <= 0 ? 270 + angle : angle - 90;
Toshihiro Shimizu 890ddd
	TRotation rM(angle);
Toshihiro Shimizu 890ddd
	TTranslation tM(center.x, center.y);
Toshihiro Shimizu 890ddd
	TScale sM(lh / (flashGrad), lv / (flashGrad));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setFillStyleMatrix(tM * sM * rM);
Toshihiro Shimizu 890ddd
	flash.drawPolyline(pv);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
void SFlashUtils::drawGradedRegion(TFlash &flash,
Shinya Kitaoka 3bfa54
								   std::vector<tpointd> &pvv,</tpointd>
Toshihiro Shimizu 890ddd
								   const TPixel32 &c1,
Toshihiro Shimizu 890ddd
								   const TPixel32 &c2, const TRegion &r) const
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 3bfa54
	std::vector<tpointd> pv;</tpointd>
Toshihiro Shimizu 890ddd
	pv = pvv;
Toshihiro Shimizu 890ddd
	int nbDV = nbDiffVerts(pv);
Toshihiro Shimizu 890ddd
	if (nbDV < 3 || nbDV > 4)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	if (nbDV == 3)
Toshihiro Shimizu 890ddd
		Triangle2Quad(pv);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Direction Of polyline
Toshihiro Shimizu 890ddd
	TPointD u = pv[0] - pv[1];
Toshihiro Shimizu 890ddd
	TPointD up = (pv[0] + pv[1]) * 0.5;
Toshihiro Shimizu 890ddd
	u = normalize(u);
Toshihiro Shimizu 890ddd
	u = rotate90(u);
Toshihiro Shimizu 890ddd
	TPointD up1 = up + u;
Toshihiro Shimizu 890ddd
	TPointD up2 = up - u;
Toshihiro Shimizu 890ddd
	double d1 = (tdistance(up1, pv[2]) + tdistance(up1, pv[3])) * 0.5;
Toshihiro Shimizu 890ddd
	double d2 = (tdistance(up2, pv[2]) + tdistance(up2, pv[3])) * 0.5;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	std::vector<tpointd> lpv;</tpointd>
Toshihiro Shimizu 890ddd
	if (d1 > d2) {
Toshihiro Shimizu 890ddd
		lpv = pv;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		lpv.push_back(pv[1]);
Toshihiro Shimizu 890ddd
		lpv.push_back(pv[0]);
Toshihiro Shimizu 890ddd
		lpv.push_back(pv[3]);
Toshihiro Shimizu 890ddd
		lpv.push_back(pv[2]);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Transformation of gradient square
Toshihiro Shimizu 890ddd
	const double flashGrad = 16384.0; // size of gradient square
Toshihiro Shimizu 890ddd
	flash.setGradientFill(true, c1, c2, 0);
Toshihiro Shimizu 890ddd
	TPointD p0((lpv[0] + lpv[3]) * 0.5);
Toshihiro Shimizu 890ddd
	TPointD p1((lpv[1] + lpv[2]) * 0.5);
Toshihiro Shimizu 890ddd
	double lv = (tdistance(p0, p1));
Toshihiro Shimizu 890ddd
	double lh = 0.5 * (tdistance(lpv[0], lpv[3]) + tdistance(lpv[1], lpv[2]));
Toshihiro Shimizu 890ddd
	TPointD center = 0.25 * lpv[0] + 0.25 * lpv[1] + 0.25 * lpv[2] + 0.25 * lpv[3];
Toshihiro Shimizu 890ddd
	TPointD e(p0 - p1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double angle = rad2degree(atan(e));
Toshihiro Shimizu 890ddd
	angle = angle <= 0 ? 270 + angle : angle - 90;
Toshihiro Shimizu 890ddd
	TRotation rM(angle);
Toshihiro Shimizu 890ddd
	TTranslation tM(center.x, center.y);
Toshihiro Shimizu 890ddd
	TScale sM(lh / (flashGrad), lv / (flashGrad));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setFillStyleMatrix(tM * sM * rM);
Toshihiro Shimizu 890ddd
	flash.drawRegion(r);
Toshihiro Shimizu 890ddd
}