[從頭學數學] 第190節 圓錐曲線與方程

來源:互聯網
上載者:User

標籤:

劇情提要:
[機器小偉]在[工程師阿偉]的陪同下進入了[九轉金丹]之第五轉的修鍊。
這次要研究的是[圓錐曲線與方程]。

正劇開始:

星曆2016年04月22日 17:18:56, 銀河系厄爾斯星球中華帝國江南行省。
[工程師阿偉]正在和[機器小偉]一起研究[圓錐曲線與方程]。






<span style="font-size:18px;">        //存放函數映像上的點                var a = [], b = [], c = [], d = [];                                 //需要顯示的函數說明                var f1 = '曲線 xy = ±8';    var epsilon = 0.000001;var k = 8;        //函數描點                for (var x = xS; x <= xE; x+=0.5) {   for (var y = yS; y <= yE; y+=0.5) {if (Math.abs(x*y - k)<epsilon || Math.abs(x*y + k)<epsilon) {  a.push([x, y]);   } }        }   </span>



<span style="font-size:18px;">var pointA = [-1, -1], pointB = [3, 7];        //函數描點                for (var x = xS; x <= xE; x+=0.5) {   for (var y = yS; y <= yE; y+=0.5) {if (floatEqual(distanceCalc([x, y], pointA), distanceCalc([x,y], pointB))){  a.push([x, y]);} }        }  </span>


<span style="font-size:18px;">       //存放函數映像上的點                var a = [], b = [], c = [], d = [];                                 //需要顯示的函數說明                var f1 = '曲線 例3', f2 = '';    var epsilon = 0.000001;var pointF = [0, 2];        //函數描點                for (var x = xS; x <= xE; x+=0.5) {   for (var y = yS; y <= yE; y+=0.5) {if (floatEqual(distanceCalc([x, y], pointF)-2,y)){  a.push([x, y]);     } }        }  </span>




<span style="font-size:18px;">        //需要顯示的函數說明                var f1 = '曲線 題2', f2 = '';    var epsilon = 0.000001;var k = 5;var pointO = [0, 0], pointA = [k, 0];var d1 = d2 = 0;        //函數描點                for (var x = xS; x <= xE; x+=0.5) {   for (var y = yS; y <= yE; y+=0.5) {d1 = distanceCalc([x, y], pointO);d2 = distanceCalc([x, y], pointA);if (floatEqual(d1*d1-d2*d2, k)){  a.push([x, y]);   } }        }  </span>


<span style="font-size:18px;">        //需要顯示的函數說明                var f1 = '曲線 題3', f2 = '';    var epsilon = 0.000001;var pointA = [-3, 0], pointB = [3, 0];var d1 = d2 = 0;        //函數描點                for (var x = xS; x <= xE; x+=0.2) {   for (var y = yS; y <= yE; y+=0.2) {d1 = distanceCalc([x, y], pointA);d2 = distanceCalc([x, y], pointB);if (floatEqual(d1*d1+d2*d2, 26)){  a.push([x, y]);    } }        } </span>



<span style="font-size:18px;">        //需要顯示的函數說明                var f1 = '曲線 題1', f2 = '';    var epsilon = 0.000001;var k;//y = k(x-3)+4//[0, -3*k+4], [-4/k+3, 0]<span style="white-space:pre"></span>for (var k = -10; k <= 10; k+=0.2) {<span style="white-space:pre"></span>if (k != 0) {<span style="white-space:pre"></span>a.push([-4/k+3, -3*k+4])<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}</span>

如果用x^2/a^2+y^2/b^2這種公式去描點,得到的點會非常稀疏。


所以一般用到某兩點距離和為定值這種表述來描點:


