Reuleaux pentagon: Difference between revisions

From JSXGraph Wiki
No edit summary
No edit summary
 
(70 intermediate revisions by the same user not shown)
Line 1: Line 1:
<html>
<html>
<script type="text/javascript" src="/~alfred/jsxgraph/trunk/src/Roulette.js"></script>
<form>
<form>
<input type="button" value="start" onclick="rol.start()">
<input type="button" value="start" onclick="start();">
<input type="button" value="stop" onclick="rol.stop()">
<input type="button" value="stop" onclick="stop();">
<input type="button" value="one step" onclick="rol.rolling()">
<input type="button" value="one step" onclick="rol5.rolling();rol3.rolling();">
</form></html>
</form></html>


<jsxgraph width="600" height="600">
<jsxgraph width="600" height="600" box="jxgbox">
var brd = JXG.JSXGraph.initBoard('jxgbox',{boundingbox:[-5,5,5,-5]});
var brd = JXG.JSXGraph.initBoard('jxgbox',{boundingbox:[-5,7,5,-3]});
brd.renderer.container.style.backgroundColor = '#3d1c24';          // background color board
 
brd.suspendUpdate();
brd.suspendUpdate();
// Pentagon
// Pentagon
var A = brd.create('point',[-2,-2]);
var A = brd.create('point',[-2,-2]);
var B = brd.create('point',[2,-2]);
var B = brd.create('point',[2,-2]);
var pol = brd.create('regularpolygon',[A,B,5], {withLines:false, fillColor:'none', highlightFillColor:'none'});
var pol5 = brd.create('regularpolygon',[A,B,5], {withLines:false, fillColor:'none', highlightFillColor:'none', fillOpacity:0.0});
for (var i=0;i<5;i++) pol5.vertices[i].setProperty({color:'#3d1c24'});
 
var diagPentagon = (1+Math.sqrt(5))*0.5*A.Dist(B);


var reuleauxPentagon = brd.create('curve',[
      function(t) {
        var pi2_5 = 2*Math.PI/5;
        var p = pol.vertices;
        var d = p[0].Dist(p[2]);
        var t1 = (t%(2*Math.PI) + 2*Math.PI) %(2*Math.PI);
        var n = Math.floor(t1 / pi2_5)%5;
        if (isNaN(n)) return n;
        var beta = JXG.Math.Geometry.rad([p[n].X()+1,p[n].Y()],p[n],p[(n+2)%5]);
        t1 -= n*pi2_5;
        t1*=0.5;
        t1 += beta;
        return p[n].X()+d*Math.cos(t1);
      },
      function(t) {
        var pi2_5 = 2*Math.PI/5;
        var p = pol.vertices;
        var d = p[0].Dist(p[2]);
        var t1 = (t%(2*Math.PI) + 2*Math.PI) %(2*Math.PI);
        var n = Math.floor(t1 / pi2_5)%5;
        if (isNaN(n)) return n;
        var beta = JXG.Math.Geometry.rad([p[n].X()+1,p[n].Y()],p[n],p[(n+2)%5]);
        t1 -= n*pi2_5;
        t1*=0.5;
        t1 += beta;
        return p[n].Y()+d*Math.sin(t1);
      },
      0, 2*Math.PI],
      {color:'#093083', highlightFillColor:'#093083'});
     
// Triangle
// Triangle
var C = brd.create('point',[-2,-2]);
var C = brd.create('point',[-2,-2]);
var D = brd.create('point',[
var D = brd.create('point',[C.X()+3/5*diagPentagon, C.Y()]);
                            C.X()+3*(1+Math.sqrt(5))/2/5*A.Dist(B),
var pol3 = brd.create('regularpolygon',[C,D,3], {withLines:false, fillColor:'none', highlightFillColor:'none', fillOpacity:0.0});
                            C.Y()
for (i=0;i<3;i++) pol3.vertices[i].setProperty({color:'#3d1c24'});
                          ]);
 
var pol3 = brd.create('regularpolygon',[C,D,3], {withLines:false, fillColor:'#e8501f', highlightFillColor:'#e8501f'});
// Heptagon
var E = brd.create('point',[-2,-2]);


