JavaScript
var canvas=document.getElementById('myCanvas');
var context=canvas.getContext('2d');
canvas.width=800;
canvas.height=600;
var canvasData=context.getImageData(0, 0, canvas.width, canvas.height);
var angls=[["45","210"]];
//var angls=[[45,180],[45,180],[45,180],[45,180]];
//var angls=[[45,c],[-45,c]];
var massiv=sfera(angls);
droveLines(canvas, 0, 0, massiv);
canvas.addEventListener('mousemove', function(evt){
var mousePos=getMousePos(canvas, evt);
droveLines(canvas, mousePos.x, mousePos.y, massiv);
}, false);
function rotate(v, p, cos, sin, mcos){
var x=v[0], y=v[1], z=v[2]; // вектор, вокруг которого вращаем
var xp=p[0], yp=p[1], zp=p[2]; // точка, которую вращаем
var a11=(mcos*x*x+cos), a12=(mcos*x*y-sin*z), a13=(mcos*x*z+sin*y); // матрица поворота вокруг вектора
var a21=(mcos*x*y+sin*z), a22=(mcos*y*y+cos), a23=(mcos*z*y-sin*x);
var a31=(mcos*x*z-sin*y), a32=(mcos*z*y+sin*x), a33=(mcos*z*z+cos);
var xx=xp*a11+yp*a12+zp*a13; // умножаем точку на матрицу
var yy=xp*a21+yp*a22+zp*a23;
var zz=xp*a31+yp*a32+zp*a33;
return [xx, yy, zz];
}
function find_point(a, b, c, angls){
var alfa=angls[0]*Math.PI/180, betta=angls[1]*Math.PI/180;
var x1=a[0], y1=a[1], z1=a[2]; //A
var x2=b[0], y2=b[1]; z2=b[2]; //B - ось вращения AB
var x3=c[0], y3=c[1], z3=c[2]; //C - третья точка нужна для задания плоскости
var xa=x2-x1, ya=y2-y1, za=z2-z1; // вектор AB
var xc=x3-x1, yc=y3-y1, zc=z3-z1; // вектор AC
var xv=(ya*zc-za*yc), yv=-(xa*zc-za*xc), zv=(xa*yc-ya*xc); // векторное произведение векторов AB и AC (получаем вектор-перпиндикуляр к плоскости)
var cosa=Math.cos(alfa); // всю тригонометрию из матрицы поворота считаем заранее (оптимизация)
var sina=Math.sin(alfa);
var mcosa=1-Math.cos(alfa);
var cosb=Math.cos(betta);
var sinb=Math.sin(betta);
var mcosb=1-Math.cos(betta);
var r=Math.sqrt(Math.pow(xv,2)+Math.pow(yv,2)+Math.pow(zv,2)); // длина вектора-перпиндикуляра
var vector=[xv/r, yv/r, zv/r]; // нормированный вектор
var point=[xa, ya, za];...