diff --git a/Shape.cpp b/Shape.cpp
new file mode 100644
index 0000000..b31b6c8
--- /dev/null
+++ b/Shape.cpp
@@ -0,0 +1,321 @@
+/*
+ * Shape.cpp
+ *
+ * (c) 2013 Sofian Audry -- info(@)sofianaudry(.)com
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "Shape.h"
+
+bool Shape::includesPoint(int x, int y)
+{
+ Point *prev = NULL, *cur;
+ int left = 0, right = 0, maxy, miny;
+ for (std::vector::iterator it = vertices.begin() ; it !=
+ vertices.end(); it++)
+ {
+ if (!prev) {
+ prev = &vertices.back();
+ }
+ cur = &(*it);
+ miny = std::min(cur->y, prev->y);
+ maxy = std::max(cur->y, prev->y);
+
+ if (y > miny && y < maxy) {
+ if (prev->x == cur->x)
+ {
+ if (x < cur->x)
+ right++;
+ else left++;
+ }
+ else
+ {
+ double slope = (cur->y - prev->y) / (cur->x - prev->x);
+ double offset = cur->y - slope * cur->x;
+ int xintersect = int((y - offset ) / slope);
+ if (x < xintersect)
+ right++;
+ else left++;
+ }
+ }
+ prev = &(*it);
+ }
+ if (right % 2 && left % 2)
+ return true;
+ return false;
+}
+
+
+void Shape::translate(int x, int y)
+{
+ for (std::vector::iterator it = vertices.begin() ; it !=
+ vertices.end(); ++it)
+ {
+ it->x += x;
+ it->y += y;
+ }
+}
+
+
+
+
+Mesh::Mesh(Point p1, Point p2, Point p3, Point p4, int nColumns, int nRows)
+: Quad(p1, p2, p3, p4), _nColumns(0), _nRows(0)
+{
+ Q_ASSERT(nColumns >= 2 && nRows >= 2);
+ init(nColumns, nRows);
+}
+
+void Mesh::resizeVertices2d(std::vector< std::vector >& vertices2d, int nColumns, int nRows)
+{
+ vertices2d.resize(nColumns);
+ for (int i=0; i > newVertices2d;
+ resizeVertices2d(newVertices2d, nColumns()+1, nRows());
+
+ // Left displacement of points already there.
+ float leftMoveProp = 1.0f/(nColumns()-1) - 1.0f/nColumns();
+
+ // Add a point at each row.
+ int k = nVertices();
+ for (int y=0; y > newVertices2d;
+ resizeVertices2d(newVertices2d, nColumns(), nRows()+1);
+
+ // Top displacement of points already there.
+ float topMoveProp = 1.0f/(nRows()-1) - 1.0f/nRows();
+
+ // Add a point at each row.
+ int k = nVertices();
+ for (int x=0; x= nColumns() && nRows_ >= nRows());
+ while (nColumns_ != nColumns())
+ addColumn();
+ while (nRows_ != nRows())
+ addRow();
+}
+
+// void removeColumn(int columnId)
+// {
+// // Cannot remove first and last columns
+// Q_ASSERT(columnId >= 1 && columnId < nColumns()-1);
+//
+// std::vector< std::vector > newVertices2d;
+// resizeVertices2d(newVertices2d, nColumns()-1, nRows());
+//
+// // Right displacement of points already there.
+// float rightMoveProp = 1.0f/(nColumns()-2) - 1.0f/(nColumns()-1);
+//
+// // Remove a point at each row.
+// int k = nVertices();
+// for (int y=0; y Mesh::getQuads() const
+{
+ std::vector quads;
+ for (int i=0; i > Mesh::getQuads2d() const
+{
+ std::vector< std::vector > quads2d;
+ for (int i=0; i column;
+ for (int j=0; j::iterator it = vertices.begin() ; it !=
- vertices.end(); it++)
- {
- if (!prev) {
- prev = &vertices.back();
- }
- cur = &(*it);
- miny = std::min(cur->y, prev->y);
- maxy = std::max(cur->y, prev->y);
-
- if (y > miny && y < maxy) {
- if (prev->x == cur->x)
- {
- if (x < cur->x)
- right++;
- else left++;
- }
- else
- {
- double slope = (cur->y - prev->y) / (cur->x - prev->x);
- double offset = cur->y - slope * cur->x;
- int xintersect = int((y - offset ) / slope);
- if (x < xintersect)
- right++;
- else left++;
- }
- }
- prev = &(*it);
- }
- if (right % 2 && left % 2)
- return true;
- return false;
- }
+ bool includesPoint(int x, int y);
/* Translate all vertices of shape by the vector (x,y) */
- void translate(int x, int y)
- {
- for (std::vector::iterator it = vertices.begin() ; it !=
- vertices.end(); ++it)
- {
- it->x += x;
- it->y += y;
- }
- }
+ void translate(int x, int y);
int nVertices()
{
@@ -175,39 +133,12 @@ public:
Mesh() : _nColumns(0), _nRows(0) {
init(1, 1);
}
- Mesh(Point p1, Point p2, Point p3, Point p4, int nColumns=2, int nRows=2)
- : Quad(p1, p2, p3, p4), _nColumns(0), _nRows(0)
- {
- Q_ASSERT(nColumns >= 2 && nRows >= 2);
- init(nColumns, nRows);
- }
+ Mesh(Point p1, Point p2, Point p3, Point p4, int nColumns=2, int nRows=2);
virtual ~Mesh() {}
- void resizeVertices2d(std::vector< std::vector >& vertices2d, int nColumns, int nRows)
- {
- vertices2d.resize(nColumns);
- for (int i=0; i >& vertices2d, int nColumns, int nRows);
- void init(int nColumns, int nRows)
- {
- // Create vertices correspondence of bouding quad.
- resizeVertices2d(_vertices2d, 2, 2);
- _vertices2d[0][0] = 0;
- _vertices2d[1][0] = 1;
- _vertices2d[1][1] = 2;
- _vertices2d[0][1] = 3;
-
- // Init number of columns and rows.
- _nColumns = _nRows = 2;
-
- // Add extra columns and rows.
- for (int i=0; i > newVertices2d;
- resizeVertices2d(newVertices2d, nColumns()+1, nRows());
+ void addColumn();
+ void addRow();
- // Left displacement of points already there.
- float leftMoveProp = 1.0f/(nColumns()-1) - 1.0f/nColumns();
+ void resize(int nColumns_, int nRows_);
- // Add a point at each row.
- int k = nVertices();
- for (int y=0; y > newVertices2d;
- resizeVertices2d(newVertices2d, nColumns(), nRows()+1);
-
- // Top displacement of points already there.
- float topMoveProp = 1.0f/(nRows()-1) - 1.0f/nRows();
-
- // Add a point at each row.
- int k = nVertices();
- for (int x=0; x= nColumns() && nRows_ >= nRows());
- while (nColumns_ != nColumns())
- addColumn();
- while (nRows_ != nRows())
- addRow();
- }
-
-// void removeColumn(int columnId)
-// {
-// Q_ASSERT(columnId >= 1 && columnId < nColumns());
-//
-// std::vector< std::vector > newVertices2d;
-// resizeVertices2d(newVertices2d, nHorizontalVertices()-1, nVerticalVertices());
-// for (int y=0; y getQuads() const
- {
- std::vector quads;
- for (int i=0; i > getQuads2d() const
- {
- std::vector< std::vector > quads2d;
- for (int i=0; i column;
- for (int j=0; j getQuads() const;
+ std::vector< std::vector > getQuads2d() const;
int nColumns() const { return _nColumns; }
int nRows() const { return _nRows; }
diff --git a/libremapping.pro b/libremapping.pro
index 8ed9141..5643a3b 100644
--- a/libremapping.pro
+++ b/libremapping.pro
@@ -1,7 +1,7 @@
CONFIG += qt debug
TEMPLATE = app
HEADERS = MainWindow.h Util.h MapperGLCanvas.h SourceGLCanvas.h DestinationGLCanvas.h Mapper.h Mapping.h Shape.h Paint.h Layer.h MappingManager.h
-SOURCES = main.cpp MainWindow.cpp Util.cpp Mapper.cpp MapperGLCanvas.cpp SourceGLCanvas.cpp DestinationGLCanvas.cpp Layer.cpp MappingManager.cpp
+SOURCES = main.cpp MainWindow.cpp Util.cpp Mapper.cpp Shape.cpp MapperGLCanvas.cpp SourceGLCanvas.cpp DestinationGLCanvas.cpp Layer.cpp MappingManager.cpp
QT += gui opengl
RESOURCES = libremapping.qrc