var reuleauxTriangle = brd.create('curve',[
//
      function(t) {
// Side length of the heptagon depending on the diagonal of the pentagon:
        var pi2_3 = 2*Math.PI/3;
// r_7 = 7/5*r_5
        var p = pol3.vertices;
var diagHeptagon = 7/5*diagPentagon;
        var d = p[0].Dist(p[1]);
// s_7 = r_7*sqrt(2)*sqrt(1-cos(pi/7)) (law of cosines)
        var t1 = (t%(2*Math.PI) + 2*Math.PI) %(2*Math.PI);
var sideHeptagon = Math.sqrt(2*(1-Math.cos(Math.PI/7)))*diagHeptagon;
        var n = Math.floor(t1 / pi2_3)%3;
//
        if (isNaN(n)) return n;
var F = brd.create('point',[E.X()+sideHeptagon, E.Y()]);
        var beta = JXG.Math.Geometry.rad([p[n].X()+1,p[n].Y()],p[n],p[(n+1)%3]);
var pol7 = brd.create('regularpolygon',[E,F,7], {withLines:false, fillColor:'none', highlightFillColor:'none', fillOpacity:0.0});
        t1 -= n*pi2_3;
for (i=0;i<7;i++) pol7.vertices[i].setProperty({color:'#3d1c24'});
        t1*=0.5;
 
        t1 += beta;
// Create the Reuleauc curves
        return p[n].X()+d*Math.cos(t1);
var reuleauxHeptagon = brd.create('curve', JXG.Math.Geometry.reuleauxPolygon(pol7.vertices, 7),
      },
      {strokeWidth:6, strokeColor:'#d66d55', fillColor:'#d6bb55', highlightFillColor:'#d6bb55'});
      function(t) {
var reuleauxPentagon = brd.create('curve', JXG.Math.Geometry.reuleauxPolygon(pol5.vertices, 5),  
        var pi2_3 = 2*Math.PI/3;
      {strokeWidth:6, strokeColor:'#d66d55', fillColor:'#ad5544', highlightFillColor:'#ad5544'});
        var p = pol3.vertices;
var reuleauxTriangle = brd.create('curve', JXG.Math.Geometry.reuleauxPolygon(pol3.vertices, 3),  
        var d = p[0].Dist(p[1]);
       {strokeWidth:6, strokeColor:'#d66d55', fillColor:'#703545', highlightFillColor:'#703545'});
        var t1 = (t%(2*Math.PI) + 2*Math.PI) %(2*Math.PI);
        var n = Math.floor(t1 / pi2_3)%3;
        if (isNaN(n)) return n;
        var beta = JXG.Math.Geometry.rad([p[n].X()+1,p[n].Y()],p[n],p[(n+1)%3]);
        t1 -= n*pi2_3;
        t1*=0.5;
        t1 += beta;
        return p[n].Y()+d*Math.sin(t1);
      },
       0, 2*Math.PI],
      {color:'#e8501f', highlightFillColor:'#e8501f'});
brd.unsuspendUpdate();
brd.unsuspendUpdate();


var createRoulette = function(c1, c2, start_c1, stepsize, time, pointlist) {
var rol5 = brd.createRoulette(reuleauxHeptagon, reuleauxPentagon, 6*Math.PI/5, Math.PI/45, 1, 50, [A,B,C,D]);
    var alpha = 0,
var rol3 = brd.createRoulette(reuleauxPentagon, reuleauxTriangle, 6*Math.PI/5, Math.PI/45, -1, 50, [C,D]);  
        t1 = start_c1,
var rollIt = function() {
        t2 = JXG.Math.Numerics.root(
                rol5.rolling();
                function(t) {
                rol3.rolling();
                    var c1x = c1.X(t1),
};
                        c1y = c1.Y(t1),
var interval;
                        c2x = c2.X(t),
var start = function() {
                        c2y = c2.Y(t);
              interval = setInterval(rollIt,10);
                    return (c1x-c2x)*(c1x-c2x) + (c1y-c2y)*(c1y-c2y);
                },
                0),
        t1_new = 0.0, t2_new = 0.0,  
        rotation = brd.create('transform',[function(){ return alpha;},  
                                          function(){ return c1.X(t1);},
                                          function(){ return c1.Y(t1);}],
                                          {type:'rotate'}),
        linDist = function(t) {
                var mx = c1.X(t1),
                    my = c1.Y(t1),
                    c1x = mx - c1.X(t1_new),
                    c1y = my - c1.Y(t1_new),
                    c2x = mx - c2.X(t),
                    c2y = my - c2.Y(t);
                return (c1x*c1x+c1y*c1y) - (c2x*c2x+c2y*c2y);
            }, 
        interval = null;
 
    this.rolling = function(){
        t1_new = t1+stepsize;
        t2_new = JXG.Math.Numerics.root(linDist, t2+stepsize);
        alpha = -JXG.Math.Geometry.rad(
                    [c1.X(t1_new),c1.Y(t1_new)],
                    [c1.X(t1),c1.Y(t1)],
                    [c2.X(t2_new),c2.Y(t2_new)]);
        rotation.applyOnce(pointlist);
        brd.update();
        t1 = t1_new;
        t2 = t2_new;
    };
   
    this.start = function() {
        if (time>0) {
            interval = setInterval(this.rolling, time);
        }
        return this;
    };
   
    this.stop = function() {
        clearInterval(interval);
        return this;
    };
    return this;
};
};
 
