<!DOCTYPE html>
<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"><meta charset="utf-8">
 
    <title>Cube stuff</title>
</head>


<body style="background-color:#ccc">

<script>
// Choose colors

var nd_color = '#f00';
var ld_color = '#00f';
var td_color = '#aa0';


//
// DON'T CHANGE STUFF FROM HERE ON
// UNLESS YOU KNOW WHAT YOU ARE DOING
//


var body = document.getElementsByTagName("body")[0];
var mobile = false;

if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
  mobile = true;
}

var CanvasPosition = 400;
var CanvasPositionTop = 800;

var window_size = Math.min((window.innerWidth-CanvasPosition)*0.5-10, window.innerHeight-30);
if(mobile){window_size = window.innerWidth-20;}

var CanvasHeight = window_size;
var CanvasWidth = window_size;
var fontSize = CanvasHeight/30;
var Canvas;
var CanvasAngle, CanvasAngleBG;
var CanvasAngleRot, CanvasAngleRotBG;
var StartingPoint = CanvasHeight *0.1;
var orange_type = 1;
var arrow=false;
var dashed_length = 4;
var dashed_width = 1;


var schmid = [[],[],[],[],[],[]];


var a,b,c,e,f,g;

var el = CanvasHeight * 0.5; // edge length of the cube

var line_point = [ , , ];
var line_dir = [ , , ];
var normal_vector_nd = [,,];
var normal_vector_ld = [,,];
var normal_vector_td = [,,];

var origin = StartingPoint+0.5*el;

newCanvas();
DrawCube();


function newCanvas(){

    if(!mobile){
    var newCanvas = document.createElement('canvas');
    
    newCanvas.id = "canvas";
    newCanvas.width = CanvasWidth;
    newCanvas.height = CanvasHeight;
    newCanvas.style.height = CanvasHeight + 'px';
    newCanvas.style.width = CanvasWidth + 'px';
    newCanvas.style.zIndex = CanvasPosition + "px";
    newCanvas.style.position = "absolute";
    newCanvas.style.left = CanvasPosition  + "px";
    newCanvas.style.border = "2px solid";
    newCanvas.style.background = "#fff";


    body.appendChild(newCanvas);
    Canvas = newCanvas;
    ctx = Canvas.getContext("2d");
    
    var newCanvas = document.createElement('canvas');
    newCanvas.id = "canvas";
    newCanvas.width = CanvasWidth;
    newCanvas.height = CanvasHeight;
    newCanvas.style.height = CanvasHeight + 'px';
    newCanvas.style.width = CanvasWidth + 'px';
    newCanvas.style.zIndex = CanvasPosition  + "px";
    newCanvas.style.position = "absolute";
    newCanvas.style.left = CanvasPosition + 10 + CanvasWidth+ "px";
    newCanvas.style.border = "2px solid";
    newCanvas.style.background = "#fff";


    body.appendChild(newCanvas);
    CanvasAngleBG = newCanvas;
    ctxAngleBG = CanvasAngleBG.getContext("2d");
    
    var newCanvas = document.createElement('canvas');
    newCanvas.id = "canvas";
    newCanvas.width = CanvasWidth;
    newCanvas.height = CanvasHeight;
    newCanvas.style.height = CanvasHeight + 'px';
    newCanvas.style.width = CanvasWidth + 'px';
    newCanvas.style.zIndex = CanvasPosition  + "px";
    newCanvas.style.position = "absolute";
    newCanvas.style.left = CanvasPosition + 10 + CanvasWidth+ "px";
    newCanvas.style.border = "2px solid";


    body.appendChild(newCanvas);
    CanvasAngle = newCanvas;
    ctxAngle = CanvasAngle.getContext("2d");
    
    var newCanvas = document.createElement('canvas');
    newCanvas.id = "canvas";
    newCanvas.width = CanvasWidth;
    newCanvas.height = CanvasHeight;
    newCanvas.style.height = CanvasHeight + 'px';
    newCanvas.style.width = CanvasWidth + 'px';
    newCanvas.style.zIndex = CanvasPosition  + "px";
    newCanvas.style.position = "absolute";
    newCanvas.style.left = CanvasPosition + 20 + 2*CanvasWidth+ "px";
    newCanvas.style.border = "2px solid";
    newCanvas.style.background = "#fff";


    body.appendChild(newCanvas);
    CanvasAngleRotBG = newCanvas;
    ctxAngleRotBG = CanvasAngleRotBG.getContext("2d");
    
    var newCanvas = document.createElement('canvas');
    newCanvas.id = "canvas";
    newCanvas.width = CanvasWidth;
    newCanvas.height = CanvasHeight;
    newCanvas.style.height = CanvasHeight + 'px';
    newCanvas.style.width = CanvasWidth + 'px';
    newCanvas.style.zIndex = CanvasPosition  + "px";
    newCanvas.style.position = "absolute";
    newCanvas.style.left = CanvasPosition + 20 + 2*CanvasWidth+ "px";
    newCanvas.style.border = "2px solid";


    body.appendChild(newCanvas);
    CanvasAngleRot = newCanvas;
    ctxAngleRot = CanvasAngleRot.getContext("2d");
    } else {
    var newCanvas = document.createElement('canvas');
    newCanvas.id = "canvas";
    newCanvas.width = CanvasWidth;
    newCanvas.height = CanvasHeight;
    newCanvas.style.height = CanvasHeight + 'px';
    newCanvas.style.width = CanvasWidth + 'px';
    newCanvas.style.zIndex = CanvasPosition + "px";
    newCanvas.style.position = "absolute";
    newCanvas.style.left = 10+ "px";
    newCanvas.style.top = CanvasPositionTop + "px";
    newCanvas.style.border = "2px solid";
    newCanvas.style.background = "#fff";


    body.appendChild(newCanvas);
    Canvas = newCanvas;
    ctx = Canvas.getContext("2d");
    
    var newCanvas = document.createElement('canvas');
    newCanvas.id = "canvas";
    newCanvas.width = CanvasWidth;
    newCanvas.height = CanvasHeight;
    newCanvas.style.height = CanvasHeight + 'px';
    newCanvas.style.width = CanvasWidth + 'px';
    newCanvas.style.zIndex = CanvasPosition  + "px";
    newCanvas.style.position = "absolute";
    newCanvas.style.left = 10+ "px";
    newCanvas.style.top = CanvasPositionTop +10 + window_size + "px";
    newCanvas.style.border = "2px solid";
    newCanvas.style.background = "#fff";


    body.appendChild(newCanvas);
    CanvasAngleBG = newCanvas;
    ctxAngleBG = CanvasAngleBG.getContext("2d");
    
    var newCanvas = document.createElement('canvas');
    newCanvas.id = "canvas";
    newCanvas.width = CanvasWidth;
    newCanvas.height = CanvasHeight;
    newCanvas.style.height = CanvasHeight + 'px';
    newCanvas.style.width = CanvasWidth + 'px';
    newCanvas.style.zIndex = CanvasPosition  + "px";
    newCanvas.style.position = "absolute";
    newCanvas.style.left = 10+ "px";
    newCanvas.style.top = CanvasPositionTop + 10 + window_size + "px";
    newCanvas.style.border = "2px solid";


    body.appendChild(newCanvas);
    CanvasAngle = newCanvas;
    ctxAngle = CanvasAngle.getContext("2d");
    
    var newCanvas = document.createElement('canvas');
    newCanvas.id = "canvas";
    newCanvas.width = CanvasWidth;
    newCanvas.height = CanvasHeight;
    newCanvas.style.height = CanvasHeight + 'px';
    newCanvas.style.width = CanvasWidth + 'px';
    newCanvas.style.zIndex = CanvasPosition  + "px";
    newCanvas.style.position = "absolute";
    newCanvas.style.left = 10+ "px";
    newCanvas.style.top = CanvasPositionTop + 20 + 2*window_size + "px";
    newCanvas.style.border = "2px solid";
    newCanvas.style.background = "#fff";


    body.appendChild(newCanvas);
    CanvasAngleRotBG = newCanvas;
    ctxAngleRotBG = CanvasAngleRotBG.getContext("2d");
    
    var newCanvas = document.createElement('canvas');
    newCanvas.id = "canvas";
    newCanvas.width = CanvasWidth;
    newCanvas.height = CanvasHeight;
    newCanvas.style.height = CanvasHeight + 'px';
    newCanvas.style.width = CanvasWidth + 'px';
    newCanvas.style.zIndex = CanvasPosition  + "px";
    newCanvas.style.position = "absolute";
    newCanvas.style.left = 10+ "px";
    newCanvas.style.top = CanvasPositionTop + 20 + 2*window_size + "px";
    newCanvas.style.border = "2px solid";


    body.appendChild(newCanvas);
    CanvasAngleRot = newCanvas;
    ctxAngleRot = CanvasAngleRot.getContext("2d");    
    }
}

