let hInput = document.getElementById("h"); let rInput = document.getElementById("r"); let rsInput = document.getElementById("rs"); let npInput = document.getElementById("np"); let outputdiv = document.getElementById("output"); let height = 0; let radius = 0; let spillRadius = 0; let numberOfPanels = 0; let multiplier = 1; let accuracy = 8; const step = 0.001 * multiplier; // const offset = 3*10**-15 * multiplier; const offset = 4*10**-5 * multiplier; let pointsP = []; let pointsQ = []; let distances = []; let panelPoints = []; let n = 0; // maths function approx(x) { return Math.round(x*(10**accuracy))/(10**accuracy); } function f(x) { res = approx(height * Math.sqrt((1-(Math.pow(x,2)/Math.pow(radius,2))))); console.log(`f ${x} ${res}`); return res; } function fprime(x) { res = approx(-1*((Math.pow(height,2)*x)/(Math.pow(radius,2)*f(x)))); console.log(`fprime ${x} ${res}`); return res; } function g(x, P) { res = approx(fprime(x)*(x-P.x)+P.y); console.log(`g ${x} ${P.x} ${P.y} ${res}`); return res; } function j(A, B) { res = approx(A.x*fprime(A.x)-B.x*fprime(B.x)-A.y+B.y)/(fprime(A.x)-fprime(B.x)); console.log(`j ${A.x} ${A.y} ${B.x} ${B.y} ${res}`); return res; } function d(A, B) { res = approx(Math.sqrt(Math.pow(A.x-B.x,2)+Math.pow(A.y-B.y,2))); console.log(`d ${A.x} ${A.y} ${B.x} ${B.y} ${res}`); return res; } // logic function getValues() { pointsP = []; pointsQ = []; distances = []; panelPoints = []; height = /* /* Math.floor */(parseFloat(hInput.value) *multiplier); radius = /* Math.floor */(parseFloat(rInput.value) *multiplier); spillRadius = /* Math.floor */(parseFloat(rsInput.value) *multiplier); numberOfPanels = /* Math.floor */(parseFloat(npInput.value) *multiplier); if (isNaN(spillRadius)) { spillRadius = /* Math.floor */(0.05*radius); rsInput.value = 0.05*radius /multiplier; } n = ((radius-spillRadius)/(step-offset))-1; console.log(`${height}, ${radius}, ${spillRadius}, ${step}, ${offset}`); } function getPoints() { for (let x = spillRadius; x < radius; x+=step-offset) { x=approx(x); pointsP.push({ x: x, y: f(x) }); } } function getPointsOfTangentIntersection() { for (let i = 0; i < n; i++) { console.log(`${i}, ${pointsP[i]}, ${pointsP[i+1]}`); pointsQ.push({ x: j(pointsP[i], pointsP[i+1]), y: g(j(pointsP[i], pointsP[i+1]), pointsP[i+1]) }); } } function getDistancesBetweenIntersections() { for (let i = 0; i < n-1; i++) { distances.push(d(pointsQ[i], pointsQ[i+1])); } } function generateCoordinates() { let Xi = 0; for (let i = 0; i < n-2; i++) { Xi+=distances[i]; Yi=(Math.PI*pointsQ[i].x)/numberOfPanels; panelPoints.push({ x: Xi, y: Yi }); } } function plotSVG() { let maxY = 0; panelPoints.forEach((point) => { if (maxY < point.y) { maxY=point.y } }) let pointsA = []; let pointsB = []; for(let i = 0; i < panelPoints.length; i++) { let point = panelPoints[i]; pointsA.push(`${approx(point.x*10)},${(maxY*10)-approx(point.y*10)}`) pointsB.push(`${approx(point.x*10)},${approx((point.y+maxY)*10)}`); } outputdiv.innerHTML = ` ` } // main func function generatePanel() { getValues(); getPoints(); getPointsOfTangentIntersection(); getDistancesBetweenIntersections(); generateCoordinates(); plotSVG(); }