<span style="font-size:18px;">if (1) {              var r = 20;                    config.setSector(1,1,1,1);                      config.graphPaper2D(0, 0, r);                    config.axis2D(0, 0,180);                                      //座標軸設定                var scaleX = 2*r, scaleY = 2*r;                  var spaceX = 2, spaceY = 2;                   var xS = -10, xE = 10;                  var yS = -10, yE = 10;                  config.axisSpacing(xS, xE, spaceX, scaleX, 'X');                    config.axisSpacing(yS, yE, spaceY, scaleY, 'Y');                                        var transform = new Transform();                    //存放函數映像上的點                var a = [], b = [], c = [], d = [];                                 //需要顯示的函數說明                var f1 = '曲線 橢圓 x^2/16+y^2/9 = 1', f2 = '';    var epsilon = 0.000001;//橢圓的焦距等 a = 4, b = 3, c= 5var pointA = [-4, 0], pointB = [4, 0];var d1 = d2 = 0;        //函數描點                for (var x = xS; x <= xE; x+=0.03) {   for (var y = yS; y <= yE; y+=0.03) {if (floatEqual(distanceCalc([x, y], pointA)+distanceCalc([x,y], pointB), 10)){  a.push([x, y]);          } }        }              a = shape.angularSort(a);                //存放臨時數組                var tmp = [];                                  //顯示變換                if (a.length > 0) {                    a = transform.scale(transform.translate(a, 0, 0), scaleX/spaceX, scaleY/spaceY);                     //函數1                    tmp = [].concat(a);                        shape.pointDraw(tmp, 'red');                        tmp = [].concat(a);                        shape.strokeDraw(tmp, 'pink');                                            plot.setFillStyle('red');                    plot.fillText(f1, 100, -90, 200);                  }      b = [pointA, pointB];if (b.length > 0) {                b = transform.scale(transform.translate(b, 0, 0), scaleX/spaceX, scaleY/spaceY);                             tmp = [].concat(b);                    shape.pointDraw(tmp, 'blue', 1, 1);                }                                }}</span>



<span style="font-size:18px;">       //需要顯示的函數說明                var f1 = '曲線 例3', f2 = '';    var epsilon = 0.000001;//橢圓的焦距等 a = 4, b = 3, c= 5var pointA = [-5, 0], pointB = [5, 0];var d1 = d2 = 0;        //函數描點                for (var x = xS; x <= xE; x+=0.03) {   for (var y = yS; y <= yE; y+=0.03) {if (floatEqual(slopeCalc([x,y], pointA)*slopeCalc([x,y], pointB), -4/9)){  a.push([x, y]);          } }        }     </span>


<span style="font-size:18px;">if (1) {              var r = 20;                    config.setSector(1,1,1,1);                      config.graphPaper2D(0, 0, r);                    config.axis2D(0, 0,180);                                      //座標軸設定                var scaleX = 2*r, scaleY = 2*r;                  var spaceX = 2, spaceY = 2;                   var xS = -10, xE = 10;                  var yS = -10, yE = 10;                  config.axisSpacing(xS, xE, spaceX, scaleX, 'X');                    config.axisSpacing(yS, yE, spaceY, scaleY, 'Y');                                        var transform = new Transform();                    //存放函數映像上的點                var a = [],  b = [], c = [], d = [];                                 //需要顯示的函數說明                var f1 = '曲線 雙曲線 x^2/9-y^2/16 = 1', f2 = '';    var epsilon = 0.000001;var pointA = [-5, 0], pointB = [5, 0];var d1 = d2 = 0;        //函數描點                for (var x = xS; x <= xE; x+=0.03) {   for (var y = yS; y <= yE; y+=0.03) {if (floatEqual(Math.abs(distanceCalc([x,y], pointA)- distanceCalc([x,y], pointB)), 6)){  //按象限劃分if (x<=0) {a.push([x, y]);   }else {b.push([x,y]);}    } }        }                         //存放臨時數組                var tmp = [];                                  //顯示變換                if (a.length > 0) { a = shape.angularSort(a);              a = transform.scale(transform.translate(a, 0, 0), scaleX/spaceX, scaleY/spaceY);                     //函數1                    tmp = [].concat(a);                        shape.pointDraw(tmp, 'red');                        tmp = [].concat(a);                        shape.multiLineDraw(tmp, 'pink');                                            plot.setFillStyle('red');                    plot.fillText(f1, 100, -90, 200);                  }      if (b.length > 0) { b = shape.angularSort(b);            b = transform.scale(transform.translate(b, 0, 0), scaleX/spaceX, scaleY/spaceY);                            //函數2                tmp = [].concat(b);                    shape.pointDraw(tmp, 'blue');                tmp = [].concat(b);                    shape.multiLineDraw(tmp, '#22CCFF');                             plot.setFillStyle('blue');                plot.fillText(f2, 100, -120, 200);                 }                    //點的標註        var p = [pointA, pointB];if (p.length > 0) {                p = transform.scale(transform.translate(p, 0, 0), scaleX/spaceX, scaleY/spaceY);                            //函數2                tmp = [].concat(p);                    shape.pointDraw(tmp, 'blue', 1, 1);                }     }</span>

<span style="font-size:18px;">        //需要顯示的函數說明                var f1 = '曲線 雙曲線 x^2/9-y^2/4 = 1', f2 = '';    var epsilon = 0.000001;var pointA = [-Math.sqrt(13), 0], pointB = [Math.sqrt(13), 0];var d1 = d2 = 0;        //函數描點                for (var x = xS; x <= xE; x+=0.03) {   for (var y = yS; y <= yE; y+=0.03) {if (floatEqual(Math.abs(distanceCalc([x,y], pointA)- distanceCalc([x,y], pointB)), 6)){  //按象限劃分if (x<=0) {a.push([x, y]);   }else {b.push([x,y]);}    } }        }     </span>

<span style="font-size:18px;">if (1) {              var r = 20;                    config.setSector(1,1,1,1);                      config.graphPaper2D(0, 0, r);                    config.axis2D(0, 0,180);                                      //座標軸設定                var scaleX = 2*r, scaleY = 2*r;                  var spaceX = 2, spaceY = 2;                   var xS = -10, xE = 10;                  var yS = -10, yE = 10;                  config.axisSpacing(xS, xE, spaceX, scaleX, 'X');                    config.axisSpacing(yS, yE, spaceY, scaleY, 'Y');                                        var transform = new Transform();                    //存放函數映像上的點                var a = [],  b = [], c = [], d = [];                                 //需要顯示的函數說明                var f1 = '曲線 拋物線y^2 = 2(x-2.5)', f2 = '';    var epsilon = 0.000001;var pointA = [Math.sqrt(25), 0], pointB = [Math.sqrt(25), 0];var d1 = d2 = 0;        //函數描點                for (var x = xS; x <= xE; x+=0.05) {   for (var y = yS; y <= yE; y+=0.05) {if (floatEqual(Math.abs(distanceCalc([x,y], pointA)-(x-0)), 0)){  a.push([x, y]);     } }        }           //存放臨時數組                var tmp = [];                                  //顯示變換                if (a.length > 0) {    a = shape.angularSort(a);             a = transform.scale(transform.translate(a, 0, 0), scaleX/spaceX, scaleY/spaceY);                     //函數1                    tmp = [].concat(a);                        shape.pointDraw(tmp, 'red');                        tmp = [].concat(a);                        shape.multiLineDraw(tmp, 'pink');                                            plot.setFillStyle('red');                    plot.fillText(f1, -100, -120, 200);                  }      if (b.length > 0) {    b = shape.angularSort(b);            b = transform.scale(transform.translate(b, 0, 0), scaleX/spaceX, scaleY/spaceY);                            //函數2                tmp = [].concat(b);                    shape.pointDraw(tmp, 'blue');                tmp = [].concat(b);                    shape.multiLineDraw(tmp, '#22CCFF');                             plot.setFillStyle('blue');                plot.fillText(f2, 100, -120, 200);                 }                    //點的標註        var p = [pointA];if (p.length > 0) {                p = transform.scale(transform.translate(p, 0, 0), scaleX/spaceX, scaleY/spaceY);                            //函數2                tmp = [].concat(p);                    shape.pointDraw(tmp, 'blue', 1, 1);                }     }</span>



幾個方便函數:

<span style="font-size:18px;">//平面點之間的距離function distanceCalc(pointA, pointB) {var x1 = pointA[0], y1 = pointA[1],x2 = pointB[0], y2 = pointB[1];return Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}//平面點之間的斜率function slopeCalc(pointA, pointB) {var x1 = pointA[0], y1 = pointA[1],x2 = pointB[0], y2 = pointB[1];if (floatEqual(x1, x2)) {return 100000;}else {return (y1-y2)/(x1-x2);}}//浮點數的相等判斷function floatEqual(value1, value2) {var epsilon = 0.001;if (Math.abs(value1 - value2)<=epsilon) {return true;}else {return false;}}</span>


本節到此結束,欲知後事如何,請看下回分解。

[從頭學數學] 第190節 圓錐曲線與方程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.