function clear_canvas(){
    ctx.clearRect(0,0,Canvas.height,Canvas.width);
    DrawCube();
}

function DrawCube(){

DrawLine(StartingPoint,StartingPoint,el,0,2,"#000", false)
DrawLine(StartingPoint,StartingPoint,0,el,2,"#000", false)

DrawLine(StartingPoint + el,StartingPoint,0,el,2,"#000", false)
DrawLine(StartingPoint + el,StartingPoint,0.5 * el,0.5 * el,2,"#000", false)

DrawLine(StartingPoint,StartingPoint + el,el,0,2,"#000", false)
DrawLine(StartingPoint,StartingPoint + el,0.5 * el,0.5 * el,2,"#000", false)

DrawLine(StartingPoint,StartingPoint,14 * el/20,14 * el/20,2,"#000", true)
DrawLine(StartingPoint + el,StartingPoint + el,0.5 * el,0.5 * el,2,"#000", false)

DrawLine(StartingPoint + 0.5*el,StartingPoint + 0.1*el,0,14*el/10,2,"#000", true)
DrawLine(StartingPoint + 0.1*el,StartingPoint + 0.5*el,14*el/10,0,2,"#000", true)
DrawLine(StartingPoint + 1.5*el,StartingPoint + 0.5*el,0,el,2,"#000", false)
DrawLine(StartingPoint + 0.5*el,StartingPoint + 1.5*el,el,0,2,"#000", false)

/*ctx.font = "12px Arial";
ctx.fillText('x',StartingPoint + el/10,CanvasHeight-StartingPoint - el/5);
ctx.fillText('y',StartingPoint + 14*el/10,CanvasHeight-StartingPoint - 6*el/10);
ctx.fillText('z',el/10,el/10); */

}



function DrawLine(start_x, start_y, length_x, length_y, width, color, dashed){
    
    
    to_x = start_x + length_x;
    to_y = CanvasHeight - start_y - length_y;
    
    ctx.lineWidth = width;
    ctx.strokeStyle = color;
    ctx.beginPath();
    if(dashed){ctx.setLineDash([5,5]);}else{ctx.setLineDash([]);}
    
    ctx.moveTo(start_x, CanvasHeight - start_y);
    ctx.lineTo(to_x, to_y);
    ctx.stroke();
    
    if(arrow){
        DrawArrow(ctx, [start_x,CanvasWidth-start_y], [to_x,to_y],10,color);
    }
}

function DrawLineAngle(length_x, length_y, width, color, dashed){
    

    start_x = CanvasWidth/4;
    start_y = CanvasHeight/3;
    
    to_x = start_x + length_x;
    to_y = CanvasHeight - start_y - length_y;

    ctxAngle.lineWidth = width;
    ctxAngle.strokeStyle = color;
    ctxAngle.beginPath();

    ctxAngle.moveTo(start_x, CanvasWidth - start_y);
    ctxAngle.lineTo(to_x, to_y);
    ctxAngle.stroke();
    
    //DrawArrow(ctxAngle, [start_x,start_y] , [to_x,to_y],10,color);
    
}

function DrawLineAngleRot(length_x, length_y, width, color, dashed){
    

    start_x = CanvasWidth/4;
    start_y = CanvasHeight/3;
    
    to_x = start_x + length_x;
    to_y = CanvasHeight - start_y - length_y;
    
    ctxAngleRot.lineWidth = width;
    ctxAngleRot.strokeStyle = color;
    ctxAngleRot.beginPath();

    ctxAngleRot.moveTo(start_x, CanvasWidth - start_y);
    ctxAngleRot.lineTo(to_x, to_y);
    ctxAngleRot.stroke();
    
    //DrawArrow(ctxAngle, [start_x,start_y] , [to_x,to_y],10,color);
    
}