var stop = function() {
var rol = createRoulette(reuleauxPentagon, reuleauxTriangle, 6*Math.PI/5, Math.PI/90, 10, [C,D]); //.start();
              clearInterval(interval);
}
</jsxgraph>
</jsxgraph>


===The underlying JavaScript code===
===The underlying JavaScript code===
coming soon...
<source lang="javascript">
<source lang="javascript">
var brd = JXG.JSXGraph.initBoard('jxgbox',{boundingbox:[-5,7,5,-3]});
brd.renderer.container.style.backgroundColor = '#3d1c24';          // background color board
brd.suspendUpdate();
// Pentagon
var A = brd.create('point',[-2,-2]);
var B = brd.create('point',[2,-2]);
var pol5 = brd.create('regularpolygon',[A,B,5], {withLines:false, fillColor:'none', highlightFillColor:'none', fillOpacity:0.0});
for (var i=0;i<5;i++) pol5.vertices[i].setProperty({color:'#3d1c24'});
var diagPentagon = (1+Math.sqrt(5))*0.5*A.Dist(B);
// Triangle
var C = brd.create('point',[-2,-2]);
var D = brd.create('point',[C.X()+3/5*diagPentagon, C.Y()]);
var pol3 = brd.create('regularpolygon',[C,D,3], {withLines:false, fillColor:'none', highlightFillColor:'none', fillOpacity:0.0});
for (i=0;i<3;i++) pol3.vertices[i].setProperty({color:'#3d1c24'});
// Heptagon
var E = brd.create('point',[-2,-2]);
//
// Side length of the heptagon depending on the diagonal of the pentagon:
// r_7 = 7/5*r_5
var diagHeptagon = 7/5*diagPentagon;
// s_7 = r_7*sqrt(2)*sqrt(1-cos(pi/7)) (law of cosines)
var sideHeptagon = Math.sqrt(2*(1-Math.cos(Math.PI/7)))*diagHeptagon;
//
var F = brd.create('point',[E.X()+sideHeptagon, E.Y()]);
var pol7 = brd.create('regularpolygon',[E,F,7], {withLines:false, fillColor:'none', highlightFillColor:'none', fillOpacity:0.0});
for (i=0;i<7;i++) pol7.vertices[i].setProperty({color:'#3d1c24'});
// Create the Reuleauc curves
var reuleauxHeptagon = brd.create('curve', JXG.Math.Geometry.reuleauxPolygon(pol7.vertices, 7),
      {strokeWidth:6, strokeColor:'#d66d55', fillColor:'#d6bb55', highlightFillColor:'#d6bb55'});
var reuleauxPentagon = brd.create('curve', JXG.Math.Geometry.reuleauxPolygon(pol5.vertices, 5),
      {strokeWidth:6, strokeColor:'#d66d55', fillColor:'#ad5544', highlightFillColor:'#ad5544'});
var reuleauxTriangle = brd.create('curve', JXG.Math.Geometry.reuleauxPolygon(pol3.vertices, 3),
      {strokeWidth:6, strokeColor:'#d66d55', fillColor:'#703545', highlightFillColor:'#703545'});
