From 8693fd830680355d0633d6a4b681386832183b0d Mon Sep 17 00:00:00 2001 From: Jonas Gunz Date: Mon, 21 Jan 2019 19:42:19 +0100 Subject: Implemented rotate angle is stored seperately, original vectors stay untouched. the resulting vectors are calculated in write() with applyRotation() to avoid growing rounding errors --- cWiremesh.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++------ main.cpp | 14 ++++++++++---- 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/cWiremesh.cpp b/cWiremesh.cpp index 91f92af..085f366 100644 --- a/cWiremesh.cpp +++ b/cWiremesh.cpp @@ -3,6 +3,7 @@ cWiremesh::cWiremesh() { position = {0,0,0}; + angle = {0,0,0}; } cWiremesh::~cWiremesh() @@ -35,9 +36,12 @@ void cWiremesh::write(cRender *_render) for(long unsigned int i = 0; i < vectors.size(); i++) { + sCoord3d vorigin = applyRotation(vectors[i].origin, angle); + sCoord3d vdirection = applyRotation(vectors[i].direction, angle); + _render->drawLine(vectors[i].c, - translate(vectors[i].origin + position, origin), - translate(vectors[i].origin + vectors[i].direction + position, origin), + translate(vorigin + position, origin), + translate(vorigin + vdirection + position, origin), true, vectors[i].color); } } @@ -81,21 +85,54 @@ void cWiremesh::scale(float _scalar) } } -sCoord3d applyRotation(sCoord3d _vector, sCoord3d _angle) +sCoord3d cWiremesh::applyRotation(sCoord3d _vector, sCoord3d _angle) { sCoord3d ret = _vector; + //Perform some algebra-magic + //couldn't be bothered to implement or use a matrix class + if(_angle.x) { - + float rads = (float)_angle.x * PI / 180.0; + + ret.y = (int)( + (float)_vector.y * cos(rads) - + (float)_vector.z * sin(rads) + ); + ret.z = (int)( + (float)_vector.y * sin(rads) + + (float)_vector.z * cos(rads) + ); } if(_angle.y) { - + float rads = (float)_angle.y * PI / 180.0; + sCoord3d tmp = ret; + + ret.x = (int)( + (float)tmp.x * cos(rads) + + (float)tmp.z * sin(rads) + ); + + ret.z = (int)( + - (float)tmp.x * sin(rads) + + (float)tmp.z * cos(rads) + ); } if(_angle.z) { - + float rads = (float)_angle.z * PI / 180.0; + sCoord3d tmp = ret; + + ret.x = (int) ( + (float)tmp.x * cos(rads) - + (float)tmp.y * sin(rads) + ); + ret.y = (int) ( + (float)tmp.x * sin(rads) + + (float)tmp.y * cos(rads) + ); } return ret; diff --git a/main.cpp b/main.cpp index 531071e..991ea63 100644 --- a/main.cpp +++ b/main.cpp @@ -91,16 +91,22 @@ int main() switch(ie.c) { case 'w': - position.z++; + obj.rotate({-10,0,0}); break; case 's': - position.z--; + obj.rotate({10,0,0}); break; case 'a': - obj.scale(1.2); + obj.rotate({0,-10,0}); break; case 'd': - obj.scale(0.8); + obj.rotate({0,10,0}); + break; + case 'q': + obj.rotate({0,0,-10}); + break; + case 'e': + obj.rotate({0,0,10}); break; }; obj.setPosition(position); -- cgit v1.2.3