function DrawArrow(ctx,p1,p2,size,color){
      ctx.save();

      
      var dx = p2[0]-p1[0], dy=p2[1]-p1[1];
      ctx.translate(p2[0],p2[1]);
      ctx.rotate(Math.atan2(dy,dx));

      
      ctx.strokeStyle = color;
      ctx.beginPath();
      ctx.moveTo(0,0);
      ctx.lineTo(-size,-size/3);
      ctx.lineTo(-size, size/3);
      ctx.closePath();
      ctx.stroke();

      ctx.restore();
}

function draw(type, number, cube_nr){
    var x,y,z,color;
    if(type=="orange"){
        color = "#fa0";
        orange_type = number;
        clear_canvas();
        draw_orange(1, color, cube_nr);
    } else {    
        if(type=="nd"){
            x = document.getElementById("nd_x").value;
            y = document.getElementById("nd_y").value;
            z = document.getElementById("nd_z").value;
            color = nd_color;
        }
        if(type=="ld"){
            x = document.getElementById("ld_x").value;
            y = document.getElementById("ld_y").value;
            z = document.getElementById("ld_z").value;
            color = ld_color;
        }
        if(type=="td"){
            x = document.getElementById("td_x").value;
            y = document.getElementById("td_y").value;
            z = document.getElementById("td_z").value;
            color = td_color;
        }
        draw_plane(x,y,z,color);
    }
}

function draw_orange(type,color,caption) {
    switch(orange_type){
        case 1:    
            DrawLine(origin, origin, el/2,-el/2, 3, color,false);
            DrawLine(origin, origin, 0,el, 3, color,false);
            DrawLine(origin, origin+el, el/2,-el/2, 3, color,false);
            DrawLine(origin+el/2, origin-el/2,0, el, 3, color,false);
        break;    
        case 2:    
            DrawLine(origin-el/2, origin-el/2, 3*el/2,el/2, 3, color,false);
            DrawLine(origin+el, origin, 0,el, 3, color,false);
            DrawLine(origin+el, origin+el, -3*el/2,-el/2, 3, color,false);
            DrawLine(origin-el/2, origin+el/2,0, -el, 3, color,false);
        break;   
        case 3:    
            DrawLine(origin-el/2, origin-el/2, el,0, 3, color,false);
            DrawLine(origin+el/2, origin-el/2, el/2,3*el/2, 3, color,false);
            DrawLine(origin+el, origin+el, -el,0, 3, color,false);
            DrawLine(origin, origin+el,-el/2, -3*el/2, 3, color,false);
        break;   
        case 4:    
            DrawLine(origin, origin, el, 0, 3, color,false);
            DrawLine(origin + el, origin, -el/2,el/2, 3, color,false);
            DrawLine(origin + el/2, origin+el/2, -el, 0, 3, color,false);
            DrawLine(origin-el/2, origin+el/2,el/2, -el/2, 3, color,false);
        break;   
        case 5:    
            DrawLine(origin, origin, -el/2,-el/2, 3, color,false);
            DrawLine(origin-el/2, origin-el/2, el, el, 3, color,false);
            DrawLine(origin+el/2, origin+el/2, el/2,el/2, 3, color,false);
            DrawLine(origin+el, origin-el,-el, -el, 3, color,false);
        break;   
        case 6:    
            DrawLine(origin-el/2, origin+el/2, el,-el, 3, color,false);
            DrawLine(origin+el/2, origin-el/2, el/2,el/2, 3, color,false);
            DrawLine(origin+el, origin, -el,el, 3, color,false);
            DrawLine(origin, origin+el,-el/2, -el/2, 3, color,false);
        break;
    }
    ctx.font = fontSize + "px Arial";
    ctx.fillText('Cube type: ' + caption,el/10,el/10);
}

function draw_plane(x,y,z,color){
    if(y!=0){ 
        if(z!=0){
            DrawLine(origin+el/y,origin,-el/y,el/z,3,color,false);
            if(color==nd_color){
                DrawLine(origin+el/y,origin,dashed_length*dashed_length**dashed_length*el/y,-dashed_length*dashed_length**dashed_length*el/z,dashed_width,color,true); 
                DrawLine(origin,origin+el/z,-dashed_length*dashed_length**dashed_length*el/y,dashed_length*dashed_length**dashed_length*el/z,dashed_width,color,true);
            }
            if(x!=0){
                DrawLine(origin,origin + el/z, -el/(2*x),-el/z - el/(2*x),3,color,false);
                if(color == nd_color){
                    DrawLine(origin,origin + el/z, dashed_length*dashed_length**dashed_length*el/(2*x),dashed_length*dashed_length**dashed_length*el/z + dashed_length*dashed_length**dashed_length*el/(2*x),dashed_width,color,true);
                    DrawLine(origin-el/(2*x),origin - el/(2*x), -dashed_length*dashed_length**dashed_length*el/(2*x),-dashed_length*dashed_length**dashed_length*el/z - dashed_length*dashed_length**dashed_length*el/(2*x),dashed_width,color,true);
                }          
                DrawLine(origin-el/(2*x),origin-el/(2*x), el/y +el/(2*x), el/(2*x),3,color,false);
                if(color == nd_color){
                    DrawLine(origin-el/(2*x),origin-el/(2*x), -dashed_length*dashed_length**dashed_length*el/y -dashed_length*dashed_length**dashed_length*el/(2*x), -dashed_length*dashed_length**dashed_length*el/(2*x),dashed_width,color,true);
                    DrawLine(origin+el/y,origin, dashed_length*dashed_length**dashed_length*el/y +dashed_length*dashed_length**dashed_length*el/(2*x), dashed_length*dashed_length**dashed_length*el/(2*x),dashed_width,color,true);
                }
            } else {
                DrawLine(origin,origin + el/z, -el/(2),-el/(2),3,color,false); 
                DrawLine(origin-el/2,origin - el/2 + el/z,el/y, -el/z,3,color,false);  
                DrawLine(origin-el/2+ el/y,origin-el/2 , el/2, el/2,3,color,false); 
            }
        } else {
            DrawLine(origin+el/y,origin,0,el,3,color,false);
            if(x!=0){
                DrawLine(origin+el/y,origin,-el/y - el/(2*x),-el/(2*x),3,color,false);    
                DrawLine(origin-el/(2*x),origin -el/(2*x), 0,el ,3,color,false);
                DrawLine(origin-el/(2*x),origin + el -el/(2*x),el/y + el/(2*x),+el/(2*x),3,color,false);
            } else {
                DrawLine(origin+el/y,origin, -el/(2),-el/(2),3,color,false);    
                DrawLine(origin+el/y-el/(2),origin -el/(2), 0,el ,3,color,false);
                DrawLine(origin+el/y-el/(2),origin + el -el/(2),el/(2),+el/(2),3,color,false);
            }
        }        
    } else {
        if(z!=0){
            DrawLine(origin+el,origin+el/z,-el,0,3,color,false);    
            if(x!=0){
                DrawLine(origin,origin + el/z, -el/(2*x),-el/z - el/(2*x),3,color,false); 
                DrawLine(origin-el/(2*x),origin-el/(2*x) , el, 0,3,color,false); 
                DrawLine(origin-el/(2*x)+el,origin-el/(2*x), el/(2*x), el/(2*x) + el/z,3,color,false); 
            } else {
                DrawLine(origin,origin + el/z, -el/(2),-el/(2),3,color,false); 
                DrawLine(origin-el/2,origin - el/2 + el/z,el, 0,3,color,false);  
                DrawLine(origin-el/2+ el,origin-el/2 + el/z, el/2, el/2,3,color,false); 
            }
        } else {    
            DrawLine(origin-el/(2*x),origin-el/(2*x), 0,el ,3,color,false);
            if(x!=0){
                DrawLine(origin-el/(2*x),origin-el/(2*x),el,0,3,color,false);    
                DrawLine(origin-el/(2*x) + el, origin-el/(2*x), 0,el ,3,color,false);
                DrawLine(origin-el/(2*x) + el, origin-el/(2*x)+ el, -el,0,3,color,false);
            } else {
                alert("Nanana.. irgendwas muss nicht 0 sein!!");
            }
        }           
    }
}

