algorytm.org

Implementacja w JavaScript



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Krzywe cykliczne - Implementacja w JavaScript
Ocena użytkownikóww: *****  / 1
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 21 listopada 2011 21:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

kc.js:
//Krzywe cykliczne
//(c) 2011 by Tomasz Lubinski
//www.algorytm.org

/* canvas data */
var canvas;
var ctx;
var width;
var height;
var imageData;

/* draw data */
var r1 = 40;
var r2 = 100;
var m = 60;
var sign = -1;
var i;
var x;
var y;

/* animation data */
var isRunning;
var delayValue = 50;

/* animate */
function animate()
{
	// calculate coordinates of the second circle
	var circle_x = Math.floor((r2-r1*sign)*Math.cos(i));
	var circle_y = Math.floor((r2-r1*sign)*Math.sin(i));
	
	// clear previous frame
	canvas.width = canvas.width;
    	
	// put image drawed so far
	ctx.strokeStyle = "black";
	ctx.putImageData(imageData, 0, 0);
	ctx.moveTo(x + width/2, y + height/2);
	
	// calculate new coordinates
	i += 0.05;
	x = Math.floor((r2-r1*sign)*Math.cos(i) + sign*m*Math.cos((r2-r1*sign)*(i/r1)));
	y = Math.floor((r2-r1*sign)*Math.sin(i) - m*Math.sin((r2-r1*sign)*(i/r1)));
	
	// put new point
	ctx.lineTo(x + width/2, y + height/2);
	ctx.stroke();
	imageData = ctx.getImageData(0, 0, width, height);
	
	// draw circles
	ctx.strokeStyle = "red";
	ctx.beginPath();
	ctx.arc(width/2, height/2, r2, 0, Math.PI*2, false);
	ctx.closePath();
	ctx.stroke();
	ctx.strokeStyle = "blue";
	ctx.beginPath();
	ctx.arc(circle_x + width/2, circle_y + height/2, r1, 0, Math.PI*2, false);
	ctx.closePath();
	ctx.stroke();
	ctx.moveTo(circle_x + width/2, circle_y + height/2);
	ctx.lineTo(x + width/2, y + height/2);
	ctx.stroke();
	
	// animate next frame, if thread is still running
	if (isRunning)
	{
		setTimeout("animate()", delayValue);
	}
}

/* stop animation */
function stop()
{
	isRunning = false;
}

/* start animation */
function start() 
{
	// get canvas and clear it
	canvas = document.getElementById("canvas");
	ctx = canvas.getContext("2d");
	width = canvas.width;
	height = canvas.height;
	canvas.width = canvas.width;
	imageData = ctx.getImageData(0, 0, width, height);

	// initialize start point	
	i = 0;
	x = Math.floor((r2-(r1*sign)) + sign*m);
	y = 0;
	isRunning = true;
	
	// draw first frame and start animate
	animate();
}
Dodaj komentarz