Parabolas revisited.
While back I did an article about doing parabolas. Here is a web page that can help in printing parabola sections.
You know I had to make a foil plated version.
The code: (use at your own risk)
You know I had to make a foil plated version.
The code: (use at your own risk)
<!DOCTYPE html> <html> <head> <title> Parabola Segments </title> <script> function drawPicture(form) { var canvas = document.getElementById('example'); // link to id='example' var context = canvas.getContext('2d'); // create graphic context var scale = 350; var gain = 1; var radius = 1; var focal = form.foc.value; var step = 0.1; var Num_seg = 24; var a = 1/(4*focal); var x0 = scale*.6; var y0 = scale*2; var x ,y, dx ,dy,ds,angle,x_g,y_g; var s = 0; var x_last= 0; var y_last= 0; var X_calc = new Array(11); var Y_calc = new Array(11); var S_calc = new Array(11); for (i=0; i<=10; i++) //Calc Parabola data { x = step*i; y = a*x*x; dx = x-x_last; dy = y-y_last; ds = Math.pow(dx*dx+dy*dy,.5); s = s + ds; X_calc[i] = x; //X_data Y_calc[i] = y; //Y_data S_calc[i] = s; //Surface_data angle = (x/s)*2*Math.PI/Num_seg; x_last= x; y_last= y; } gain = 1.99/S_calc[10]; context.clearRect( 0,0,scale*2,scale*2); //ÊclearÊcanvasÊ context.strokeStyle = "Black"; context.beginPath(); context.fillStyle = "rgb( 255, 255, 255)"; // red, grn, blu context.fillRect ( 0, 0, scale*2, scale*2); // or draw white box context.fill(); if (form.s1[0].checked) //Draw segements? { context.moveTo( x0, y0); // move to origin for (i=0; i<=10; i++) { angle = (X_calc[i]/S_calc[i])*2*Math.PI/Num_seg; x_g = gain*scale*S_calc[i]*Math.sin(angle); y_g = -gain*scale*S_calc[i]*Math.cos(angle); context.lineTo( x_g + x0, y_g + y0 ); } context.stroke(); context.strokeStyle = "Black"; context.moveTo( x0, y0); // move to origin for (i=0; i<=10; i++) { angle = (X_calc[i]/S_calc[i])*2*Math.PI/Num_seg; x_g = -gain*scale*S_calc[i]*Math.sin(angle); y_g = -gain*scale*S_calc[i]*Math.cos(angle); context.lineTo( x_g + x0, y_g + y0 ); } context.stroke(); //context.strokeStyle = "Black"; for (j=1; j<=10; j++) { angle = (X_calc[j]/S_calc[j])*2*Math.PI/Num_seg; y_g = -gain*scale*S_calc[j]; context.moveTo( x0, y_g + y0); // move to origin for (i=0; i<=10; i++) { x_g = gain*scale*S_calc[j]*Math.sin(angle*i/10); y_g = -gain*scale*S_calc[j]*Math.cos(angle*i/10); context.lineTo( x_g + x0, y_g + y0); // move to origin } context.stroke(); y_g = -gain*scale*S_calc[j]; context.moveTo( x0, y_g + y0); // move to origin for (i=0; i<=10; i++) { x_g = -gain*scale*S_calc[j]*Math.sin(angle*i/10); y_g = -gain*scale*S_calc[j]*Math.cos(angle*i/10); context.lineTo( x_g + x0, y_g + y0); // move to origin } context.stroke(); } x0 = scale*1.4; // draw second segment y0 = 0; context.moveTo( x0, y0); // move to origin for (i=0; i<=10; i++) { angle = (X_calc[i]/S_calc[i])*2*Math.PI/Num_seg; x_g = gain*scale*S_calc[i]*Math.sin(angle); y_g = gain*scale*S_calc[i]*Math.cos(angle); context.lineTo( x_g + x0, y_g + y0 ); } context.stroke(); context.moveTo( x0, y0); // move to origin for (i=0; i<=10; i++) { angle = (X_calc[i]/S_calc[i])*2*Math.PI/Num_seg; x_g = -gain*scale*S_calc[i]*Math.sin(angle); y_g = gain*scale*S_calc[i]*Math.cos(angle); context.lineTo( x_g + x0, y_g + y0 ); } context.stroke(); for (j=1; j<=10; j++) { angle = (X_calc[j]/S_calc[j])*2*Math.PI/Num_seg; y_g = gain*scale*S_calc[j]; context.moveTo( x0, y_g + y0); // move to origin for (i=0; i<=10; i++) { x_g = gain*scale*S_calc[j]*Math.sin(angle*i/10); y_g = gain*scale*S_calc[j]*Math.cos(angle*i/10); context.lineTo( x_g + x0, y_g + y0); // move to origin } context.stroke(); y_g = gain*scale*S_calc[j]; context.moveTo( x0, y_g + y0); // move to origin for (i=0; i<=10; i++) { x_g = -gain*scale*S_calc[j]*Math.sin(angle*i/10); y_g = gain*scale*S_calc[j]*Math.cos(angle*i/10); context.lineTo( x_g + x0, y_g + y0); // move to origin } context.stroke(); } } if (form.s1[1].checked) // draw left side { x0 = 50; y0 = scale*2-100; context.moveTo( x0, y0); for (i=0; i<=10; i++) { x_g = gain*scale*X_calc[i]; y_g = -gain*scale*Y_calc[i]; context.lineTo( x_g + x0, y_g + y0); // move to origin } context.stroke(); for (i=0; i<=10; i++) { x_g = gain*scale*X_calc[i]; y_g = -gain*scale*Y_calc[0]; context.moveTo( x_g + x0, y_g + y0); // move to origin y_g = -gain*scale*Y_calc[10]; context.lineTo( x_g + x0, y_g + y0); // move to origin } context.stroke(); for (i=0; i<=10; i++) { x_g = gain*scale*X_calc[0]; y_g = -gain*scale*Y_calc[i]; context.moveTo( x_g + x0, y_g + y0); // move to origin x_g = gain*scale*X_calc[10]; context.lineTo( x_g + x0, y_g + y0); // move to origin } context.stroke(); } if (form.s1[2].checked) // draw left side { x0 = 2*scale-50; y0 = scale*2-100; context.moveTo( x0, y0); for (i=0; i<=10; i++) { x_g = -gain*scale*X_calc[i]; y_g = -gain*scale*Y_calc[i]; context.lineTo( x_g + x0, y_g + y0); // move to origin } context.stroke(); for (i=0; i<=10; i++) { x_g = -gain*scale*X_calc[i]; y_g = -gain*scale*Y_calc[0]; context.moveTo( x_g + x0, y_g + y0); // move to origin y_g = -gain*scale*Y_calc[10]; context.lineTo( x_g + x0, y_g + y0); // move to origin } context.stroke(); for (i=0; i<=10; i++) { x_g = -gain*scale*X_calc[0]; y_g = -gain*scale*Y_calc[i]; context.moveTo( x_g + x0, y_g + y0); // move to origin x_g = -gain*scale*X_calc[10]; context.lineTo( x_g + x0, y_g + y0); // move to origin } context.stroke(); } context.closePath(); // form.REC.value = form.REC.value +"S_calc[i]"+S_calc[10]+" \n" ; } </script> <style type = "text/css"> canvas { border: 2px solid gray; } </style> </head> <body> <h1>Parabola 1/12 Segments or Sides </h1> <form > <input type=text size = "10" value=".5" name="foc" onkeypress="drawPicture(this.form)"> =>Define a parabola focal point => <input type=button value="Plot_it" onClick="drawPicture(this.form)"> <input type="radio" Name=s1 checked="checked" Value = "Seg" /> segments</label> <input type="radio" Name=s1 Value = "LSide" /> <label for="sidecheck"> Left Side</label> <input type="radio" Name=s1 Value = "RSide" /> <label for="sidecheck"> Right Ride</label> <p> <canvas id = "example" width="700" height="700"> </canvas> <br> </form> </body> </html>
Now to build a base.
Other code to look at: (This will help you to calculate the focal point. .5 gives a focal point
within the parabola. I think I used 1.9 for focal point away from the parabola to work better
as a solar oven.
<!DOCTYPE html>
<html><head>
<meta http-equiv="content-type" content="text/html; charset=windows-1252">
<title> Plot A Parabola </title>
<script>
function drawPicture(form)
{ var canvas = document.getElementById('example'); // link to id='example'
var context = canvas.getContext('2d'); // create graphic context
var scale = 300;
var radius = 1;
var focal = form.foc.value;
var step = 0.1;
var a = 1/(4*focal);
var x0 = scale;
var y0 = scale*2;
context.clearRect( 0,0,scale*2,scale*2); //ÊclearÊcanvasÊ
context.strokeStyle = "yellow"; // set stroke to red
context.beginPath(); // new geometry
context.moveTo( x0, y0); // move to origin
context.lineTo( x0, -scale*2 + y0 ); // second point
context.stroke();
context.moveTo( x0-scale, -scale+ y0 ); // move to origin
context.lineTo( x0+scale, -scale+ y0 ); // second point
context.stroke();
context.closePath(); // end geo
context.fillStyle = "rgb( 0, 255, 0)"; // red, grn, blu
context.strokeStyle = "Black";
context.beginPath(); // new geometry
context.moveTo( x0, y0); // move to origin
for (i=0; i<=10; i++)
{ var x = i*step;
var y = -a*x*x;
context.lineTo( scale*x + x0, scale*y + y0 ); // second point
} context.stroke(); // stroke lines
context.moveTo( x0, y0); // move to origin
for (i=0; i<=10; i++)
{ var x = -i*step;
var y = -a*x*x;
context.lineTo( scale*x + x0, scale*y + y0 ); // second point
} context.stroke(); // stroke lines
context.moveTo( x0, -scale*focal + y0 +5); // move to focus
context.lineTo( x0, -scale*focal + y0 -5); // plot focus
context.stroke();
context.moveTo( x0 +5, -scale*focal + y0 ); // move to focus
context.lineTo( x0 -5, -scale*focal + y0 ); // plot focus
context.stroke();
context.font = "10px Times New Roman"; // set font
context.fillStyle = "Black"; // define fill using "black"
context.fillText( "-1", 10, 2*scale); // write "Sample String"
context.fillText( "0", scale, 2*scale); // write "Sample String"
context.fillText( "1", 1.97*scale, 2*scale); // write "Sample String"
context.fillText( "1", 1.97*scale, 1*scale); // write "Sample String"
context.fillText( "2", 1.97*scale, 10); // write "Sample String"
context.fillText( "focus", x0-10, -scale*focal + y0 -10); // write "Sample String"
}
</script>
<style type="text/css">
canvas { border: 2px solid violet; }
</style>
</head>
<body>
<h1>Plot a Parabola With A +/-Unity Radius </h1>
<br>
<form>
<input size="10" value=".5" name="foc" onkeypress="drawPicture(this.form)" type="text">
=>Define a parabola focal point =>
<input value="Plot_it" onclick="drawPicture(this.form)" type="button">
<p>
</p></form>
<canvas id="example" width="600" height="600">
</canvas> <br>
Radius is set to +/- 300 points.....A Parabola follows the equation y = x^2/(4*focal)
</body></html>
Final result:




Comments
Post a Comment