function intersect(){
    diff_a = (a - parseFloat(document.getElementById("nd_x").value));
    diff_b = (b - parseFloat(document.getElementById("nd_y").value));
    diff_c = (c - parseFloat(document.getElementById("nd_z").value));
    
    if(diff_a>1 || diff_a<-1) {;
        a = parseFloat(document.getElementById("nd_x").value);
    }
    if(diff_b>1 || diff_b<-1) {;
        b = parseFloat(document.getElementById("nd_y").value);
    }
    if(diff_c>1 || diff_c<-1) {;
        c = parseFloat(document.getElementById("nd_z").value);
    }
    
    
    if(orange_type == 1) { intersect_type_1(a,b,c); }
    if(orange_type == 2) { intersect_type_2(a,b,c); }
    if(orange_type == 3) { intersect_type_3(a,b,c); }
    if(orange_type == 4) { intersect_type_4(a,b,c); }
    if(orange_type == 5) { intersect_type_5(a,b,c); }
    if(orange_type == 6) { intersect_type_6(a,b,c); }
    
    draw_arrow(line_point,line_dir, '#0a0');

    
    line_point_approx = [,,];
    line_dir_approx = [,,];
    for(i=0;i<=2;i++){
        line_point_approx[i] = Math.round(line_point[i]*100)/100;
        line_dir_approx[i] = Math.round(line_dir[i]*100)/100;
    }
    document.getElementById("line_equation").innerHTML="(x,y,z) = (" + line_point_approx + ") + u * (" + line_dir_approx + ")";

}

function draw_arrow(v,r,color){
    arrow=true;
    DrawLine(origin - el*v[0]/2 + el*v[1], origin - el*v[0]/2 + el*v[2],el*(r[1]-r[0]/2),el*(r[2]-r[0]/2),3,color,false);
    arrow=false;
}

function intersect_type_1(){

    if(a!=0){ 
        if(b!=0){
            if(c!=0){
                line_point = [0,0,1/c];
                line_dir = [1/b,1/b,(-1/c - a/(b*c))];
                //scaling
                for(i=0;i<=2;i++){
                    line_dir[i]*=(b/(a+b));
                } 
            } else {
                line_point = [(1-b/(a+b))/a,1/(a+b),0];
                line_dir = [0,0,1];
            }
        } else {
            if(c!=0){
                line_point = [1/a,1/a,0];
                line_dir = [-1/a,-1/a,1/c];
            } else {
                line_point = [1/a,1/a,0];
                line_dir = [0,0,1];
            }
        }        
    } else {
        if(b!=0){            
            if(c!=0){
                line_point = [1/b,1/b,0];
                line_dir = [-1/b,-1/b,1/c];
            } else {
                line_point = [1/b,1/b,0];
                line_dir = [0,0,1];
            }
        } else {    
            if(c!=0){
                line_point = [0,0,1/c];
                line_dir = [1,1,0];
            } else {
                alert("Nanana.. irgendwas muss nicht 0 sein!!");
            }
        }           
    }
}


function intersect_type_2(){

    if(a!=0){ 
        if(b!=0){
            if(c!=0){
                line_point = [1,0,(1-a)/c];
                line_dir = [-1/b,1/b,(-1/c + a/(b*c))];
     
                //scaling
                for(i=0;i<=2;i++){
                    //line_dir[i]*=(b/(a+b));
                } 
            } else {
                line_point = [(1/a)*(1-((b-a*b)/(b-a))),(1-a)/(b-a),0];
                line_dir = [0,0,1];
            }
        } else {
            if(c!=0){
                line_point = [1/a,1-1/a,0];
                line_dir = [-1/a,1/a,1/c];
            } else {
                line_point = [1/a,1-1/a,0];
                line_dir = [0,0,1];
            }
        }        
    } else {
        if(b!=0){            
            if(c!=0){
                line_point = [1-1/b,1/b,0];
                line_dir = [1/b,-1/b,1/c];
           } else {
                line_point = [1-1/b,1/b,0];
                line_dir = [0,0,1];
            }
        } else {    
            if(c!=0){
                line_point = [0,1,1/c];
                line_dir = [1,-1,0];
            } else {
                alert("Nanana.. irgendwas muss nicht 0 sein!!");
            }
        }           
    }
}


