<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> &#150; f<SUB>1</SUB> ) &#247; 20 =
        <INPUT TYPE = "Text" NAME = "d" SIZE = "10">
        <BR>
        Δf &#247; 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

Attachments 0

No attachments for this document
Website Top
Send Me Mail!:
   g42website4 AT g42.org
My Encyclopaedia Blog

Creator: Geoff Fortytwo on 2008/05/12 01:19
Copyright 2004-2007 (c) XPertNet and Contributing Authors
1.3.2.9174