brd.unsuspendUpdate();
var rol5 = brd.createRoulette(reuleauxHeptagon, reuleauxPentagon, 6*Math.PI/5, Math.PI/45, 1, 50, [A,B,C,D]);
var rol3 = brd.createRoulette(reuleauxPentagon, reuleauxTriangle, 6*Math.PI/5, Math.PI/45, -1, 50, [C,D]);
var rollIt = function() {
                rol5.rolling();
                rol3.rolling();
};
var interval;
var start = function() {
              interval = setInterval(rollIt,10);
};
var stop = function() {
              clearInterval(interval);
}
</source>
</source>


[[Category:Examples]]
[[Category:Examples]]
[[Category:Geometry]]
[[Category:Geometry]]
[[Category:Roulettes]]

Latest revision as of 15:50, 20 February 2013

The underlying JavaScript code

var brd = JXG.JSXGraph.initBoard('jxgbox',{boundingbox:[-5,7,5,-3]});
brd.renderer.container.style.backgroundColor = '#3d1c24';          // background color board

brd.suspendUpdate();
// Pentagon
var A = brd.create('point',[-2,-2]);
var B = brd.create('point',[2,-2]);
var pol5 = brd.create('regularpolygon',[A,B,5], {withLines:false, fillColor:'none', highlightFillColor:'none', fillOpacity:0.0});
for (var i=0;i<5;i++) pol5.vertices[i].setProperty({color:'#3d1c24'});

var diagPentagon = (1+Math.sqrt(5))*0.5*A.Dist(B);

// Triangle
var C = brd.create('point',[-2,-2]);
var D = brd.create('point',[C.X()+3/5*diagPentagon, C.Y()]);
var pol3 = brd.create('regularpolygon',[C,D,3], {withLines:false, fillColor:'none', highlightFillColor:'none', fillOpacity:0.0});
for (i=0;i<3;i++) pol3.vertices[i].setProperty({color:'#3d1c24'});

// Heptagon
var E = brd.create('point',[-2,-2]);

//
// Side length of the heptagon depending on the diagonal of the pentagon:
// r_7 = 7/5*r_5
var diagHeptagon = 7/5*diagPentagon;
// s_7 = r_7*sqrt(2)*sqrt(1-cos(pi/7)) (law of cosines)
var sideHeptagon = Math.sqrt(2*(1-Math.cos(Math.PI/7)))*diagHeptagon;
// 
var F = brd.create('point',[E.X()+sideHeptagon, E.Y()]);
var pol7 = brd.create('regularpolygon',[E,F,7], {withLines:false, fillColor:'none', highlightFillColor:'none', fillOpacity:0.0});
for (i=0;i<7;i++) pol7.vertices[i].setProperty({color:'#3d1c24'});

// Create the Reuleauc curves
var reuleauxHeptagon = brd.create('curve', JXG.Math.Geometry.reuleauxPolygon(pol7.vertices, 7), 
       {strokeWidth:6, strokeColor:'#d66d55', fillColor:'#d6bb55', highlightFillColor:'#d6bb55'});
var reuleauxPentagon = brd.create('curve', JXG.Math.Geometry.reuleauxPolygon(pol5.vertices, 5), 
       {strokeWidth:6, strokeColor:'#d66d55', fillColor:'#ad5544', highlightFillColor:'#ad5544'});
var reuleauxTriangle = brd.create('curve', JXG.Math.Geometry.reuleauxPolygon(pol3.vertices, 3), 
       {strokeWidth:6, strokeColor:'#d66d55', fillColor:'#703545', highlightFillColor:'#703545'});
brd.unsuspendUpdate();

var rol5 = brd.createRoulette(reuleauxHeptagon, reuleauxPentagon, 6*Math.PI/5, Math.PI/45, 1, 50, [A,B,C,D]); 
var rol3 = brd.createRoulette(reuleauxPentagon, reuleauxTriangle, 6*Math.PI/5, Math.PI/45, -1, 50, [C,D]); 
var rollIt = function() {
                rol5.rolling();
                rol3.rolling();
};
var interval;
var start = function() {
              interval = setInterval(rollIt,10);
};
var stop = function() {
              clearInterval(interval);
}