function intersect_type_3(){

    if(a!=0){ 
        if(b!=0){
            if(c!=0){
                line_point = [1/a - (1-a)*c/(a*c-a*a),0,(1-a)/(c-a)];
                line_dir = [-1/a + c/(a*c-a*a),1/b,-1/(c - a)];
                var norm_2=0;
                for(i=0;i<=2;i++) { norm_2 += line_dir[i]*line_dir[i] } 
                alert(norm_2);
                for(i=0;i<=2;i++) { line_dir[i] /= Math.sqrt(norm_2) } 
            } else {
                line_point = [1/a,0,1-1/a];
                line_dir = [-1/a,1/b,1/a];
            }
        } else {
            if(c!=0){
                line_point = [1/a*(1-((c*(a-1))/(-c+a))),0,(a-1)/(-c+a)];
                line_dir =[0,1,0];
            } else {
                line_point = [1/a,0,1-1/a];
                line_dir = [0,1,0];
            }
        }        
    } else {
        if(b!=0){            
            if(c!=0){
                line_point = [1,1/b,0];
                line_dir = [-1/c,-1/b,1/c];
            } else {
                line_point = [1,1/b,0];
                line_dir = [-1,0,1];
            }
        } else {    
            if(c!=0){
                line_point = [1-1/c,0,1/c];
                line_dir = [0,1,0];
            } else {
                alert("Nanana.. irgendwas muss nicht 0 sein!!");
            }
        }           
    }
}



function intersect_type_4(){

    if(a!=0){ 
        if(b!=0){
            if(c!=0){
                line_point = [1/a-c/(a*c + a*a),0,1/(c+a)];
                line_dir = [-1/a+c/(a*c + a*a),1/b,-1/(a+c)];
           } else {
                line_point = [1/a,0,1/a];
                line_dir = [-1/a,1/b,-1/a]; 
            }
        } else {
            if(c!=0){
                line_point = [1/a*(1-(c/(c+a))),0,1/(c+a)];
                line_dir =[0,1,0];
            } else {
                line_point = [1/a,0,1/a];
                line_dir = [0,1,0];
            }
        }        
    } else {
        if(b!=0){            
            if(c!=0){
                line_point = [0,1/b,0];
                line_dir = [1/c,-1/b,1/c];
            } else {
                line_point = [0,1/b,0];
                line_dir = [1,0,1];
            }
        } else {    
            if(c!=0){
                line_point = [1/c,0,1/c];
                line_dir = [0,1,0];
            } else {
                alert("Nanana.. irgendwas muss nicht 0 sein!!");
            }
        }           
    }
}



function intersect_type_5(){

    if(a!=0){ 
        if(b!=0){
            if(c!=0){
                line_point = [1/a,0,0];
                line_dir = [1/a-c/(a*b),1/b,1/b];

               
                //scaling
                for(i=0;i<=2;i++){
                    //line_dir[i]*=(b/(a+b));
                } 
            } else {
                line_point = [1/a,0,0];
                line_dir = [-1/a,1/b,1/b];
            }
        } else {
            if(c!=0){
                line_point = [1/a,0,0];
                line_dir = [-1/a,1/c,1/c];
            } else {
                line_point = [1/a,0,0];
                line_dir = [0,1,1];
            }
        }        
    } else {
        if(b!=0){            
            if(c!=0){
                line_point = [0,1/b*(1-(c/(c+b))),1/(b+c)];
                line_dir = [1,0,0];
            } else {
                line_point = [0,1/b,1/b];
                line_dir = [1,0,0];
            }
        } else {    
            if(c!=0){
                line_point = [0,1/c,1/c];
                line_dir = [1,0,0];
            } else {
                alert("Nanana.. irgendwas muss nicht 0 sein!!");
            }
        }           
    }
}



function intersect_type_6(){

    if(a!=0){ 
        if(b!=0){
            if(c!=0){
                line_point = [(1-c)/a,0,1];
                line_dir = [-1/a + c/(a*b), 1/b, -1/b];
                
                //scaling
                for(i=0;i<=2;i++){
                    //line_dir[i]*=(b/(a+b));
                } 
            } else {
                line_point = [1/a,0,1];
                line_dir = [-1/a,1/b,-1/b];
            }
        } else {
            if(c!=0){
                line_point = [1/a,1,0];
                line_dir = [-1/a,-1/c,1/c];
            } else {
                line_point = [1/a,1,0];
                line_dir = [0,-1,1];
            }
        }        
    } else {
        if(b!=0){            
            if(c!=0){
                line_point = [0,1/b*(1-((c*(b-1))/(b-c))),(b-1)/(b-c)];
                line_dir = [1,0,0];

            } else {
                line_point = [0,1/b,1-1/b];
                line_dir = [1,0,0];
            }
        } else { 
            if(c!=0){
                line_point = [0,1-1/c,1/c];
                line_dir = [1,0,0];
            } else {
                alert("Nanana.. irgendwas muss nicht 0 sein!!");
            }
        }           
    }
}



function angle(){

    diff_e = e-parseInt(document.getElementById("ld_x").value);
    diff_f = f-parseInt(document.getElementById("ld_y").value);
    diff_g = g-parseInt(document.getElementById("ld_z").value);

    if(diff_e > 1 || diff_e<-1) { e = parseInt(document.getElementById("ld_x").value); }
    if(diff_f > 1 || diff_e<-1) { f = parseInt(document.getElementById("ld_y").value); }
    if(diff_g > 1 || diff_e<-1) { g = parseInt(document.getElementById("ld_z").value); }
    
    normal_vector = [e,f,g];
    color='#aa0';
    
    //document.getElementById("normal_vector").innerHTML="normal vector to ld-plane: (" + normal_vector + ")";
    
    norm_dir = parseInt(0);
    for(i=0;i<=2;i++){norm_dir+=line_dir[i] * line_dir[i];}
    
    for(i=0;i<=2;i++){
        normal_vector[i]/=Math.sqrt(e*e+f*f+g*g);
        line_dir[i]/=Math.sqrt(norm_dir);    
    }
    

    
    arrow=true;
    draw_arrow([0,0,0],normal_vector, '#00a')
    arrow=false;
    

    
    
    ctxAngle.clearRect(0,0,CanvasHeight,CanvasWidth);
    ctxAngleRot.clearRect(0,0,CanvasHeight,CanvasWidth);
    

    num = 0;
    den = 0;
    for(i=0;i<=2;i++) {
        num+=line_dir[i] * normal_vector[i];
    }
    x_komisch = num;
    num *= num;
    
    den=1-num;
    
    x2 = num/den;
    sign = 1;
    if(compute_angle(normal_vector, line_dir)>=90) {sign = -1;}
    x = sign*Math.sqrt(x2);
    norm_x = Math.sqrt(1+x*x);
    
    angle_approx = Math.round(compute_angle(normal_vector, line_dir)*100)/100;
    angle_approx_neg = Math.round((180-compute_angle(normal_vector, line_dir))*100)/100;
    
    
    
    DrawLineAngle(0,el,3,'#0a0',false);
    DrawLineAngle(el/norm_x,x*el/norm_x,3,'#0a0',false);
    
    DrawLineAngleRot(0,el,3,'#0a0',false);
    DrawLineAngleRot(el/norm_x,-x*el/norm_x,3,'#0a0',false);    
    

    
  /*  ctxAngle.beginPath();
    ctxAngle.arc(CanvasWidth/5, CanvasHeight*9/10, el/3, Math.PI/180*(360-compute_angle(normal_vector, line_dir)),true)
    ctxAngle.stroke(); */
    ctxAngle.font = "30px Arial";
    ctxAngle.fillText(angle_approx + '˚',el/10,CanvasHeight*29/30);
    
    ctxAngleRot.font = "30px Arial";
    ctxAngleRot.fillText(Math.round(100*(180-compute_angle(normal_vector, line_dir)))/100 + '˚',el/10,CanvasHeight*29/30);
    


    document.getElementById("angle").innerHTML=angle_approx + "  or " + angle_approx_neg;
}

