import random
code="""
<!-- three.js container -->
<div id="container%(id)s"></div>
<!-- info on screen display -->
<div id="info">
<div class="top">
<a href="http://learningthreejs.com/blog/2011/12/20/boilerplate-for-three-js/" target="_blank">LearningThree.js</a>
boiler plate for
<a href="https://github.com/mrdoob/three.js/" target="_blank">three.js</a>
</div>
<div class="bottom" id="inlineDoc" >
</div>
</div>
<script type="text/javascript">
var myfun = function() {
var scene, renderer;
var camera, cameraControl;
var tryWebgl = %(trywebgl)s; // if false, always use canvas renderer
// Need to have a timeout so that there is enough time for the browser
// to create the container div before trying to add the webgl context
// Apparently the notebook's built-in sleep of 50 ms is not enough
setTimeout(function() {
if(!init()) {animate();}
}, 100);
// init the scene
function init(){
var width=800;
var height=600
if( tryWebgl && Detector.webgl ){
renderer = new THREE.WebGLRenderer({
antialias: true, // to get smoother output
preserveDrawingBuffer: true // to allow screenshot
});
renderer.setClearColorHex( 0xBBBBBB, 1 );
}else{
renderer = new THREE.CanvasRenderer();
}
renderer.setSize( width, height );
document.getElementById('container%(id)s').appendChild(renderer.domElement);
// create a scene
scene = new THREE.Scene();
/********* Camera *****************/
camera = new THREE.PerspectiveCamera(35, width/height, 1, 10000 );
camera.position.set(0, 0, 5);
scene.add(camera);
/********** Camera Control **************/
cameraControls = new THREE.TrackballControls( camera, renderer.domElement );
/********** Lights **************/
var light = new THREE.AmbientLight( 0x888888 );
scene.add( light );
var light = new THREE.DirectionalLight( 0xffaa00 );
light.position.set( 1,1,1 ).normalize();
scene.add( light );
var light = new THREE.DirectionalLight( 0x00ff00 );
light.position.set( -1,-1,-1 ).normalize();
scene.add( light );
var light = new THREE.PointLight( 0x0000ff );
light.position.set( .59-0.5, .29-0.5, .87-0.5 ).normalize().multiplyScalar(1.2);
scene.add( light );
var light= new THREE.PointLight( 0xff0000 );
light.position.set( .49, .01, .01 ).normalize().multiplyScalar(1.2);
scene.add( light );
/*********** Objects *******************/
var group = new THREE.Object3D();
// TORUS
var geometry = new THREE.TorusGeometry( 1, 0.42, 16, 16 );
var material = new THREE.MeshLambertMaterial({/*ambient: 0x808080, */color: 0xff88ff});
var mesh = new THREE.Mesh( geometry, material );
group.add( mesh );
// SADDLE PLOT
loader = new THREE.JSONLoader();
loader.load( 'http://sagenb.org/home/jason3/539/data/plot.js', function ( geometry ) {
zmesh = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial() );
zmesh.position.set( 0, 0, 0 );
zmesh.scale.set( 0.5, 0.5, 0.1 );
group.add( zmesh );
} );
scene.add(group);
}
// animation loop
function animate() {
// loop on request animation loop
// - it has to be at the begining of the function
// - see details at http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
requestAnimationFrame( animate, document.getElementById('container') );
// do the render
render();
}
// render the scene
function render() {
// update camera controls
cameraControls.update();
// actually render the scene
renderer.render( scene, camera );
}
}();</script>
"""