1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
<html>
<head>
<title>JSXGraph example</title>
<link rel="stylesheet" type="text/css" href="../distrib/jsxgraph.css" />
<script type="text/javascript" src="../distrib/jsxgraphcore.js"></script>
</head>
<body>
<div id="box" class="jxgbox" style="width:600px; height:600px;"></div>
<div id="debug" style="display:block;"></div>
<script type="text/javascript">
/* <![CDATA[ */
var brd = JXG.JSXGraph.initBoard('box', {originX: 300, originY: 300, grid:true, unitX: 100, unitY: 100});
var solveQ2 = function(x1,x2,x3,off) {
var a, b, c, d;
a = 0.5;
b = -(x1+x2+x3);
c = x1*x1+x2*x2+x3*x3-0.5*(x1+x2+x3)*(x1+x2+x3)-off;
d = b*b-4*a*c;
if (Math.abs(d)<0.00000001) d = 0.0;
return [(-b+Math.sqrt(d))/(2.0*a),(-b-Math.sqrt(d))/(2.0*a)];
};
a = brd.create('line',[[0,0],[2,0]],{straightFirst:false,straightLast:false,visible:false,withLabel:false});
p1 = brd.create('glider',[1.3,0,a],{name:''});
b0 = -0.5;
c0 = brd.create('circle',[[0,0],Math.abs(1.0/b0)],{strokeWidth:1, strokeColor:'black', withLabel:false});
c1 = brd.create('circle',[p1,function(){return 2-p1.X();}],{strokeWidth:1, strokeColor:'black', withLabel:false});
c2 = brd.create('circle',[[function(){return p1.X()-2;},0],function(){return p1.X();}],
{strokeWidth:1, strokeColor:'black', withLabel:false});
c0.curvature = function(){ return b0;}; // constant
c1.curvature = function(){ return 1/(2-p1.X());};
c2.curvature = function(){ return 1/(p1.X());};
thirdCircleX = function() {
var b0,b1,b2,x0,x1,x2, b3,bx3;
b0 = c0.curvature();
b1 = c1.curvature();
b2 = c2.curvature();
x0 = c0.midpoint.X();
x1 = c1.midpoint.X();
x2 = c2.midpoint.X();
b3 = solveQ2(b0,b1,b2,0);
bx3 = solveQ2(b0*x0,b1*x1,b2*x2,2);
return bx3[0]/b3[0];
};
thirdCircleY = function() {
var b0,b1,b2,y0,y1,y2, b3,by3;
b0 = c0.curvature();
b1 = c1.curvature();
b2 = c2.curvature();
y0 = c0.midpoint.Y();
y1 = c1.midpoint.Y();
y2 = c2.midpoint.Y();
b3 = solveQ2(b0,b1,b2,0);
by3 = solveQ2(b0*y0,b1*y1,b2*y2,2);
return by3[0]/b3[0];
};
thirdCircleRadius = function() {
var b0,b1,b2, b3,bx3,by3;
b0 = c0.curvature();
b1 = c1.curvature();
b2 = c2.curvature();
b3 = solveQ2(b0,b1,b2,0);
return 1.0/b3[0];
};
p3 = brd.create('point',[thirdCircleX,thirdCircleY],{name:'', visible:false, withLabel:false});
c3 = brd.create('circle',[p3,thirdCircleRadius],{strokeWidth:1, strokeColor:'black', withLabel:false});
c3.curvature = function(){ return 1.0/this.radius;};
otherCirc = function(circs,level) {
var p,c, fx,fy,fr;
if (level<=0) return;
fx = function() {
var b,x,i;
b = [];
x = [];
for (i=0;i<4;i++) {
b[i] = circs[i].curvature();
x[i] = circs[i].midpoint.X();
}
b[4] = 2*(b[0]+b[1]+b[2])-b[3];
x[4] = (2*(b[0]*x[0]+b[1]*x[1]+b[2]*x[2])-b[3]*x[3])/b[4];
return x[4];
};
fy = function() {
var b,y,i;
b = [];
y = [];
for (i=0;i<4;i++) {
b[i] = circs[i].curvature();
y[i] = circs[i].midpoint.Y();
}
b[4] = 2*(b[0]+b[1]+b[2])-b[3];
y[4] = (2*(b[0]*y[0]+b[1]*y[1]+b[2]*y[2])-b[3]*y[3])/b[4];
return y[4];
};
fr = function() {
var b,i;
b = [];
for (i=0;i<4;i++) {
b[i] = circs[i].curvature();
}
b[4] = 2*(b[0]+b[1]+b[2])-b[3];
if (isNaN(b[4])) {
return 1000.0;
} else {
return 1/b[4];
}
};
c = brd.create('circle',[[fx,fy],fr],
{name:'',
strokeWidth:1,
strokeColor: 'black',
fillColor:JXG.hsv2rgb(360*1/(level+1),0.7,0.8),
fillOpacity:0.5,
withLabel:false
});
c.curvature = function(){ return 1/this.radius;};
otherCirc([circs[0],circs[1],c,circs[2]],level-1);
otherCirc([circs[0],circs[2],c,circs[1]],level-1);
otherCirc([circs[1],circs[2],c,circs[0]],level-1);
return c;
};
//-------------------------------------------------------
brd.suspendUpdate();
level = 4;
otherCirc([c0,c1,c2,c3],level);
otherCirc([c3,c1,c2,c0],level);
otherCirc([c0,c2,c3,c1],level);
otherCirc([c0,c1,c3,c2],level);
brd.unsuspendUpdate();
/* ]]> */
</script>
</body>
</html>
|