function compute_angle(v,w){
    num = 0;
    den = 1;
    norm_v=0;
    norm_w=0;
    for(i=0;i<=2;i++){
        num += v[i]*w[i];
        norm_v+=v[i]*v[i];
        norm_w+=w[i]*w[i];
    }
    den=Math.sqrt(norm_v*norm_w)
    result = 180*Math.acos(num/den)/Math.PI;
    return result;
}

function handleImage(e){
    dpr=1;
    let reader = new FileReader();
    reader.onload = function(event){
        let img = new Image();
        img.onload = function(){
            let ratio = CanvasHeight/img.height;
            let height_img = img.height*ratio;
            let width_img = img.width*ratio;
            ctxAngleBG.drawImage(img,0,0,CanvasWidth,CanvasHeight);
            ctxAngleRotBG.drawImage(img,0,0,CanvasWidth,CanvasHeight);
        }
        img.src = event.target.result;
    }
    reader.readAsDataURL(e.target.files[0]);
    input.value = null;
}

function compute_schmid(type){
    float_dir_1 = [
        [ , , ],
        [ , , ],
        [ , , ],
        [ , , ],
        [ , , ],
        [ , , ],
    ];    
    float_dir_2 = [
        [ , , ],
        [ , , ],
        [ , , ],
        [ , , ],
        [ , , ],
        [ , , ],
    ];
    float_dir_3 = [
        [ , , ],
        [ , , ],
        [ , , ],
        [ , , ],
        [ , , ],
        [ , , ],
    ];
    float_dir_4 = [
        [ , , ],
        [ , , ],
        [ , , ],
        [ , , ],
        [ , , ],
        [ , , ],
    ];
    normal_vector_float = [
        [ , , ],
        [ , , ],
        [ , , ],
        [ , , ],
        [ , , ],
        [ , , ],
    ]    
    ;
    normal_vector_float_computed = [ , , ];
    
    

    float_dir_1[0] = [1,1,-1];    
    float_dir_3[0] = [1,1,1];
    for(i=0;i<=2;i++){
        float_dir_2[0][i] = -float_dir_1[0][i];
        float_dir_4[0][i] = -float_dir_3[0][i];
    }
    normal_vector_float[0] = [1,-1,0]; 
    
    float_dir_1[1] = [-1,1,1];    
    float_dir_3[1] = [-1,1,-1];
    for(i=0;i<=2;i++){
        float_dir_2[1][i] = -float_dir_1[1][i];
        float_dir_4[1][i] = -float_dir_3[1][i];
    }
    normal_vector_float[1] = [1,1,0]; 
    
    float_dir_1[2] = [-1,1,1];    
    float_dir_3[2] = [1,1,-1];
    for(i=0;i<=2;i++){
        float_dir_2[2][i] = -float_dir_1[2][i];
        float_dir_4[2][i] = -float_dir_3[2][i];
    }
    normal_vector_float[2] = [1,0,1]; 
    
    float_dir_1[3] = [1,1,1];    
    float_dir_3[3] = [-1,1,-1];
    for(i=0;i<=2;i++){
        float_dir_2[3][i] = -float_dir_1[3][i];
        float_dir_4[3][i] = -float_dir_3[3][i];
    }
    normal_vector_float[3] = [1,0,-1];  
    
    float_dir_1[4] = [-1,1,1];    
    float_dir_3[4] = [1,1,1];
    for(i=0;i<=2;i++){
        float_dir_2[4][i] = -float_dir_1[4][i];
        float_dir_4[4][i] = -float_dir_3[4][i];
    }
    normal_vector_float[4] = [0,-1,1]; 
    
    float_dir_1[5] = [-1,-1,1];    
    float_dir_3[5] = [-1,1,-1];
    for(i=0;i<=2;i++){
        float_dir_2[5][i] = -float_dir_1[5][i];
        float_dir_4[5][i] = -float_dir_3[5][i];
    }
    normal_vector_float[5] = [0,-1,-1]; 

    normal_vector=[,,];
    
    if(type == "nd") {normal_vector = normal_vector_nd}
    if(type == "ld") {normal_vector = normal_vector_ld}
    if(type == "td") {normal_vector = normal_vector_td}
 
    var phi = [];
    for(q=0;q<=5;q++){
        phi[q] = Math.PI*compute_angle(normal_vector, normal_vector_float[q])/180;
    }
    var alpha = [
        [,,,],
        [,,,],
        [,,,],
        [,,,],
        [,,,],
        [,,,],
    ];
    for(q=0;q<=5;q++){    
        alpha[q][0] = Math.PI*compute_angle(float_dir_1[q],normal_vector)/180;
        alpha[q][1] = Math.PI*compute_angle(float_dir_2[q],normal_vector)/180;
        alpha[q][2] = Math.PI*compute_angle(float_dir_3[q],normal_vector)/180;
        alpha[q][3] = Math.PI*compute_angle(float_dir_4[q],normal_vector)/180;
       
    }
    
    ot = orange_type-1;
    
    for(p=1;p<=4;p++){
        for(q=1;q<=6;q++){ 
            schmid[q-1][p-1] = Math.round(100*Math.cos(phi[q-1]) * Math.cos(alpha[q-1][p-1]))/100;
            schmid_id = 'w'+q+'f'+p;
            document.getElementById(schmid_id).innerHTML = schmid[q-1][p-1];
        }
    }
    
    
/*    document.getElementById('schmid_1').innerHTML = schmid[orange_type][0];
    document.getElementById('schmid_2').innerHTML = schmid[orange_type][1];
    document.getElementById('schmid_3').innerHTML = schmid[orange_type][2];
    document.getElementById('schmid_4').innerHTML = schmid[orange_type][3];
    
    draw_arrow([0.5,0.5,0.5],normal_vector_float,'#000')
    start = [0.5 + float_dir_2[0]/2,0.5 + float_dir_2[1]/2,0.5 + float_dir_2[2]/2];
    draw_arrow(start,float_dir_1,'#fa0')
    start = [0.5 + float_dir_4[0]/2,0.5 + float_dir_4[1]/2,0.5 + float_dir_4[2]/2];
    draw_arrow(start,float_dir_3,'#fa0') */
}


