#include "turtle.h"
#include "vector.h"
+using namespace std;
+
/**
* Constructor
- * @param model render this model
+ * @param model create this model
*/
Turtle::Turtle(Model *model)
{
+ _model = model;
+
// initial position and orientation
reset();
// 90 degrees
_angle = M_PIl / 2.0;
-
- _model = model;
}
// move turtle to new position
_position.setXYZ(endX, endY, endZ);
- if (!_fenceMode)
- {
- // connect the points
- _model->segment(_diameter,
- startX, startY, startZ,
- endX, endY, endZ);
- }
- else
- {
- // part of a filled surface
- _model->point(endX, endY, endZ);
- }
+ // connect start and end point
+ _model->segment(startX, startY, startZ,
+ endX, endY, endZ);
+}
+
+
+
+/**
+ * Walk forward, creating a filled surface
+ * TODO: merge with walk() ?
+ */
+void Turtle::fillWalk()
+{
+ // end point
+ double destinationX = _position.getX() + _heading.getX();
+ double destinationY = _position.getY() + _heading.getY();
+ double destinationZ = _position.getZ() + _heading.getZ();
+
+ _model->normal(_up.getX(), _up.getY(), _up.getZ());
+
+ // move turtle to new position
+ _position.setXYZ(destinationX, destinationY, destinationZ);
+
+ // part of a filled polygon
+ _model->vertex(destinationX, destinationY, destinationZ);
}
_upStack.push(_up);
// diameter
- _diameterStack.push(_diameter);
+ double diameter = _model->getDiameter();
+ _diameterStack.push(diameter);
+
+ // color index
+ int colorIndex = _model->getColorIndex();
+ _colorIndexStack.push(colorIndex);
}
void Turtle::pop()
{
// position
- _position = _positionStack.top(); _positionStack.pop();
+ _position = _positionStack.top(); _positionStack.pop();
// orientation
- _heading = _headingStack.top(); _headingStack.pop();
- _left = _leftStack.top(); _leftStack.pop();
- _up = _upStack.top(); _upStack.pop();
+ _heading = _headingStack.top(); _headingStack.pop();
+ _left = _leftStack.top(); _leftStack.pop();
+ _up = _upStack.top(); _upStack.pop();
// diameter
- _diameter = _diameterStack.top(); _diameterStack.pop();
+ double diameter = _diameterStack.top(); _diameterStack.pop();
+ _model->setDiameter(diameter);
+
+ // color index
+ int colorIndex = _colorIndexStack.top(); _colorIndexStack.pop();
+ _model->setColorIndex(colorIndex);
}
* Reset to default state
*/
void Turtle::reset()
-{
- _diameter = 0.1;
-
- _fenceMode = false;
-
-
+{
// put turtle at (0,0,0), head upwards, back towards camera
_position.setXYZ(0.0, 0.0, 0.0);
_heading.setXYZ(0.0, 1.0, 0.0);
_left.setXYZ(1.0, 0.0, 0.0);
_up.setXYZ(0.0, 0.0, 1.0);
-}
-
-
-
-/**
- * Decrement diameter of segment
- */
-void Turtle::decrementDiameter()
-{
- // TODO: dynamic value...
- _diameter *= 0.8;
-}
-
-
-
-/**
- * Begin creation of a filled surface
- */
-void Turtle::fenceInBegin()
-{
- _fenceMode = true;
- _model->fillBegin();
- _model->point(_position.getX(), _position.getY(), _position.getZ());
-}
-
-
-
-/**
- * End creation of a filled surface
- */
-void Turtle::fenceInEnd()
-{
- _model->fillEnd();
- _fenceMode = false;
+ // empty the stacks
+ _positionStack = stack<Coordinate>();
+ _headingStack = stack<Vector>();
+ _leftStack = stack<Vector>();
+ _upStack = stack<Vector>();
+ _diameterStack = stack<double>();
+ _colorIndexStack = stack<int>();
}