zoukankan      html  css  js  c++  java
  • [从头学数学] 第173节 圆与方程

    剧情提要:
    [机器小伟]在[project师阿伟]的陪同下进入了结丹初期的修炼。
    这次要修炼的目标是[圆与方程]。

    正剧開始:

    星历2016年04月11日 15:56:41, 银河系厄尔斯星球中华帝国江南行省。
    [project师阿伟]正在和[机器小伟]一起研究[圆与方程]。








    已知圆心位置和半径来画圆,小伟用36边的多边形取代圆,

    面积上略微小了一点。

    <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 transform = new Transform();
    		
    		var a = 5, b = 5, r0 = 5;
    		var array = shape.nEdge(a, b, r0, 36);
    		var scale = r;
    		//array = shape.angularSort(array);
    
    		shape.areaDraw(transform.translate(array, -200/scale, -200/scale), 'red', scale);
    		shape.strokeDraw([].concat(array), 'orange', scale);
    		
    	}
    	
    >>> 3.14*25
    78.5</span>



    知道三个坐标求外接圆的方程,是这样求的:

    <span style="font-size:18px;">	if (1) {
    //求三角形的外心  
            var r = 20;    
            var r0 = 5*r;  
            config.setSector(1,1,1,1);      
            config.graphPaper2D(0, 0, r);    
            config.axis2D(0, 0, 180);  
              
            var triangle = new Triangle();  
            var transform = new Transform();  
              
            //已知三角形顶点阵列  
            var array = [[5, 1], [7, -3], [2, -8]]; 
              
            //进行缩放转换  
           // array = transform.scale(array, r);  
              
            //三个顶点  
            var x1 = array[0][0], y1 = array[0][1],  
                x2 = array[1][0], y2 = array[1][1],  
                x3 = array[2][0], y3 = array[2][1];  
                  
            //令  
            var A1 = 2*(x2-x1), B1 = 2*(y2-y1), C1 = x2*x2+y2*y2-x1*x1-y1*y1,  
                A2 = 2*(x3-x2), B2 = 2*(y3-y2), C2 = x3*x3+y3*y3-x2*x2-y2*y2;  
                  
            //得到外心的坐标  
            var px = ((C1*B2)-(C2*B1))/((A1*B2)-(A2*B1)),  
                py = ((A1*C2)-(A2*C1))/((A1*B2)-(A2*B1));  
                  
            //外接圆半径  
    		var a = distance2D(array[0], array[1]),
    			b = distance2D(array[1], array[2]),
    			c = distance2D(array[2], array[0]);
            var rOut = a*b*c/Math.sqrt(4*b*b*c*c-Math.pow((b*b+c*c-a*a), 2));  
                          
            //document.write(px.toFixed(2)+', '+py.toFixed(2)+'; ' + rOut.toFixed(2));  
    		
    		var scale = r;
            shape.angleDraw([].concat(array), 'red', scale);  
    		var circle = shape.nEdge(px, py, rOut, 36);
    		shape.strokeDraw([].concat(circle), 'blue', scale);
    		
    		var s = '外心: ['+px.toFixed(2)+' , ' + py.toFixed(2)+'] ';
    		var s1 = '外接圆半径:'+rOut.toFixed(2);
    		plot.setFillStyle('#FF2288');
    		plot.fillText(s, -270, -170, 300);
    		plot.fillText(s1, -270, -140, 300);
    	}
    
    //二维坐标中两点之间的距离
    function distance2D(pointA, pointB) {
    	return Math.sqrt(Math.pow(pointA[0]-pointB[0], 2)+Math.pow(pointA[1]-pointB[1], 2));
    }
    </span>



    再来试一个:

    <span style="font-size:18px;">        //已知三角形顶点阵列  
            var array = [[-5, -2], [5, -2], [0, 5]]; </span>


    这个还是比較好玩的。




    圆的一般方程:


    <span style="font-size:18px;">//圆的一般方程
    function generalCircle(D, E, F) {
    	//方程x^2+y^2+Dx+Ey+F=0;
    	var rSquare = (D*D+E*E-4*F)/4;
    	
    	if (rSquare > 0) {
    		return shape.nEdge(-D/2, -E/2, Math.sqrt(rSquare), 36);
    	}
    	else {
    		return [];
    	}
    }
    
    //直线的一般方程
    function generalLine(A, B, C) {
    	//方程Ax+By+C = 0;
    	
    	return [[-100, (-100*A+C)/(-B)], [100, (100*A+C)/(-B)]];
    }</span>

    知道了能够做些什么呢?



    假设如今已经知道了D、E、F的值:


    <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 scale = r;
    		var circle = generalCircle(-8, 6, 0);
    		shape.strokeDraw([].concat(circle), 'blue', scale);
    	}</span>



    这就是过那三个点的圆。


    D、E、F能够这样来求:


    <span style="font-size:18px;">	if (1) {
    		//运用行列式解线性方程组
    		var matrix = new Matrix();  
    		var matrixArray = new Array();  
    		var rowArray = new Array();  
    		var ma, mb, mc; 
    		
    		//求过三点的圆的方程
    		//[x1, y1], [x2, y2], [x3, y3]
    		// ==> 方程x^2+y^2+Dx+Ey+F=0;
    		//解D, E, F
    		var point = [[0,0],[1,1],[4,2]];
    		var x1 = point[0][0], y1 = point[0][1],
    			x2 = point[1][0], y2 = point[1][1],
    			x3 = point[2][0], y3 = point[2][1];
    		
    		//三元一次方程组[[A1,B1,C1], [A2,B2,C2], ...]
    
    		var a = [
    			[x1, y1, 1, x1*x1+y1*y1],
    			[x2, y2, 1, x2*x2+y2*y2],
    			[x3, y3, 1, x3*x3+y3*y3]
    		];
    		
    		  
    		//三阶
    		var rank = 3;
    		for (var i = 0; i < rank; i++) {  
    			matrixArray.push([a[i][0], a[i][1], a[i][2]]);  
    		}  		
    		
    		ma = matrix.deepCopy(matrixArray); 		
    		for (var i = 0; i < rank; i++) {  
    			ma[i][0] = -a[i][3];  
    		}  
    		
    		
    		mb = matrix.deepCopy(matrixArray);  
    		for (var i = 0; i < rank; i++) {  
    			mb[i][1] = -a[i][3];  
    		}  
    		  
    		mc = matrix.deepCopy(matrixArray);  
    		for (var i = 0; i < rank; i++) {  
    			mc[i][2] = -a[i][3];  
    		}  
    		  
    		var d, da, db, dc;
    		d = matrix.delta(matrixArray);  
    		da = matrix.delta(ma);  
    		db = matrix.delta(mb);  
    		dc = matrix.delta(mc);  
    		  
    		  
    		matrix.print(matrixArray);  
    		  
    		document.write('d = ' + d+'<br/>');  
    			matrix.print(ma);  
    		document.write('da = ' + da+'<br/>');  
    			matrix.print(mb);  
    		document.write('db = '+db+'<br/>');  
    		  	matrix.print(mc);  
    		document.write('dc = '+dc+'<br/>');  
    		var s = 'D = da/d = '+ (da/d).toFixed(2)+', E = db/d = '+(db/d).toFixed(2)
    			+', F = dc/d = '+(dc/d).toFixed(2);  
    		document.write(s+'<br/>');     
    	
    	
    	}
    	</span>

    小伟把求DEF的过程炼制成了工具,来玩玩吧:


    <span style="font-size:18px;">//求解圆的一般方程中的D、E、F三个系数
    //传入的是三个点的坐标阵列
    //传回[D, E, F];
    function solveDEF(point) {
    			//运用行列式解线性方程组
    		var matrix = new Matrix();  
    		var matrixArray = new Array();  
    		var rowArray = new Array();  
    		var ma, mb, mc; 
    		
    		//求过三点的圆的方程
    		//[x1, y1], [x2, y2], [x3, y3]
    		// ==> 方程x^2+y^2+Dx+Ey+F=0;
    		//解D, E, F
    		//var point = [[0,0],[1,1],[4,2]];
    		var x1 = point[0][0], y1 = point[0][1],
    			x2 = point[1][0], y2 = point[1][1],
    			x3 = point[2][0], y3 = point[2][1];
    		
    		//三元一次方程组[[A1,B1,C1], [A2,B2,C2], ...]
    
    		var a = [
    			[x1, y1, 1, x1*x1+y1*y1],
    			[x2, y2, 1, x2*x2+y2*y2],
    			[x3, y3, 1, x3*x3+y3*y3]
    		];
    		
    		  
    		//三阶
    		var rank = 3;
    		for (var i = 0; i < rank; i++) {  
    			matrixArray.push([a[i][0], a[i][1], a[i][2]]);  
    		}  		
    		
    		ma = matrix.deepCopy(matrixArray); 		
    		for (var i = 0; i < rank; i++) {  
    			ma[i][0] = -a[i][3];  
    		}  
    		
    		
    		mb = matrix.deepCopy(matrixArray);  
    		for (var i = 0; i < rank; i++) {  
    			mb[i][1] = -a[i][3];  
    		}  
    		  
    		mc = matrix.deepCopy(matrixArray);  
    		for (var i = 0; i < rank; i++) {  
    			mc[i][2] = -a[i][3];  
    		}  
    		  
    		var d, da, db, dc;
    		d = matrix.delta(matrixArray);  
    		da = matrix.delta(ma);  
    		db = matrix.delta(mb);  
    		dc = matrix.delta(mc);  
    		
    		return [da/d, db/d, dc/d];
    		  
    		/*
    		matrix.print(matrixArray);  
    		  
    		document.write('d = ' + d+'<br/>');  
    			matrix.print(ma);  
    		document.write('da = ' + da+'<br/>');  
    			matrix.print(mb);  
    		document.write('db = '+db+'<br/>');  
    		  	matrix.print(mc);  
    		document.write('dc = '+dc+'<br/>');  
    		var s = 'D = da/d = '+ (da/d).toFixed(2)+', E = db/d = '+(db/d).toFixed(2)
    			+', F = dc/d = '+(dc/d).toFixed(2);  
    		document.write(s+'<br/>');   */  
    }
    		</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 array = [[-5, -2], [5, -2], [0, 5]]; 
    		var DEF = solveDEF(array);
    		
    		var scale = r;
    		var circle = generalCircle(DEF[0], DEF[1], DEF[2]);
    		
    		
    		shape.strokeDraw([].concat(circle), 'blue', scale);
    		shape.angleDraw([].concat(array), 'red', scale);
    	}
    	</span>



    过A。 B, C三个点的圆,没错吧。


    再玩一局:

    <span style="font-size:18px;">var array = [[-5, -2], [-7, -8], [4, 5]]; </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 scale = r;
    		var circle = generalCircle(0, -2, -4);
    		var line = generalLine(3, 1, -6);
    		shape.strokeDraw([].concat(circle), 'blue', scale);
    		shape.multiLineDraw([].concat(line), 'red', scale);
    	}</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 scale = r;
    		var circle_1 = generalCircle(2,8,-8),
    			circle_2 = generalCircle(-4, -4,-2);
    		
    		
    		shape.strokeDraw([].concat(circle_1), 'blue', scale);
    		shape.strokeDraw([].concat(circle_2), 'red', scale);
    	}</span>

    至于交点坐标倒底是什么,就要另外去求了。

    图上看好像是[-1,1] 和[3, -1],也不知对不正确。



    [人叫板老师]也没有给出交点坐标。









    这里(1.75-1.25)/(1.75+1.25) = 1/6。而1.75+1.25又恰好是PQ距离的一半。

    算了,这样的规律没什么意思,直接化简得了。





    <span style="font-size:18px;">//二维坐标中两点之间的距离
    function distance2D(pointA, pointB) {
    	return Math.sqrt(Math.pow(pointA[0]-pointB[0], 2)+Math.pow(pointA[1]-pointB[1], 2));
    }
    
    //圆的一般方程
    function generalCircle(D, E, F) {
    	//方程x^2+y^2+Dx+Ey+F=0;
    	var rSquare = (D*D+E*E-4*F)/4;
    	
    	if (rSquare > 0) {
    		return shape.nEdge(-D/2, -E/2, Math.sqrt(rSquare), 36);
    	}
    	else {
    		return [];
    	}
    }
    
    //直线的一般方程
    function generalLine(A, B, C) {
    	//方程Ax+By+C = 0;
    	
    	return [[-100, (-100*A+C)/(-B)], [100, (100*A+C)/(-B)]];
    }
    
    
    //求解圆的一般方程中的D、E、F三个系数
    //传入的是三个点的坐标阵列
    //传回[D, E, F];
    function solveDEF(point) {
    			//运用行列式解线性方程组
    		var matrix = new Matrix();  
    		var matrixArray = new Array();  
    		var rowArray = new Array();  
    		var ma, mb, mc; 
    		
    		//求过三点的圆的方程
    		//[x1, y1], [x2, y2], [x3, y3]
    		// ==> 方程x^2+y^2+Dx+Ey+F=0;
    		//解D, E, F
    		//var point = [[0,0],[1,1],[4,2]];
    		var x1 = point[0][0], y1 = point[0][1],
    			x2 = point[1][0], y2 = point[1][1],
    			x3 = point[2][0], y3 = point[2][1];
    		
    		//三元一次方程组[[A1,B1,C1], [A2,B2,C2], ...]
    
    		var a = [
    			[x1, y1, 1, x1*x1+y1*y1],
    			[x2, y2, 1, x2*x2+y2*y2],
    			[x3, y3, 1, x3*x3+y3*y3]
    		];
    		
    		  
    		//三阶
    		var rank = 3;
    		for (var i = 0; i < rank; i++) {  
    			matrixArray.push([a[i][0], a[i][1], a[i][2]]);  
    		}  		
    		
    		ma = matrix.deepCopy(matrixArray); 		
    		for (var i = 0; i < rank; i++) {  
    			ma[i][0] = -a[i][3];  
    		}  
    		
    		
    		mb = matrix.deepCopy(matrixArray);  
    		for (var i = 0; i < rank; i++) {  
    			mb[i][1] = -a[i][3];  
    		}  
    		  
    		mc = matrix.deepCopy(matrixArray);  
    		for (var i = 0; i < rank; i++) {  
    			mc[i][2] = -a[i][3];  
    		}  
    		  
    		var d, da, db, dc;
    		d = matrix.delta(matrixArray);  
    		da = matrix.delta(ma);  
    		db = matrix.delta(mb);  
    		dc = matrix.delta(mc);  
    		
    		return [da/d, db/d, dc/d];
    		  
    		/*
    		matrix.print(matrixArray);  
    		  
    		document.write('d = ' + d+'<br/>');  
    			matrix.print(ma);  
    		document.write('da = ' + da+'<br/>');  
    			matrix.print(mb);  
    		document.write('db = '+db+'<br/>');  
    		  	matrix.print(mc);  
    		document.write('dc = '+dc+'<br/>');  
    		var s = 'D = da/d = '+ (da/d).toFixed(2)+', E = db/d = '+(db/d).toFixed(2)
    			+', F = dc/d = '+(dc/d).toFixed(2);  
    		document.write(s+'<br/>');   */  
    }
    	</span>

    本节到此结束。欲知后事怎样。请看下回分解。


  • 相关阅读:
    moviepy音视频剪辑VideoClip类fl_image方法image_func报错ValueError: assignment destination is read-only解决办法
    moviepy音视频剪辑VideoClip类set_position方法pos参数的使用方法及作用
    moviepy音视频剪辑VideoClip类to_ImageClip方法使用注意事项
    moviepy音视频剪辑VideoClip类to_mask方法、to_RGB、afx方法
    moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解
    moviepy音视频剪辑:视频剪辑基类VideoClip详解
    老猿学5G:融合计费的Nchf和Nchf‘服务化接口消息Nchf_ConvergedCharging_Create、Update、Release和Notify
    Loadrunner 11 中Run-Time Setting详细参数说明
    Sublime 3基于python环境的使用
    LoadRunner常用方法
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7252048.html
Copyright © 2011-2022 走看看