function compute_planes() {
    angles = [ , , ]
    angles[0] = Math.PI*parseFloat(document.getElementById('angle_1').value)/180;
    angles[1] = Math.PI*parseFloat(document.getElementById('angle_2').value)/180;
    angles[2] = Math.PI*parseFloat(document.getElementById('angle_3').value)/180;
    
   

        
    matrix = [
        [Math.cos(angles[0])*Math.cos(angles[2]) - Math.sin(angles[0])*Math.sin(angles[2])*Math.cos(angles[1]),Math.sin(angles[0])*Math.cos(angles[2]) + Math.cos(angles[0])*Math.sin(angles[2])*Math.cos(angles[1]), Math.sin(angles[2])*Math.sin(angles[1])],
        [-Math.cos(angles[0])*Math.sin(angles[2]) - Math.sin(angles[0])*Math.cos(angles[2])*Math.cos(angles[1]),-Math.sin(angles[0])*Math.sin(angles[2]) + Math.cos(angles[0])*Math.cos(angles[2])*Math.cos(angles[1]), Math.cos(angles[2])*Math.sin(angles[1])],
        [Math.sin(angles[0])*Math.sin(angles[1]), -Math.cos(angles[0])*Math.sin(angles[1]), Math.cos(angles[1])]
    ] 
    
    a = 10*matrix[0][0];
    b = 10*matrix[0][1];
    c = 10*matrix[0][2];
    e = 10*matrix[1][0];
    f = 10*matrix[1][1];
    g = 10*matrix[1][2];
    h = 10*matrix[2][0];
    i = 10*matrix[2][1];
    j = 10*matrix[2][2];
    
    normal_vector_td= [a,b,c];
    normal_vector_ld= [e,f,g];
    normal_vector_nd= [h,i,j];
    
    document.getElementById("td_x").value = Math.round(100*matrix[2][0])/10;
    document.getElementById("td_y").value = Math.round(100*matrix[2][1])/10;
    document.getElementById("td_z").value = Math.round(100*matrix[2][2])/10;
    
    document.getElementById("ld_x").value = Math.round(100*matrix[1][0])/10;
    document.getElementById("ld_y").value = Math.round(100*matrix[1][1])/10;
    document.getElementById("ld_z").value = Math.round(100*matrix[1][2])/10;
    
    document.getElementById("nd_x").value = Math.round(100*matrix[0][0])/10;
    document.getElementById("nd_y").value = Math.round(100*matrix[0][1])/10;
    document.getElementById("nd_z").value = Math.round(100*matrix[0][2])/10;
    

                    
    //alert(matrix[0] + "\r\n" + matrix[1] + "\r\n" + matrix[2]);
    
}  

function download_csv(){
    angles = [ , , ]
    angles[0] = parseFloat(document.getElementById('angle_1').value);
    angles[1] = parseFloat(document.getElementById('angle_2').value);
    angles[2] = parseFloat(document.getElementById('angle_3').value);

    var name = 'euler_angles:' + angles[0] + ';' + angles[1] + ';' + angles[2];
    let csvContent = "data:text/csv;charset=utf-8";
    
    var text;
    
    text=', ,[110], [-110],[101],[-101],[011],[0-10]\r\n';
    text+='[-1 1 1], ' + schmid[1][0] + ', -, ' + schmid[2][0] + ',-,-,' + schmid[4][0] + '\r\n';
    text+='[1 -1 -1],' + schmid[1][1] + ',-,' + schmid[2][1] + ',-,-,' + schmid[4][1] + '\r\n';
    text+='[-1 1 -1],' + schmid[1][2] + ',-,' + schmid[2][2] + ',-,-,' + schmid[4][2] + '\r\n';
    text+='[1 -1 1],' + schmid[1][3] + ',-,' + schmid[2][3] + ',-,-,' + schmid[4][3] + '\r\n';
    text+='[1 1 -1],-,' + schmid[0][0] + ',-,' + schmid[3][0] + ',' + schmid[5][0] +  ',-' + '\r\n';
    text+='[-1 -1 1],-,' + schmid[0][1] + ',-,' + schmid[3][1] + ',' + schmid[5][1] +  ',-' + '\r\n';
    text+='[1 1 1],-,' + schmid[0][2] + ',-,' + schmid[3][2] + ',' + schmid[5][2] +  ',-' + '\r\n';
    text+='[-1 -1 -1],-,' + schmid[0][3] + ',-,' + schmid[3][3] + ',' + schmid[5][3] +  ',-' + '\r\n';
    
    csvContent+=text;
    
    var encodedUri = encodeURI(csvContent);
    var link = document.createElement("a");
    link.setAttribute("href", encodedUri);
    link.setAttribute("download", "schmid_factors;" + name + ".csv");
    document.body.appendChild(link); 
    link.click();
}

