| |
| |
|
|
| #include "zigzagstyles.h" |
| |
| #include "trandom.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 *) |
| { |
| |
| const double minDist = 0.5; |
| const double maxDist = 6.0; |
| |
| const int minRotAngle = 0; |
| const int maxRotAngle = 10; |
| |
| 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; |
| |
| 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(); |
| |
| |
| } |
| |
| |
| |
| 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 *) |
| { |
| |
| const double dist = 1.0; |
| |
| 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; |
| |
| 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(); |
| |
| |
| } |
| |
| |
| |
| 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 |
| |