[从头学数学] 第201节 几何证明选讲
2016-05-01 14:17
232 查看
剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第七转的修炼。
这次要研究的是[几何证明选讲]。
正剧开始:
星历2016年05月01日 14:07:58, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[几何证明选讲]。
谈到直线,小伟觉得有必要计算一些东西。
比如平面上两点之间的距离:
直线的斜率:
直线的截距:
从X轴逆时针旋转多少度,才能转成直线的角度呢?
两条直线是不是平行,要怎样才能知道?
两条直线的距离呢?
两条直线的夹角:
两条直线的交点:
一个点是不是在已知直线上呢?
点到直线的距离是多少?
说到圆,也有一些东西是小伟想计算出来的。
比如已知圆上三个点,这个圆的圆心在哪,半径多少?
一个点是在圆的内部呢,外部呢,圆上呢,怎样知道?
从圆外一点引圆的切线,切点在哪?
直线和圆的距离是多少呢?
如果直线和圆有交点,在哪?
本节到此结束,欲知后事如何,请看下回分解。
[机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第七转的修炼。
这次要研究的是[几何证明选讲]。
正剧开始:
星历2016年05月01日 14:07:58, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[几何证明选讲]。
谈到直线,小伟觉得有必要计算一些东西。
比如平面上两点之间的距离:
<span style="font-size:18px;">#两点之间 #平面两点的距离[x1, y1] -- [x2, y2] def distance2D(Point_1, Point_2): x1, y1, x2, y2 = Point_1[0], Point_1[1], Point_2[0], Point_2[1]; return ((x2-x1)**2+(y2-y1)**2)**0.5;</span>
直线的斜率:
<span style="font-size:18px;">#平面直线的斜率[x1, y1] -- [x2, y2] def slope(Point_1, Point_2): x1, y1, x2, y2 = Point_1[0], Point_1[1], Point_2[0], Point_2[1]; if (x1 == x2): return 'inf'; else: return (y2-y1)/(x2-x1);</span>
直线的截距:
<span style="font-size:18px;">#平面直线的截距[x1, y1] -- [x2, y2] def interceptOfLine(Point_1, Point_2): k = slope(Point_1, Point_2); if k == 'inf': return [k, Point_1[0], 1e8]; elif k == 0: return [k, 1e8, Point_1[1]]; else: return [k, Point_1[0]-Point_1[1]/k, Point_1[1]-Point_1[0]*k]; </span>
从X轴逆时针旋转多少度,才能转成直线的角度呢?
<span style="font-size:18px;">#平面直线与X轴的夹角[x1, y1] -- [x2, y2] def angleFromX(Point_1, Point_2): x1, y1, x2, y2 = Point_1[0], Point_1[1], Point_2[0], Point_2[1]; delta = ((x2-x1)**2+(y2-y1)**2)**0.5; dx = x2 - x1; dy = y2 - y1; sin = math.asin(dy / delta)/math.pi*180; cos = math.acos(dx / delta)/math.pi*180; if (dy >= 0 and dx >= 0): return math.asin(dy / delta)/math.pi*180; elif (dy >= 0 and dx < 0): return 180- math.asin(dy / delta)/math.pi*180; elif (dy < 0 and dx <= 0): return 180 - math.asin(dy / delta)/math.pi*180; else: return 360 + math.asin(dy / delta)/math.pi*180;</span>
两条直线是不是平行,要怎样才能知道?
<span style="font-size:18px;">#两直线之间 #两直线是否平行 Line_1:[Point_1, Point_2], Line_2:[Point_1, Point_2] def parallelCheck(Line_1, Line_2): L1_Point_1, L1_Point_2, L2_Point_1, L2_Point_2 = Line_1[0], Line_1[1], Line_2[0], Line_2[1]; k1, k2 = slope(L1_Point_1, L1_Point_2), slope(L2_Point_1, L2_Point_2); if k1 == k2 == 'inf': return True; elif k1 != 'inf' and k2 != 'inf' and abs(k1 - k2) < 1e-6: return True; return False;</span>
两条直线的距离呢?
<span style="font-size:18px;">#两直线距离 Line_1:[Point_1, Point_2], Line_2:[Point_1, Point_2] def lineDistance2D(Line_1, Line_2): if parallelCheck(Line_1, Line_2): L1_Point_1, L1_Point_2, L2_Point_1, L2_Point_2 = Line_1[0], Line_1[1], Line_2[0], Line_2[1]; k1, k2 = slope(L1_Point_1, L1_Point_2), slope(L2_Point_1, L2_Point_2); if k1 == 'inf': return abs(L1_Point_1[0] - L2_Point_1[0]); else: dx = L1_Point_1[0] - L2_Point_1[0]; dy = k1*dx; return abs((L2_Point_1[1]+dy-L1_Point_1[1])/(1+k1**2)**0.5); else: return 0; </span>
两条直线的夹角:
<span style="font-size:18px;">#两直线夹角 Line_1:[Point_1, Point_2], Line_2:[Point_1, Point_2] def angleBetweenTwoLine(Line_1, Line_2): L1_Point_1, L1_Point_2, L2_Point_1, L2_Point_2 = Line_1[0], Line_1[1], Line_2[0], Line_2[1]; return angleFromX(L2_Point_1, L2_Point_2) - angleFromX(L1_Point_1, L1_Point_2);</span>
两条直线的交点:
<span style="font-size:18px;">#两直线交点 Line_1:[Point_1, Point_2], Line_2:[Point_1, Point_2] def crossPointOfTwoLine(Line_1, Line_2): if not parallelCheck(Line_1, Line_2): L1_Point_1, L1_Point_2, L2_Point_1, L2_Point_2 = Line_1[0], Line_1[1], Line_2[0], Line_2[1]; ''' k1, k2 = slope(L1_Point_1, L1_Point_2), slope(L2_Point_1, L2_Point_2); if (k1 == 'inf'): return [L1_Point_1[0], L2_Point_1[1]-k2*(L2_Point_1[0]-L1_Point1[0])]; elif (K2 == 'inf'): return [L2_Point_1[0], L1_Point_1[1]-k1*(L1_Point_1[0]-L2_Point1[0])]; ''' x0, y0, x1, y1, x2, y2, x3, y3 = L1_Point_1[0], L1_Point_1[1], L1_Point_2[0], L1_Point_2[1],\ L2_Point_1[0], L2_Point_1[1], L2_Point_2[0], L2_Point_2[1]; crossY = ( (y0-y1)*(y3-y2)*x0 + (y3-y2)*(x1-x0)*y0 + (y1-y0)*(y3-y2)*x2 + (x2-x3)*(y1-y0)*y2 ) / \ ( (x1-x0)*(y3-y2) + (y0-y1)*(x3-x2) ); crossX = x2 + (x3-x2)*(crossY-y2) / (y3-y2); return [crossX, crossY];</span>
一个点是不是在已知直线上呢?
<span style="font-size:18px;">#判定三点共线 def pointInLine(Point_1, Point_2, Point_3): x0, y0, x1, y1, x2, y2 = Point_1[0], Point_1[1], Point_2[0], Point_2[1], Point_3[0], Point_3[1]; return (x0*y1-y0*x1)+(x1*y2-y1*x2)+(x2*y0-y2*x0) == 0;</span>
点到直线的距离是多少?
<span style="font-size:18px;">#点到直线的距离 def plDistance2D(Point, Line): LPoint_1, LPoint_2 = Line[0], Line[1]; if (pointInLine(Point, LPoint_1, LPoint_2)): return 0; else: k = slope(LPoint_1, LPoint_2); if k == 'inf': return abs(Point[0]-LPoint_1[0]); else: Point2 = [Point[0] + 10, Point[1] + 10 * k]; return lineDistance2D([Point, Point2], Line); </span>
说到圆,也有一些东西是小伟想计算出来的。
比如已知圆上三个点,这个圆的圆心在哪,半径多少?
<span style="font-size:18px;">#圆 三点成圆 #以确定的三点表示圆的方程,得到圆心和半径 [x1, y1] -- [x2, y2] -- [x3, y3] def circle(Point_1, Point_2, Point_3): if not pointInLine(Point_1, Point_2, Point_3): x1, y1, x2, y2, x3, y3 = Point_1[0], Point_1[1], Point_2[0], Point_2[1], Point_3[0], Point_3[1]; 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; #圆心 px = ((C1*B2)-(C2*B1))/((A1*B2)-(A2*B1)); py = ((A1*C2)-(A2*C1))/((A1*B2)-(A2*B1)); a = round(distance2D(Point_1, Point_2), 3); b = round(distance2D(Point_2, Point_3), 3); c = round(distance2D(Point_3, Point_1), 3); #半径 R = a*b*c/(4*b*b*c*c-(b*b+c*c-a*a)**2)**0.5; return [[px, py], R]; else: return [[0, 0], 0];</span>
一个点是在圆的内部呢,外部呢,圆上呢,怎样知道?
<span style="font-size:18px;">#判断点和圆的距离 Point:[x, y], Circle: [[x1, y1], [x2, y2], [x3, y3]] def pointFromCircle(Point, Circle): cPoint_1, cPoint_2, cPoint_3 = Circle[0], Circle[1], Circle[2]; circleCenter, R = circle(cPoint_1, cPoint_2, cPoint_3); d = distance2D(Point, circleCenter); #点与圆的位置关系,分为在内部,在外部和在圆上。 if (d < R): return 'IN'; elif (d > R): return 'OUT'; else: return 'ON';</span>
从圆外一点引圆的切线,切点在哪?
<span style="font-size:18px;">#过圆外部一点,得到与圆的切点的坐标 Point:[x, y], Circle: [[x1, y1], [x2, y2], [x3, y3]] def tangencyPoint(Point, Circle): if pointFromCircle(Point, Circle) == 'OUT': cPoint_1, cPoint_2, cPoint_3 = Circle[0], Circle[1], Circle[2]; circleCenter, R = circle(cPoint_1, cPoint_2, cPoint_3); x1, y1, x2, y2 = circleCenter[0], circleCenter[1], Point[0], Point[1]; dsquare = (x2-x1)**2+(y2-y1)**2; part_1 = (R*R*(y1-y2)**2*(dsquare-R*R))**0.5; part_2 = (y1-y2)*dsquare; #第一个切点 x3 = (-part_1+R*R*(x2-x1)+x1*dsquare)/dsquare; y3 = ((x1-x2)*part_1-R*R*(y1-y2)**2+y1*part_2)/part_2; #第二个切点 x4 = (part_1+R*R*(x2-x1)+x1*dsquare)/dsquare; y4 = (-(x1-x2)*part_1-R*R*(y1-y2)**2+y1*part_2)/part_2; return [[x3, y3], [x4,y4]]; return [[0,0], [0,0]];</span>
直线和圆的距离是多少呢?
<span style="font-size:18px;">#直线到圆的距离 def lcDistance2D(Line, Circle): lPoint_1, lPoint_2 = Line[0], Line[1]; cPoint_1, cPoint_2, cPoint_3 = Circle[0], Circle[1], Circle[2]; circleCenter, R = circle(cPoint_1, cPoint_2, cPoint_3); #圆心到直线的距离 d = plDistance2D(circleCenter, Line); return d-R;</span>
如果直线和圆有交点,在哪?
<span style="font-size:18px;">#直经与圆的交点 def lcCrossPoint2D(Line, Circle): #直线与圆相交 if lcDistance2D(Line, Circle) <= 0: lPoint_1, lPoint_2 = Line[0], Line[1]; cPoint_1, cPoint_2, cPoint_3 = Circle[0], Circle[1], Circle[2]; circleCenter, R = circle(cPoint_1, cPoint_2, cPoint_3); k, a, b = interceptOfLine(lPoint_1, lPoint_2); if k == 'inf': k = 1e8; c, d = -circleCenter[0], -circleCenter[1]; print(k, a, b, c, d, R); part_0 = (k*k+1)*R*R-c*c*k*k; part_1 = (2*c*d+ 2*b*c)*k- d*d-2*b*d-b*b; part_2 = (d+b)*k+c; part_3 = d*k*k-b; part_4 = (k*k+1); x1 = -((part_0 + part_1)**0.5+part_2)/part_4; y1 = -(k*((part_0+part_1)**0.5 + c)+part_3)/part_4; x2 = ((part_0+part_1)**0.5-part_2)/part_4; y2 = (k*((part_0+part_1)**0.5 - c)-part_3)/part_4; return [[x1, y1], [x2, y2]]; return [[1e8, 1e8], [1e8, 1e8]];</span>
本节到此结束,欲知后事如何,请看下回分解。
相关文章推荐
- Become a Command Line Ninja With These Time-Saving Shortcuts
- Instance Variables in ruby
- 最透彻的关于“随机数种子”和“伪随机数”的产生原理
- CentOS6.5安装JDK1.8
- Instance Variables in ruby
- date命令
- gmp大数运算库 window下安装配置和使用(下)
- [git]ssh: Could not resolve hostname github.com: nodename nor servname provided, or not known
- 2016 UESTC Training for Data Structures F - 郭大侠与“有何贵干?” CDOJ 1335 线段树 扫描线 离散化
- C++预处理器
- 【前端框架】Backbone.js在大型单页面应用中的应用实践
- 练习三1004
- 2016 UESTC Training for Data Structures E - 卿学姐与城堡的墙 CDOJ 1341 树状数组 逆序对 离散化
- 开启Visual Studio 2013时,出现Microsoft.VisualStudio.Web.PasteJson.JsonPackage无法载入的可能解決方案
- Shell scripts简单入门
- hdu5676 ztr loves lucky numbers 【打表】
- 2016 UESTC Training for Data Structures D - 卿学姐与魔法 CDOJ 1329 堆
- POJ-3616 Milking Time ( DP )
- opengl学习笔记
- 1000: A+B Problem