Turtle Graphics: Difference between revisions
From JSXGraph Wiki
| A WASSERMANN (talk | contribs) No edit summary | A WASSERMANN (talk | contribs) No edit summary | ||
| Line 49: | Line 49: | ||
| <script language="JavaScript"> | <script language="JavaScript"> | ||
|              var turtleObj = function(board,attributes) { |              var turtleObj = function(board,attributes) { | ||
|                 this.turtleIsHidden = false; | |||
|                  this.board = board; |                  this.board = board; | ||
|                  if (attributes==null) { |                  if (attributes==null) { | ||
| Line 80: | Line 81: | ||
|                  var dx = -len*Math.cos(this.dir*Math.PI/180.0); |                  var dx = -len*Math.cos(this.dir*Math.PI/180.0); | ||
|                  var dy = len*Math.sin(this.dir*Math.PI/180.0); |                  var dy = len*Math.sin(this.dir*Math.PI/180.0); | ||
|                  var t = this.board.createElement('transform', [dx,dy], {type:'translate'}); |                  if (!this.turtleIsHidden) { | ||
|                     var t = this.board.createElement('transform', [dx,dy], {type:'translate'}); | |||
|                     t.applyOnce(this.turtle); | |||
|                     t.applyOnce(this.turtle2); | |||
|                 } | |||
|                  this.pos[0] += dx; |                  this.pos[0] += dx; | ||
|                  this.pos[1] += dy; |                  this.pos[1] += dy; | ||
| Line 93: | Line 96: | ||
|                      li.needsRegularUpdate = false; |                      li.needsRegularUpdate = false; | ||
|                  } |                  } | ||
|              }; |              }; | ||
| Line 102: | Line 104: | ||
|              turtleObj.prototype.right = function(angle) { |              turtleObj.prototype.right = function(angle) { | ||
|                  this.dir += angle; |                  this.dir += angle; | ||
|                  var t = this.board.createElement('transform', [-angle*Math.PI/180.0,this.turtle], {type:'rotate'}); |                  if (!this.turtleIsHidden) { | ||
|                     var t = this.board.createElement('transform', [-angle*Math.PI/180.0,this.turtle], {type:'rotate'}); | |||
|                     t.applyOnce(this.turtle2); | |||
|                  } | |||
|              } |              } | ||
| Line 128: | Line 131: | ||
|              turtleObj.prototype.setPos = function(x,y) { |              turtleObj.prototype.setPos = function(x,y) { | ||
|                  this.pos = [x,y]; |                  this.pos = [x,y]; | ||
|                  this.turtle.setPositionDirectly(JXG.COORDS_BY_USER,x,y); |                  if (!this.turtleIsHidden) { | ||
|                     this.turtle.setPositionDirectly(JXG.COORDS_BY_USER,x,y); | |||
|                     this.turtle2.setPositionDirectly(JXG.COORDS_BY_USER,x,y+20); | |||
|                     var t = this.board.createElement('transform', [-this.dir*Math.PI/180.0,this.turtle], {type:'rotate'}); | |||
|                     t.applyOnce(this.turtle2); | |||
|                 } | |||
|                  var p = this.board.createElement('point',this.pos,{fixed:true,name:' ',visible:false}); |                  var p = this.board.createElement('point',this.pos,{fixed:true,name:' ',visible:false}); | ||
|                  p.needsRegularUpdate = false; |                  p.needsRegularUpdate = false; | ||
|                  this.points.push(p); |                  this.points.push(p); | ||
|              } |              } | ||
|             turtleObj.prototype.showTurtle = function() {  | |||
|                 this.turtleIsHidden = false;  | |||
|             }; | |||
|             turtleObj.prototype.hideTurtle = function() {  | |||
|                 this.turtleIsHidden = true;  | |||
|             }; | |||
|              turtleObj.prototype.fd = function(len) { this.forward(len); }; |              turtleObj.prototype.fd = function(len) { this.forward(len); }; | ||
| Line 148: | Line 158: | ||
| function run() { | function run() { | ||
|    brd.suspendUpdate(); |    brd.suspendUpdate(); | ||
|   t.hideTurtle(); | |||
|    eval($('input').value); |    eval($('input').value); | ||
|    brd.unsuspendUpdate(); |    brd.unsuspendUpdate(); | ||
Revision as of 21:05, 19 December 2008
This is a very basic implementation of turtle graphics with JSXGraph.
List of commands
There is a predefined turtle object t. Therefore, all commands start with t, like t.fd(100);
- t.forward(len); or t.fd(len);
- t.back(len); or t.bk(len);
- t.right(angle); or t.rt(angle);
- t.left(angle); or t.lt(angle);
- t.penUp();
- t.penDown();
- t.clean();
- t.setPos(x,y);
Snowflake Example
References
- The snowflake example has been adapted from the excellent CanvasTurtle
The turtle graphics code
<link rel="stylesheet" type="text/css" href="http://jsxgraph.uni-bayreuth.de/distrib/jsxgraph.css" />
<script type="text/javascript" src="http://jsxgraph.uni-bayreuth.de/distrib/prototype.js"></script>
<script type="text/javascript" src="http://jsxgraph.uni-bayreuth.de/distrib/jsxgraphcore.js"></script>
<div id="box" class="jxgbox" style="width:600px; height:600px;"></div>
            var turtleObj = function(board,attributes) {
                this.board = board;
                if (attributes==null) {
                    this.attributes = {
                        strokeColor:'#000000'
                    };
                } else {
                    this.attributes = attributes;
                }
                this.attributes.straightFirst = false;
                this.attributes.straightLast = false;
                this.init();
            };
            turtleObj.prototype.init = function() {
                this.points = [];
                this.pos = [0,0];
                this.isPenDown = true;
                this.dir = 90;
                var p = this.board.createElement('point',this.pos,{fixed:true,name:' ',visible:false});
                this.points.push(p);
                this.turtle = this.board.createElement('point',this.pos,{fixed:true,name:' ',visible:false});
                this.turtle2 = this.board.createElement('point',[this.pos[0],this.pos[1]+20],{fixed:true,name:' ',visible:false});
                this.board.createElement('line',[this.turtle,this.turtle2],
                        {lastArrow:true,strokeColor:'#ff0000',straightFirst:false,straightLast:false});
            }
            turtleObj.prototype.forward = function(len) {
                if (len==0) { return; }
                var dx = -len*Math.cos(this.dir*Math.PI/180.0);
                var dy = len*Math.sin(this.dir*Math.PI/180.0);
                var t = this.board.createElement('transform', [dx,dy], {type:'translate'});
                t.applyOnce(this.turtle);
                t.applyOnce(this.turtle2);
                this.pos[0] += dx;
                this.pos[1] += dy;
                var p = this.board.createElement('point',this.pos,{fixed:true,name:' ',visible:false});
                this.points.push(p);
                if (this.isPenDown) {
                    this.board.createElement('line',[this.points[this.points.length-2],p],this.attributes);
                }
                //this.board.update();
            };
            
            turtleObj.prototype.back = function(len) {
                this.forward(-len);
            }
            
            turtleObj.prototype.right = function(angle) {
                this.dir += angle;
                var t = this.board.createElement('transform', [-angle*Math.PI/180.0,this.turtle], {type:'rotate'});
                t.applyOnce(this.turtle2);
                //this.board.update();
            }
            
            turtleObj.prototype.left = function(angle) {
                this.right(-angle);
            }
            
            turtleObj.prototype.penUp = function() {
                this.isPenDown = false;
            }
            
            turtleObj.prototype.penDown = function() {
                this.isPenDown = true;
            }
            turtleObj.prototype.clean = function() {
                for(var el in this.board.objects) {
                    this.board.removeObject(el);
                }
                this.init();
            }
            turtleObj.prototype.setPos = function(x,y) {
                this.pos = [x,y];
                this.turtle.setPositionDirectly(JXG.COORDS_BY_USER,x,y);
                this.turtle2.setPositionDirectly(JXG.COORDS_BY_USER,x,y+20);
                var t = this.board.createElement('transform', [-this.dir*Math.PI/180.0,this.turtle], {type:'rotate'});
                t.applyOnce(this.turtle2);
                var p = this.board.createElement('point',this.pos,{fixed:true,name:' ',visible:false});
                this.points.push(p);
                //this.board.update();
            }
            turtleObj.prototype.fd = function(len) { this.forward(len); };
            turtleObj.prototype.bk = function(len) { this.back(len); };
            turtleObj.prototype.lt = function(angle) { this.left(angle); };
            turtleObj.prototype.rt = function(angle) { this.right(angle); };
            var brd = JXG.JSXGraph.initBoard('box', {originX: 300, originY: 300, unitX: 1, unitY: 1});
            var t = new turtleObj(brd);
 
function run() {
  brd.suspendUpdate();
  eval($('input').value);
  brd.unsuspendUpdate();
}
