src/ldObjectMath.cpp

changeset 869
7184f3bae695
child 928
0fef7bb7b7a2
child 944
1a6f1997fcbe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ldObjectMath.cpp	Sun Aug 31 20:39:30 2014 +0300
@@ -0,0 +1,89 @@
+/*
+ *  LDForge: LDraw parts authoring CAD
+ *  Copyright (C) 2013, 2014 Teemu Piippo
+ *
+ *  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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "ldObjectMath.h"
+#include "ldObject.h"
+#include "miscallenous.h"
+
+// =============================================================================
+//
+static void RotateVertex (Vertex& v, const Vertex& rotpoint, const Matrix& transformer)
+{
+	v -= rotpoint;
+	v.transform (transformer, Origin);
+	v += rotpoint;
+}
+
+// =============================================================================
+//
+void RotateObjects (const int l, const int m, const int n, double angle, LDObjectList const& objects)
+{
+	QList<Vertex*> queue;
+	const Vertex rotpoint = GetRotationPoint (objects);
+	const double cosangle = cos (angle),
+				 sinangle = sin (angle);
+
+	// ref: http://en.wikipedia.org/wiki/Transformation_matrix#Rotation_2
+	Matrix transform (
+	{
+		(l* l * (1 - cosangle)) + cosangle,
+		(m* l * (1 - cosangle)) - (n* sinangle),
+		(n* l * (1 - cosangle)) + (m* sinangle),
+
+		(l* m * (1 - cosangle)) + (n* sinangle),
+		(m* m * (1 - cosangle)) + cosangle,
+		(n* m * (1 - cosangle)) - (l* sinangle),
+
+		(l* n * (1 - cosangle)) - (m* sinangle),
+		(m* n * (1 - cosangle)) + (l* sinangle),
+		(n* n * (1 - cosangle)) + cosangle
+	});
+
+	// Apply the above matrix to everything
+	for (LDObjectPtr obj : objects)
+	{
+		if (obj->numVertices())
+		{
+			for (int i = 0; i < obj->numVertices(); ++i)
+			{
+				Vertex v = obj->vertex (i);
+				RotateVertex (v, rotpoint, transform);
+				obj->setVertex (i, v);
+			}
+		}
+		elif (obj->hasMatrix())
+		{
+			LDMatrixObjectPtr mo = obj.dynamicCast<LDMatrixObject>();
+
+			// Transform the position
+			Vertex v = mo->position();
+			RotateVertex (v, rotpoint, transform);
+			mo->setPosition (v);
+
+			// Transform the matrix
+			mo->setTransform (transform * mo->transform());
+		}
+		elif (obj->type() == OBJ_Vertex)
+		{
+			LDVertexPtr vert = obj.staticCast<LDVertex>();
+			Vertex v = vert->pos;
+			RotateVertex (v, rotpoint, transform);
+			vert->pos = v;
+		}
+	}
+}

mercurial