<img src="/projects/SewASphere/ellipseDiagram.gif" width="600"/> <!-- solve_arc_length came from web page at: http://ca.geocities.com/web_sketches/ellipse_notes/ellipse_arc_length/ellipse_arc_length.html --> <SCRIPT type="text/javascript"> function clearLog(divId) { var logDiv = document.getElementById(divId); logDiv.innerHTML = ''; } function logTo(divId,txt) { var logDiv = document.getElementById(divId); if(logDiv==null) { logDiv = document.createElement("<div id='"+ divId +"'></div>"); document.body.insertBefore(logDiv); } // log to beginning of div, not the end of it. logDiv.innerHTML = txt + logDiv.innerHTML; } // Does the same as logTo except it outputs a <br> at the end. function logLineTo(divId,txt) { logTo(divId,txt +'<br>'); } function determineTable(min,max) { var min=4; var max=32; var maxAccuracy = 0.01; for(var diameter=max; diameter>=min; --diameter) determineEverything(diameter/2,diameter/2,diameter,maxAccuracy); } function determineEverything(startA,startB,q,maxAccuracy) { var c = q * Math.PI; var desiredArcLength = c / 4; var r = q / 4; clearLog('log'); logLineTo('log','starting'); logLineTo('log',''); determineEverything1(q,desiredArcLength,startA,startB,r,maxAccuracy); logLineTo('log','finished!'); } function pn(v,e) { var roundLimit = Math.pow(10,e); return Math.round(v*roundLimit) / roundLimit; return v; } function determineEverything1(q,desiredArcLength,a,b,r,maxAccuracy) { logLineTo('log','<b>maxAccuracy</b>='+ maxAccuracy +' <b>r</b>='+ pn(r,6) +' <b>desiredArcLength</b>='+ pn(desiredArcLength,6) ); for(var ix=0; ix<100; ++ix) { var d = determineD(a,b,r); var arcLength = solve_arc_length_1(a,b,d,0); var variation = desiredArcLength - arcLength; var shouldBeD = checkX(a,b,b-r); var shouldBeBR = checkY(a,b,d); var dVariation = d - shouldBeD; var brVariation = (b - r) - shouldBeBR; // if(ix % 10 == 0) // logLineTo('log','<b>a</b>='+ pn(a,6) +' <b>b</b>='+ pn(b,6) +' <b>d</b>='+ pn(d,6) +' <b>var</b>='+ pn(variation,6) +' <b>dVar</b>='+ pn(dVariation,6) +' <b>brVar</b>='+ pn(brVariation,6) ); if(Math.abs(variation) < maxAccuracy) { // the arc length is good. Now, check the coordinates. if(Math.abs(dVariation) > Math.abs(brVariation)) { // if the horizontal miss is greatest then adjust a if(dVariation > maxAccuracy) { if(dVariation < 0) { a += -dVariation/2; } else { a -= dVariation/2; } continue; } } else { // if the vertical miss is greatest then adjust b if(brVariation > maxAccuracy) { if(brVariation < 0) { b += -brVariation/2; } else { b -= brVariation/2; } continue; } } var g = b-r; var f = 2 * Math.sqrt( a*a - b*b ); var h = d - f/2; document.arc_length.finalA.value = a; document.arc_length.finalB.value = b; document.arc_length.finalD.value = d*2; document.arc_length.finalR.value = r; document.arc_length.finalG.value = g; document.arc_length.finalH.value = h; document.arc_length.finalAin.value = convertToEighths(a); document.arc_length.finalBin.value = convertToEighths(b); document.arc_length.finalDin.value = convertToEighths(d*2); document.arc_length.finalRin.value = convertToEighths(r); document.arc_length.finalGin.value = convertToEighths(g); document.arc_length.finalHin.value = convertToEighths(h); logLineTo('logVals', q +' | '+ document.arc_length.finalDin.value +' | '+ document.arc_length.finalRin.value +' | '+ document.arc_length.finalGin.value +' | '+ document.arc_length.finalHin.value ); return; } if(variation < 0) { // arcLength is too large a -= -variation / 2; b -= -variation / 2; } else { a += variation / 2; b += variation / 2; } } logLineTo('log','Too many iterations. Narrow the area to scan.'); } function convertToEighths(v) { var whole = Math.floor(v); var part = Math.round( (v-whole) * 8 ); if(part==0) return whole; else return whole +' '+ part +'/8'; } function checkX(a,b,y) { return a * Math.sqrt( 1 - y*y/(b*b) ); } function checkY(a,b,x) { return b * Math.sqrt( 1 - x*x/(a*a) ); } function determineD(a,b,r) { return a * Math.sqrt( 1 - (b-r)/(b*b) ); } function solve_arc_length() { var a = document.arc_length.R.value var b = document.arc_length.r.value var x1 = document.arc_length.x1.value var x2 = document.arc_length.x2.value var arcLength = solve_arc_length_1(a,b,x1,x2); // document.arc_length.c_arc.value = arcLength; } function solve_arc_length_1(a,b,x1,x2) { var pi = Math.PI var rad = pi/180 var F = 100000 var f = 10000000000 var prma1 = Math.acos(x1/a) var prma2 = Math.acos(x2/a) var d = (prma2 - prma1)/20 var y1 = Math.sqrt(a*a*Math.sin(prma1)*Math.sin(prma1) + b*b*Math.cos(prma1)*Math.cos(prma1)) var y2 = Math.sqrt(a*a*Math.sin(prma1 + 1*d)*Math.sin(prma1 + 1*d) + b*b*Math.cos(prma1 + 1*d)*Math.cos(prma1 + 1*d)) var y3 = Math.sqrt(a*a*Math.sin(prma1 + 2*d)*Math.sin(prma1 + 2*d) + b*b*Math.cos(prma1 + 2*d)*Math.cos(prma1 +2*d)) var y4 = Math.sqrt(a*a*Math.sin(prma1 + 3*d)*Math.sin(prma1 + 3*d) + b*b*Math.cos(prma1 + 3*d)*Math.cos(prma1 + 3*d)) var y5 = Math.sqrt(a*a*Math.sin(prma1 + 4*d)*Math.sin(prma1 + 4*d) + b*b*Math.cos(prma1 + 4*d)*Math.cos(prma1 + 4*d)) var y6 = Math.sqrt(a*a*Math.sin(prma1 + 5*d)*Math.sin(prma1 + 5*d) + b*b*Math.cos(prma1 + 5*d)*Math.cos(prma1 + 5*d)) var y7 = Math.sqrt(a*a*Math.sin(prma1 + 6*d)*Math.sin(prma1 + 6*d) + b*b*Math.cos(prma1 + 6*d)*Math.cos(prma1 + 6*d)) var y8 = Math.sqrt(a*a*Math.sin(prma1 + 7*d)*Math.sin(prma1 + 7*d) + b*b*Math.cos(prma1 + 7*d)*Math.cos(prma1 + 7*d)) var y9 = Math.sqrt(a*a*Math.sin(prma1 + 8*d)*Math.sin(prma1 + 8*d) + b*b*Math.cos(prma1 + 8*d)*Math.cos(prma1 + 8*d)) var y10 = Math.sqrt(a*a*Math.sin(prma1 + 9*d)*Math.sin(prma1 + 9*d) + b*b*Math.cos(prma1 + 9*d)*Math.cos(prma1 + 9*d)) var y11 = Math.sqrt(a*a*Math.sin(prma1 + 10*d)*Math.sin(prma1 + 10*d) + b*b*Math.cos(prma1 + 10*d)*Math.cos(prma1 + 10*d)) var y12 = Math.sqrt(a*a*Math.sin(prma1 + 11*d)*Math.sin(prma1 + 11*d) + b*b*Math.cos(prma1 + 11*d)*Math.cos(prma1 + 11*d)) var y13 = Math.sqrt(a*a*Math.sin(prma1 + 12*d)*Math.sin(prma1 + 12*d) + b*b*Math.cos(prma1 + 12*d)*Math.cos(prma1 + 12*d)) var y14 = Math.sqrt(a*a*Math.sin(prma1 + 13*d)*Math.sin(prma1 + 13*d) + b*b*Math.cos(prma1 + 13*d)*Math.cos(prma1 + 13*d)) var y15 = Math.sqrt(a*a*Math.sin(prma1 + 14*d)*Math.sin(prma1 + 14*d) + b*b*Math.cos(prma1 + 14*d)*Math.cos(prma1 + 14*d)) var y16 = Math.sqrt(a*a*Math.sin(prma1 + 15*d)*Math.sin(prma1 + 15*d) + b*b*Math.cos(prma1 + 15*d)*Math.cos(prma1 + 15*d)) var y17 = Math.sqrt(a*a*Math.sin(prma1 + 16*d)*Math.sin(prma1 + 16*d) + b*b*Math.cos(prma1 + 16*d)*Math.cos(prma1 + 16*d)) var y18 = Math.sqrt(a*a*Math.sin(prma1 + 17*d)*Math.sin(prma1 + 17*d) + b*b*Math.cos(prma1 + 17*d)*Math.cos(prma1 + 17*d)) var y19 = Math.sqrt(a*a*Math.sin(prma1 + 18*d)*Math.sin(prma1 + 18*d) + b*b*Math.cos(prma1 + 18*d)*Math.cos(prma1 + 18*d)) var y20 = Math.sqrt(a*a*Math.sin(prma1 + 19*d)*Math.sin(prma1 + 19*d) + b*b*Math.cos(prma1 + 19*d)*Math.cos(prma1 + 19*d)) var y21 = Math.sqrt(a*a*Math.sin(prma1 + 20*d)*Math.sin(prma1 + 20*d) + b*b*Math.cos(prma1 + 20*d)*Math.cos(prma1 + 20*d)) var d_3 = d/3 var y_sum = 1*y1 + 4*y2 + 2*y3 + 4*y4 + 2*y5 + 4*y6 + 2*y7 + 4*y8 + 2*y9 + 4*y10 + 2*y11 + 4*y12 + 2*y13 + 4*y14 + 2*y15 + 4*y16 + 2*y17 + 4*y18 + 2*y19 + 4*y20 + 1*y21 var s = (d/3)*(1*y1 + 4*y2 + 2*y3 + 4*y4 + 2*y5 + 4*y6 + 2*y7 + 4*y8 + 2*y9 + 4*y10 + 2*y11 + 4*y12 + 2*y13 + 4*y14 + 2*y15 + 4*y16 + 2*y17 + 4*y18 + 2*y19 + 4*y20 + 1*y21) window.status = "Ellipse Arc Length = " + Math.round(F*s)/F var dx = (x1 - x2)/20 var yc1 = Math.sqrt(1 + b*b*x2*x2/(a*a*(a*a - x2*x2))) var yc2 = Math.sqrt(1 + b*b*(1*x2 + 1*dx)*(1*x2 + 1*dx)/(a*a*(a*a - (1*x2 + 1*dx)*(1*x2 + 1*dx)))) var yc3 = Math.sqrt(1 + b*b*(1*x2 + 2*dx)*(1*x2 + 2*dx)/(a*a*(a*a - (1*x2 + 2*dx)*(1*x2 + 2*dx)))) var yc4 = Math.sqrt(1 + b*b*(1*x2 + 3*dx)*(1*x2 + 3*dx)/(a*a*(a*a - (1*x2 + 3*dx)*(1*x2 + 3*dx)))) var yc5 = Math.sqrt(1 + b*b*(1*x2 + 4*dx)*(1*x2 + 4*dx)/(a*a*(a*a - (1*x2 + 4*dx)*(1*x2 + 4*dx)))) var yc6 = Math.sqrt(1 + b*b*(1*x2 + 5*dx)*(1*x2 + 5*dx)/(a*a*(a*a - (1*x2 + 5*dx)*(1*x2 + 5*dx)))) var yc7 = Math.sqrt(1 + b*b*(1*x2 + 6*dx)*(1*x2 + 6*dx)/(a*a*(a*a - (1*x2 + 6*dx)*(1*x2 + 6*dx)))) var yc8 = Math.sqrt(1 + b*b*(1*x2 + 7*dx)*(1*x2 + 7*dx)/(a*a*(a*a - (1*x2 + 7*dx)*(1*x2 + 7*dx)))) var yc9 = Math.sqrt(1 + b*b*(1*x2 + 8*dx)*(1*x2 + 8*dx)/(a*a*(a*a - (1*x2 + 8*dx)*(1*x2 + 8*dx)))) var yc10 = Math.sqrt(1 + b*b*(1*x2 + 9*dx)*(1*x2 + 9*dx)/(a*a*(a*a - (1*x2 + 9*dx)*(1*x2 + 9*dx)))) var yc11 = Math.sqrt(1 + b*b*(1*x2 + 10*dx)*(1*x2 + 10*dx)/(a*a*(a*a - (1*x2 + 10*dx)*(1*x2 + 10*dx)))) var yc12 = Math.sqrt(1 + b*b*(1*x2 + 11*dx)*(1*x2 + 11*dx)/(a*a*(a*a - (1*x2 + 11*dx)*(1*x2 + 11*dx)))) var yc13 = Math.sqrt(1 + b*b*(1*x2 + 12*dx)*(1*x2 + 12*dx)/(a*a*(a*a - (1*x2 + 12*dx)*(1*x2 + 12*dx)))) var yc14 = Math.sqrt(1 + b*b*(1*x2 + 13*dx)*(1*x2 + 13*dx)/(a*a*(a*a - (1*x2 + 13*dx)*(1*x2 + 13*dx)))) var yc15 = Math.sqrt(1 + b*b*(1*x2 + 14*dx)*(1*x2 + 14*dx)/(a*a*(a*a - (1*x2 + 14*dx)*(1*x2 + 14*dx)))) var yc16 = Math.sqrt(1 + b*b*(1*x2 + 15*dx)*(1*x2 + 15*dx)/(a*a*(a*a - (1*x2 + 15*dx)*(1*x2 + 15*dx)))) var yc17 = Math.sqrt(1 + b*b*(1*x2 + 16*dx)*(1*x2 + 16*dx)/(a*a*(a*a - (1*x2 + 16*dx)*(1*x2 + 16*dx)))) var yc18 = Math.sqrt(1 + b*b*(1*x2 + 17*dx)*(1*x2 + 17*dx)/(a*a*(a*a - (1*x2 + 17*dx)*(1*x2 + 17*dx)))) var yc19 = Math.sqrt(1 + b*b*(1*x2 + 18*dx)*(1*x2 + 18*dx)/(a*a*(a*a - (1*x2 + 18*dx)*(1*x2 + 18*dx)))) var yc20 = Math.sqrt(1 + b*b*(1*x2 + 19*dx)*(1*x2 + 19*dx)/(a*a*(a*a - (1*x2 + 19*dx)*(1*x2 + 19*dx)))) var yc21 = Math.sqrt(1 + b*b*(1*x2 + 20*dx)*(1*x2 + 20*dx)/(a*a*(a*a - (1*x2 + 20*dx)*(1*x2 + 20*dx)))) var c_arc = (dx/3)*(1*yc1 + 4*yc2 + 2*yc3 + 4*yc4 + 2*yc5 + 4*yc6 + 2*yc7 + 4*yc8 + 2*yc9 + 4*yc10 + 2*yc11 + 4*yc12 + 2*yc13 + 4*yc14 + 2*yc15 + 4*yc16 + 2*yc17 + 4*yc18 + 2*yc19 + 4*yc20 + 1*yc21) return Math.round(f*c_arc)/f } </SCRIPT> </HEAD> <CENTER> <FORM NAME = "arc_length"> <b>Arc Length of Ellipse</b> <table> <tr> <td>StartA <td><input type="text" id="startA" name="startA" value="14"> <tr> <td>StartB <td><input type="text" id="startB" name="startB" value="14"> <tr> <td>Sphere Diameter (q) <td><input type="text" id="sphereDiameter" name="sphereDiameter" value="20"> <tr> <td>Max Accuracy <td><input type="text" id="maxAccuracy" name="maxAccuracy" value="0.01"> </table> <br> <input type="BUTTON" VALUE="Determine Table" onClick="determineTable()"> <input type="BUTTON" VALUE="Determine arc length values" onClick="determineEverything(document.arc_length.startA.value,document.arc_length.startB.value,document.arc_length.sphereDiameter.value,document.arc_length.maxAccuracy.value)"> <br> <br> <b>Results</b><br> <table> <tr> <td>A <td><INPUT TYPE="text" name="finalA"> <td><INPUT TYPE="text" name="finalAin"> <tr> <td>B <td><INPUT TYPE="text" name="finalB"> <td><INPUT TYPE="text" name="finalBin"> <tr> <td>D <td><INPUT TYPE="text" name="finalD"> <td><INPUT TYPE="text" name="finalDin"> <tr> <td>r <td><INPUT TYPE="text" name="finalR"> <td><INPUT TYPE="text" name="finalRin"> <tr> <td>g <td><INPUT TYPE="text" name="finalG"> <td><INPUT TYPE="text" name="finalGin"> <tr> <td>h <td><INPUT TYPE="text" name="finalH"> <td><INPUT TYPE="text" name="finalHin"> </table> <!-- c_arc = <INPUT TYPE = "Text" NAME = "c_arc" SIZE = "12"> --> <TABLE WIDTH = "360" CELLPADDING = "5" BORDER = "1" style="display:none"> <TD ALIGN = "RIGHT" VALIGN = "CENTER"> <B>Semi-Axis</B> lying on the <B><I>x</I></B>-axis , <B>R</B> = <INPUT STYLE = "COLOR: rgb(017,085,153); BACKGROUND-COLOR: rgb(245,245,245); BORDER: 0" TYPE = "Text" NAME = "R" SIZE = "7"> <BR> <B>Semi-Axis</B> lying on the <B><I>y</I></B>-axis , <B>r</B> = <INPUT STYLE = "COLOR: rgb(017,085,153); BACKGROUND-COLOR: rgb(245,245,245); BORDER: 0" TYPE = "Text" NAME = "r" SIZE = "7"> <BR> ( <B><I>x</I></B><SUB>1</SUB> > <B><I>x</I></B><SUB>2</SUB> ) ... <B><I>x</I></B><SUB>1</SUB> = <INPUT STYLE = "COLOR: rgb(017,085,153); BACKGROUND-COLOR: rgb(245,245,245); BORDER: 0" TYPE = "Text" NAME = "x1" SIZE = "7"> <BR> <B><I>x</I></B><SUB>2</SUB> = <INPUT STYLE = "COLOR: rgb(017,085,153); BACKGROUND-COLOR: rgb(245,245,245); BORDER: 0" TYPE = "Text" NAME = "x2" SIZE = "7"> <TABLE WIDTH = "320" CELLPADDING = "10"> <TD ALIGN = "CENTER"> <TABLE WIDTH = "195" CELLPADDING = "3"> <TD ALIGN = "CENTER"> <INPUT STYLE = "COLOR: rgb(000,000,000); BACKGROUND-COLOR: rgb(000,255,100)" onClick = "solve_arc_length()" TYPE = "Button" VALUE = "Arc Length Data"> </TD> </TABLE> <TABLE WIDTH = "195" CELLPADDING = "3"> <TD ALIGN = "CENTER"> <INPUT STYLE = "COLOR: rgb(255,255,255); BACKGROUND-COLOR: rgb(255,120,000)" onClick = "bgColor = '#FF7800'; if( confirm('Do you want to RESET and CLEAR the ELLIPSE ARC LENGTH DATA CALCULATOR?') ) {document.arc_length.reset(); bgColor = '#FFFFFF'}else{bgColor = '#FFFFFF'}" TYPE = "Button" VALUE = " RESET "> </TD> </TABLE> </TD> </TABLE> <HR> f<SUB>1</SUB> = <INPUT TYPE = "Text" NAME = "prma1" SIZE = "10"> <BR> ( f<SUB>2</SUB> > f<SUB>1</SUB> ) ... f<SUB>2</SUB> = <INPUT TYPE = "Text" NAME = "prma2" SIZE = "10"> <BR> Δf = ( f<SUB>2</SUB> – f<SUB>1</SUB> ) ÷ 20 = <INPUT TYPE = "Text" NAME = "d" SIZE = "10"> <BR> Δf ÷ 3 = <INPUT TYPE = "Text" NAME = "d_3" SIZE = "10"> </TD> </TABLE> </FORM> <BR> <DIV ID="log" NAME="log"> LOG MESSAGES<BR> </DIV> <DIV ID="logVals" NAME="logVals"> Values<BR> </DIV> </DIV>
Version 11.1 last modified by Geoff Fortytwo on 20/12/2011 at 19:28
Document data
Attachments:
No attachments for this document