-
Notifications
You must be signed in to change notification settings - Fork 3
/
PolygonBrush.cpp
88 lines (77 loc) · 2.02 KB
/
PolygonBrush.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "PolygonBrush.h"
//
// PolygonBrush.cpp
//
// The implementation of Line Brush. It is a kind of ImpBrush. All your brush implementations
// will look like the file with the different GL primitive calls.
//
#include "impressionistDoc.h"
#include "impressionistUI.h"
#include <ostream>
#include <iostream>
extern float frand();
extern int irand(int max);
extern double degToRad(double);
PolygonBrush::PolygonBrush(ImpressionistDoc* pDoc, char* name,bool scattered) :
ImpBrush(pDoc, name),scattered(scattered)
{
}
void PolygonBrush::BrushBegin(const Point source, const Point target)
{
ImpressionistDoc* pDoc = GetDocument();
ImpressionistUI* dlg = pDoc->m_pUI;
BrushMove(source, target);
}
void PolygonBrush::BrushMove(const Point source, const Point target)
{
ImpressionistDoc* pDoc = GetDocument();
ImpressionistUI* dlg = pDoc->m_pUI;
if (pDoc == NULL) {
printf("PolygonBrush::BrushMove document is NULL\n");
return;
}
if (source.x > pDoc->m_nPaintWidth || source.y < 0)
{
return;
}
int size = pDoc->getSize();
if(!scattered)
{
SetColor(source);
DrawPolygon(target, size,nSides?nSides: irand(10));
}else
{
for (int i = 0; i < 0.3*irand(size); i++)
{
const double dx = -size / 2.f + irand(size);
const double dy = -size / 2.f + irand(size);
const Point sourcePt(source.x + dx, source.y + dy);
const Point targetPt(target.x + dx, target.y + dy);
if (sourcePt.x > pDoc->m_nPaintWidth || sourcePt.y < 0)
{
continue;
}
SetColor(sourcePt);
DrawPolygon(targetPt, size, nSides ? nSides : irand(10));
}
}
}
void PolygonBrush::BrushEnd(const Point source, const Point target)
{
}
void PolygonBrush::DrawPolygon(const Point target, int size, int nSides)
{
glBegin(GL_POLYGON);
if (nSides < 3)nSides = 3;
double incre = 360.f / nSides;
int offset = irand(360);
for (double i = 0; i < 360; i+=incre)
{
double rad = degToRad(i + offset);
glVertex2f(
static_cast<GLfloat>(target.x) + cos(rad)*size / 2.f,
static_cast<GLfloat>(target.y) + sin(rad)*size / 2.f
);
}
glEnd();
}