</script><canvas id="canvas" style="height: 670px; width: 670px; position: absolute; left: 400px; border: 2px solid; background: rgb(255, 255, 255);" width="670" height="670"></canvas><canvas id="canvas" style="height: 670px; width: 670px; position: absolute; left: 1080px; border: 2px solid; background: rgb(255, 255, 255);" width="670" height="670"></canvas><canvas id="canvas" style="height: 670px; width: 670px; position: absolute; left: 1080px; border: 2px solid;" width="670" height="670"></canvas><canvas id="canvas" style="height: 670px; width: 670px; position: absolute; left: 1760px; border: 2px solid; background: rgb(255, 255, 255);" width="670" height="670"></canvas><canvas id="canvas" style="height: 670px; width: 670px; position: absolute; left: 1760px; border: 2px solid;" width="670" height="670"></canvas>





Orange Ebene:<br>

<input type="button" style="width:5em" value="(110)" onclick="draw('orange',2,this.value)">
<input type="button" style="width:5em" value="(-110)" onclick="draw('orange',1,this.value)">
<input type="button" style="width:5em" value="(101)" onclick="draw('orange',3,this.value)"><br>
<input type="button" style="width:5em" value="(-101)" onclick="draw('orange',4,this.value)">
<input type="button" style="width:5em" value="(011)" onclick="draw('orange',6,this.value)">
<input type="button" style="width:5em" value="(0-11)" onclick="draw('orange',5,this.value)"><br>

Winkel: 
<input style="width:3em" id="angle_1" value="221"> 
<input style="width:3em" id="angle_2" value="158"> 
<input style="width:3em" id="angle_3" value="18"> 
<input type="button" value="Compute Planes" onclick="compute_planes()"><br>

ND-Ebene (0 0 1): 
<input style="width:4em" id="nd_x" value="-9.1"> 
<input style="width:4em" id="nd_y" value="-4.1"> 
<input style="width:4em" id="nd_z" value="1.2"> 
<input type="button" value="Draw" onclick="draw('nd')"><br>

LD-Ebene (0 1 0): 
<input style="width:4em" id="ld_x" value="-3.5"> 
<input style="width:4em" id="ld_y" value="8.7"> 
<input style="width:4em" id="ld_z" value="3.6"> 
<input type="button" value="Draw" onclick="draw('ld')"><br>

TD-Ebene (1 0 0): 
<input style="width:4em" id="td_x" value="-2.5"> 
<input style="width:4em" id="td_y" value="2.8"> 
<input style="width:4em" id="td_z" value="-9.3"> 
<input type="button" value="Draw" onclick="draw('td')"><br>

<input type="button" onclick="intersect()" value="intersection line of orange and nd:"><br> <span id="line_equation"></span><br>
<input type="button" onclick="angle()" value="compute normal vector and angle"> 

<table>
<tbody><tr>
<td> angle: </td>
<td align="center"><span id="angle"></span></td>
</tr>
</tbody></table>

<input type="file" id="selectedImage" value="Background Image"><br>
<input type="button" onclick="compute_schmid('ld')" value="Compute Schmidfaktor (LD)"><br> 
<input type="button" onclick="compute_schmid('nd')" value="Compute Schmidfaktor (ND)"><br> 
<input type="button" onclick="compute_schmid('td')" value="Compute Schmidfaktor (TD)"><br> 
<!--
Faktor 1: <span id="schmid_1"></span><br/>
Faktor 2: <span id="schmid_2"></span><br/>
Faktor 3: <span id="schmid_3"></span><br/>
Faktor 4: <span id="schmid_4"></span><br/>-->

<style>
table,td {
  border: 1px solid black;
  
}

td {
    width:40px;
    height:2em;
    text-align:center;
}
</style>

<table>
    <tbody><tr>
        <td>
        </td><td> (110)
        </td><td> (<span style="text-decoration:overline">1</span>10)
        </td><td> (101)
        </td><td> (<span style="text-decoration:overline">1</span>01)
        </td><td> (011)
        </td><td> (0<span style="text-decoration:overline">1</span>1) 
    </td></tr>
    <tr>
        <td> [<span style="text-decoration:overline">1</span>11]
        </td><td id="w2f1">
        </td><td> -
        </td><td id="w3f1">
        </td><td> -
        </td><td> -
        </td><td id="w5f1"> 
    </td></tr>
    <tr>
        <td> [1<span style="text-decoration:overline">1</span><span style="text-decoration:overline">1</span>]
        </td><td id="w2f2">
        </td><td> -
        </td><td id="w3f2">
        </td><td> -
        </td><td> -
        </td><td id="w5f2"> 
    </td></tr>
    <tr>
        <td> [<span style="text-decoration:overline">1</span>1<span style="text-decoration:overline">1</span>]
        </td><td id="w2f3">
        </td><td> -
        </td><td id="w3f3">
        </td><td> -
        </td><td> -
        </td><td id="w5f3">     
    </td></tr>
    <tr>
        <td> [1<span style="text-decoration:overline">1</span>1]
        </td><td id="w2f4">
        </td><td> -
        </td><td id="w3f4">
        </td><td> -
        </td><td> -
        </td><td id="w5f4">    
    </td></tr>
    <tr>
        <td> [11<span style="text-decoration:overline">1</span>]
        </td><td> -
        </td><td id="w1f1"> 
        </td><td> -
        </td><td id="w4f1"> 
        </td><td id="w6f1"> 
        </td><td> -
    </td></tr>
    <tr>
        <td> [<span style="text-decoration:overline">1</span><span style="text-decoration:overline">1</span>1]
        </td><td> -
        </td><td id="w1f2"> 
        </td><td> -
        </td><td id="w4f2"> 
        </td><td id="w6f2"> 
        </td><td> -
    </td></tr>
    <tr>
        <td> [111]
        </td><td> -
        </td><td id="w1f3"> 
        </td><td> -
        </td><td id="w4f3"> 
        </td><td id="w6f3"> 
        </td><td> -
    </td></tr>
    <tr>
        <td> [<span style="text-decoration:overline">1</span><span style="text-decoration:overline">1</span><span style="text-decoration:overline">1</span>]
        </td><td> -
        </td><td id="w1f4"> 
        </td><td> -
        </td><td id="w4f4"> 
        </td><td id="w6f4"> 
        </td><td> -
    </td></tr>
</tbody></table>
<p>
<input type="button" value="Download table" onclick="download_csv()"><br>
<input type="button" value="Clear" onclick="clear_canvas()"><br>
<script>
var input = document.getElementById('selectedImage');
    input.addEventListener('change', handleImage, false);
    compute_planes();
</script>
</p>

</body></html>