/*test*/ #include "zigzagstyles.h" //#include "tstrokeoutline.h" #include "trandom.h" //#include "tgl.h" #ifdef POICIPENSO TZigzagStrokeStyle::TZigzagStrokeStyle(const TPixel32 &color) : m_color(color), m_density(0.5) {} //----------------------------------------------------------------------------- TZigzagStrokeStyle::TZigzagStrokeStyle() : m_color(TPixel32(0, 0, 0, 255)), m_density(0.5) {} //----------------------------------------------------------------------------- void TZigzagStrokeStyle::draw(double pixelSize, const TColorFunction *) { // Distance between sampling points const double minDist = 0.5; const double maxDist = 6.0; // Rotation angle of tangent const int minRotAngle = 0; const int maxRotAngle = 10; // e.g minimum translation length is the half of the thickness const double minTranslLength = 0.7; TStroke *stroke = getStroke(); if (!stroke) return; double length = stroke->getLength(); if (length <= 0) return; int count = (int)(length / (minDist + (maxDist - minDist) * (1.0 - m_density)) + 1); double dist = length / count; TRandom rnd; // glEnable(GL_BLEND); tglColor(m_color); glBegin(GL_LINE_STRIP); int first = 1; for (double s = 0; s < (length + dist); s += dist, first = -first) { double w = stroke->getParameterAtLength(s); TThickPoint pos = stroke->getThickPoint(w); TPointD u = stroke->getSpeed(w); if (norm2(u) < TConsts::epsilon) continue; u = normalize(u); int angle = rnd.getInt(minRotAngle, maxRotAngle); TRotation rotM(angle); u = rotM * u; double maxTranslLength = angle == 90 ? 1.0 : 2.0; if (angle > 30 && angle < 90) { double rta = 1.0 / tan(degree2rad(angle)); maxTranslLength = sqrt(sq(rta) + 1.0); } double r = (minTranslLength + (maxTranslLength - minTranslLength) * rnd.getDouble()) * pos.thick * first; glVertex(pos + r * u); } glEnd(); // glDisable(GL_BLEND); // glColor4d(0,0,0,1); } //----------------------------------------------------------------------------- void TZigzagStrokeStyle::changeParameter(double delta) { m_density = tcrop(m_density + delta, 0.0, 1.0); } //----------------------------------------------------------------------------- TStrokeStyle *TZigzagStrokeStyle::clone() const { TColorStyle *cs = new TZigzagStrokeStyle(*this); cs->assignNames(this); return cs; } //============================================================================= TImageBasedZigzagStrokeStyle::TImageBasedZigzagStrokeStyle( const TPixel32 &color) : m_color(color) , m_textScale(1.0) , m_texture(0) {} //----------------------------------------------------------------------------- TImageBasedZigzagStrokeStyle::TImageBasedZigzagStrokeStyle() : m_color(TPixel32(0, 0, 0, 255)), m_textScale(1.0), m_texture(0) {} //----------------------------------------------------------------------------- TImageBasedZigzagStrokeStyle::TImageBasedZigzagStrokeStyle( const TRaster32P texture) : m_color(TPixel32(0, 0, 0, 255)), m_textScale(1.0), m_texture(texture) {} //----------------------------------------------------------------------------- inline int TImageBasedZigzagStrokeStyle::realTextCoord(const int a, const int l) const { return a == 0 ? 0 : (a > 0 ? a % l : l - 1 - ((-a) % l)); } //----------------------------------------------------------------------------- void TImageBasedZigzagStrokeStyle::draw(double pixelSize, const TColorFunction *) { // Distance between sampling points const double dist = 1.0; // Scaling of texture double recScale = fabs(m_textScale) < TConsts::epsilon ? 1.0 : 1.0 / m_textScale; TStroke *stroke = getStroke(); if (!stroke) return; double length = stroke->getLength(); if (length <= 0) return; TRandom rnd; // glEnable(GL_BLEND); glColor(m_color); glBegin(GL_LINE_STRIP); TPointD textC = m_texture->getCenterD(); TRectD strokeBB = stroke->getBBox(); TPointD strokeC((strokeBB.x0 + strokeBB.x1) / 2, (strokeBB.y0 + strokeBB.y1) / 2); for (double s = 0; s < (length + dist); s += dist) { double w = stroke->getParameterAtLength(s); TThickPoint pos = stroke->getThickPoint(w); TPointD textPos((pos.x - strokeC.x) * recScale + textC.x, (pos.y - strokeC.y) * recScale + textC.y); TPointD u = stroke->getSpeed(w); if (norm2(u) == 0) continue; u = normalize(u); TPoint iTextPos(tround(textPos.x), tround(textPos.y)); iTextPos.x = realTextCoord(iTextPos.x, m_texture->getLx()); iTextPos.y = realTextCoord(iTextPos.y, m_texture->getLy()); TPixel32 color = m_texture->pixels(iTextPos.y)[iTextPos.x]; double ch, cl, cs; RGB2HLS(color.r / 255.0, color.g / 255.0, color.b / 255.0, &ch, &cl, &cs); TRotation rotM(tround(ch)); u = rotM * u; double r = cl * pos.thick; glVertex(pos + r * u); } glEnd(); // glDisable(GL_BLEND); // glColor4d(0,0,0,1); } //----------------------------------------------------------------------------- void TImageBasedZigzagStrokeStyle::changeParameter(double delta) { m_textScale = tcrop(m_textScale + delta, 0.1, 2.5); } //----------------------------------------------------------------------------- TStrokeStyle *TImageBasedZigzagStrokeStyle::clone() const { TColorStyle *cs = new TImageBasedZigzagStrokeStyle(*this); cs->assignNames(this); return cs; } #endif