You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

320 lines
8.3 KiB

2 years ago
var graphs,
variables,
currentEditor,
maxSquareCount,
minSquareCount,
padding,
paddingFactor,
tickFactor,
textHeight,
paddingDivider,
scrollFactor,
squareCount,
axisDispo,
axisDispoPI,
origin,
distance,
valid,
editing;
function setup(){
frameRate(0);
assignGlobalVariables();
restoreSettings();
//restoreStandard();
prepareVisibilites();
updateAll();
updateScroll();
}
function assignGlobalVariables(){
graphs = [],
variables = [],
currentEditor = null,
maxSquareCount = {x: 20, y: 15},
minSquareCount = {x: 15, y: 10},
squareCount = {x: 0, y: 0},
padding = {x: 50, y: 50},
paddingFactor = {x: 1, y: 1},
paddingDivider = {x: 0, y: 0},
axisDispoPI = {x: false, y: false},
axisDispo = 2,
tickFactor = 1,
origin = {x: 0, y: 0},
distance = {x: 0, y: 0},
textHeight = 15;
}
function addGraph(){
var newGraph = new Graph($("#input").val());
var same = false;
if (newGraph.getName().length == 0) return;
graphs.forEach(function(g){
if (g.getName() == newGraph.getName()){
newGraph.setColor(g.getColor());
newGraph.setThickness(g.getThickness());
graphs[graphs.indexOf(g)] = newGraph;
same = true;
}
});
if (!same){
graphs.push(newGraph);
$("#input").val(newGraph.getFullDescription());
}
updateAll();
}
function updateAll(){
updateInterface();
updateDisplay();
safeSettings();
}
function updateDisplay(){
prepareGridValues();
drawGrid();
drawGraphs();
}
function updateInterface(){
$("#functions").html("");
graphs.forEach(function(g){
var bc = g.getColor();
var c = g.visible ? g.getColor() : "none";
$("#functions").append("<tr><td><div style=\"background-color: " + c + "; border-color: " + bc + "\" onclick=\"toggleGraph(this)\""
+ "></div></td><td><button onclick=\"editGraph(this)\">" + g.getFullDescription()
+ "</button></td><td><button onclick=\"deleteGraph(this)\">X</button></td></tr>");
});
}
function prepareGridValues(){
squareCount.x = width / padding.x;
squareCount.y = height / padding.y;
while (squareCount.x > maxSquareCount.x){
squareCount.x = round(squareCount.x / axisDispo);
paddingFactor.x *= axisDispo;
padding.x *= axisDispo;
}
while (squareCount.y > maxSquareCount.y){
squareCount.y = round(squareCount.y / axisDispo);
paddingFactor.y *= axisDispo;
padding.y *= axisDispo;
}
while (squareCount.x < minSquareCount.x){
squareCount.x *= axisDispo;
paddingFactor.x /= axisDispo;
padding.x = round(padding.x / axisDispo);
}
while (squareCount.y < minSquareCount.y){
squareCount.y *= axisDispo;
paddingFactor.y /= axisDispo;
padding.y = round(padding.y / axisDispo);
}
squareCount.x = round(squareCount.x);
squareCount.y = round(squareCount.y);
paddingDivider.x = padding.x / paddingFactor.x;
paddingDivider.y = padding.y / paddingFactor.y;
}
function drawGrid(){
clear();
stroke("#000");
strokeWeight(2);
line(0, origin.y, width, origin.y);
line(origin.x, height, origin.x, 0);
strokeWeight(0.25);
var centerX = (origin.x - width / 2) % padding.x + width / 2;
var centerY = (origin.y - height / 2) % padding.y + height / 2;
var x, y, numX, numY, textWidthX, textWidthY, i;
for (i = 0; i < squareCount.x * 2; i++){
x = centerX - squareCount.x * padding.x + padding.x * i;
if (axisDispoPI.x) numX = round((x - origin.x) / padding.x * paddingFactor.x / PI * 100) / 100 + "π";
if (!axisDispoPI.x) numX = round((x - origin.x) / padding.x) * paddingFactor.x;
if (numX == 0 || numX == "0π") numX = "";
line(x, 0, x, height);
textWidthX = textWidth(str(numX));
text(numX, x - textWidthX / 2, origin.y + textHeight / 2, textWidthX, textHeight);
}
for (i = 0; i < squareCount.y * 2; i++){
y = centerY - squareCount.y * padding.y + padding.y * i;
if (axisDispoPI.y) numY = -round((y - origin.y) / padding.y * paddingFactor.y / PI * 100) / 100 + "π";
if (!axisDispoPI.y) numY = -round((y - origin.y) / padding.y) * paddingFactor.y;
if (numY == 0 || numY == "0π") numY = "";
line(0, y, width, y);
textWidthY = textWidth(str(numY));
text(numY, origin.x - textWidthY - textHeight / 2, y - textHeight / 2, textWidthY, textHeight);
}
}
function drawGraphs(){
graphs.forEach(function(g){
if (!g.visible) return;
var rdyFunc = g.getExecuteFunction();
var r = g.getReference();
function f(value){
var y;
var execFunc = rdyFunc.replace(new RegExp(r, "g"), value);
try{y = eval(execFunc);} catch(e){y = null;}
return y;
}
var pointsRange = [], x, y;
for (var px = 0; px <= width; px += tickFactor){
x = (px - origin.x) / paddingDivider.x;
y = f(x);
pointsRange[px / tickFactor] = {x: x, y: y};
}
g.setPoints(pointsRange);
});
graphs.forEach(function(g){
if (!g.visible) return;
var t = g.getThickness(), x, y;
stroke(g.getColor());
strokeWeight(t);
g.getPoints().forEach(function(p){
x = origin.x + p.x * paddingDivider.x;
y = origin.y - p.y * paddingDivider.y;
if (x != null && y != null) line(x, y, x + t / 4, y);
});
//Straight lines instead of points:
/*for (var i = 0; i < g.getPoints().length; i++){
p = g.getPoints()[i];
x1 = origin.x + p.x * paddingDivider.x;
y1 = origin.y - p.y * paddingDivider.y;
try{
x2 = origin.x + g.getPoints()[i + 1].x * paddingDivider.x;
y2 = origin.y - g.getPoints()[i + 1].y * paddingDivider.y;
line(x1, y1, x2, y2);
}catch(e){}
}*/
});
}
function editGraph(obj){
var i = $(obj).parent().parent().index();
obj.blur();
currentEditor = new Editor(obj, i);
}
function deleteGraph(obj){
var i = $(obj).parent().parent().index();
obj.blur();
graphs.splice(i, 1);
updateAll();
}
function toggleGraph(obj){
var i = $(obj).parent().parent().index();
obj.blur();
graphs[i].visible = !graphs[i].visible;
updateAll();
}
function mouseWheel(event){
if (mouseX > 0 && mouseY < height && !editing){
var oldPaddingX = padding.x;
var oldPaddingY = padding.y;
var oldPaddingFactorX = paddingFactor.x;
var oldPaddingFactorY = paddingFactor.y;
padding.x *= (scrollFactor - (event.delta > 0 ? 3 : -3)) / scrollFactor;
padding.y *= (scrollFactor - (event.delta > 0 ? 3 : -3)) / scrollFactor;
padding.x = round(padding.x);
padding.y = round(padding.y);
prepareGridValues();
origin.x = -(mouseX - origin.x) / (oldPaddingX / oldPaddingFactorX) * (padding.x / paddingFactor.x) + mouseX;
origin.y = -(mouseY - origin.y) / (oldPaddingY / oldPaddingFactorY) * (padding.y / paddingFactor.y) + mouseY;
updateDisplay();
}
}
function updateScroll(){
scrollFactor = round((500 - $("#scroll_input").val() * 0.95) / 5);
}
function updateDisposition(obj, xAxis){
obj.blur();
var dispo = $(obj).val();
if (xAxis){
if (dispo == "PI" && !axisDispoPI.x){
paddingFactor.x *= PI;
padding.x *= PI;
axisDispoPI.x = true;
}
if (dispo == "1" && axisDispoPI.x){
paddingFactor.x /= PI;
padding.x /= PI;
axisDispoPI.x = false;
}
}
if (!xAxis){
if (dispo == "PI" && !axisDispoPI.y){
paddingFactor.y *= PI;
padding.y *= PI;
axisDispoPI.y = true;
}
if (dispo == "1" && axisDispoPI.y){
paddingFactor.y /= PI;
padding.y /= PI;
axisDispoPI.y = false;
}
}
updateAll();
}
function mouseDragged(){
if (editing){currentEditor.colorPicker.mouseDragged();}
else if (valid){
origin.x = round(mouseX - distance.x);
origin.y = round(mouseY - distance.y);
updateDisplay();
}
}
function mousePressed(){
if (editing){currentEditor.colorPicker.mousePressed();}
else if (mouseX > 0 && mouseY < height){
valid = true;
distance.x = mouseX - origin.x;
distance.y = mouseY - origin.y;
$("#defaultCanvas0").css("cursor", "all-scroll");
} else {valid = false;}
}
function mouseReleased(){
if (editing){currentEditor.colorPicker.mouseReleased();}
$("#defaultCanvas0").css("cursor", "auto");
}
function prepareVisibilites(){
if (!editing) $("#graph_editor_wrapper").hide();
$("#canvas_holder").css("height", windowHeight - $("#input_holder").outerHeight() + "px");
var canvas = createCanvas(windowWidth - $("#displayer").outerWidth(), windowHeight - $("#input_holder").outerHeight());
canvas.parent("canvas_holder");
$(".holder:not(#settings_holder)").css("height", windowHeight * 0.7 * 0.5 + "px");
$("#settings_holder").css("height", $("#displayer").outerHeight() - $("#function_holder").outerHeight() - $("#variable_holder").outerHeight() - 80 + "px");
origin.x = width / 2;
origin.y = height / 2;
textFont("Arial", textHeight);
$("body").css("background-color", "#FFF");
}