9 #include "GridTriangleFill.h" 15 static bool compareByY (
const QPoint &first,
18 if (first.y() < second.y()) {
20 }
else if (first.y() > second.y()) {
24 return (first.x() < second.x());
28 GridTriangleFill::GridTriangleFill ()
32 void GridTriangleFill::drawLine (
GridLog &gridLog,
38 const double RADIUS = 0.1;
47 for (
int x = x0; x <= x1; x++) {
51 image.setPixel (QPoint (x, y),
62 if (p0In.x() > 0 && p0In.y() > 0 &&
63 p1In.x() > 0 && p1In.y() > 0 &&
64 p2In.x() > 0 && p2In.y() > 0) {
68 sortByAscendingY (p0In, p1In, p2In, p0, p1, p2);
70 if (p1.y() == p2.y()) {
73 flatBottom (gridLog, image, p0, p1, p2);
75 }
else if (p0.y() == p1.y()) {
78 flatTop (gridLog, image, p0, p1, p2);
84 double s = (double) (p1.y() - p0.y())/ (
double) (p2.y() - p0.y());
85 QPoint p3 ((
int) (p0.x() + s * (p2.x() - p0.x())),
87 flatBottom (gridLog, image, p0, p1, p3);
88 flatTop (gridLog, image, p1, p3, p2);
93 void GridTriangleFill::flatBottom (
GridLog &gridLog,
100 double denom0 = p1.y() - p0.y();
101 double denom1 = p2.y() - p0.y();
102 if (denom0 == 0 || denom1 == 0) {
109 double slopeInverse0 = (p1.x() - p0.x()) / denom0;
110 double slopeInverse1 = (p2.x() - p0.x()) / denom1;
114 if (slopeInverse0 > slopeInverse1) {
115 double temp = slopeInverse0;
116 slopeInverse0 = slopeInverse1;
117 slopeInverse1 = temp;
123 for (
int scanLineY = p0.y(); scanLineY <= p1.y(); scanLineY++) {
135 void GridTriangleFill::flatTop (
GridLog &gridLog,
142 double denom0 = p2.y() - p0.y();
143 double denom1 = p2.y() - p1.y();
144 if (denom0 == 0 || denom1 == 0) {
151 double slopeInverse0 = (p2.x() - p0.x()) / denom0;
152 double slopeInverse1 = (p2.x() - p1.x()) / denom1;
156 if (slopeInverse1 > slopeInverse0) {
157 double temp = slopeInverse0;
158 slopeInverse0 = slopeInverse1;
159 slopeInverse1 = temp;
165 for (
int scanLineY = p2.y(); scanLineY >= p0.y(); scanLineY--) {
177 void GridTriangleFill::sortByAscendingY (QPoint p0In,
186 list << p0In << p1In << p2In;
187 std::sort (list.begin(), list.end(), compareByY);
Class that does special logging for GridLog and GridRemoval classes.
void fill(GridLog &gridLog, QImage &image, const QPoint &p0, const QPoint &p1, const QPoint &p2)
Fill triangle between these three points.
void showOutputScanLinePixel(int x, int y, double radius)
Show scan line pixel that is the output of GridHealer.