|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Kituro_ 于 2020-2-12 19:41 编辑
写了一个平面直角坐标系内求两直线交点的小程序,没学过解析几何,于是使用了用求一次函数交点的方式进行计算
初始使用需要传入四个点的坐标参数,使用待定系数法求出函数的解析式
这里遇到了一个问题,请看如下图红圈所标注的代码:
这里调用analytic函数计算函数解析式,传入了StartX2,StartY2,EndX2,EndY2这四个参数,对应analytic函数参数列表中的x_1到y_2。
可是这四个参数并没有被传到analytic函数中进行计算,被传入的反而是StartX1,StartY1,EndX1,EndY1这四个参数
简而言之,参数传错了!
VSCode把光标放在变量名上可以显示出变量的值:
这样就出现了ZeroDivisionError的错误。
- def analytic(x_1,y_1,x_2,y_2): #定义一个计算一次函数解析式的函数
- p = x_1 - x_2 #模拟待定系数法
- q = y_1 - y_2
- k = q / p #求出斜率k
- b = y_1 - (k * x_1) #求出常数项b
- return k,b #返回 k,b
- def point(StartX1,StartY1,EndX1,EndY1,StartX2,StartY2,EndX2,EndY2): #定义计算两直线交点的函数,传入两组起始点坐标与终点坐标(第一组StartX1-EndY1,第二组StartX2-EndY2)
- if StartX1 == EndX1: #当第一组起始点的横坐标与终点的横坐标一致时(即该直线不能用一次函数表示,该直线垂直于x轴)
- k_2,b_2 = analytic(StartX2,StartY2,EndX2,EndY2) #调用analytic函数计算关于第二组点的函数解析式
- aimX = StartX1 #两直线的交点的横坐标(aimX)即为第一组起始点的横坐标
- aimY = (StartX1 * k_2) + b_2 #利用解析式 y = kx + b ,求出aimY
- if StartX2 == EndX2: #同上,当第二组起始点横坐标与终点横坐标相等时
- k_1,b_1 = analytic(StartX1,StartY1,EndX1,EndY1)
- aimX = StartX2
- aimY = (StartX2 * k_1) + b_1
- if StartY1 == EndY1: #当第一组起始点纵坐标与终点纵坐标相等时
- k_2,b_2 = analytic(StartX2,StartY2,EndX2,EndY2)
- aimX = (StartY1 - b_2) / k_2 #利用 y = kx + b,则 x = (y - b) / k 求出aimX
- aimY = StartY1
- if StartY2 == EndY2: #同上
- k_1,b_1 = analytic(StartX1,StartY1,EndX1,EndY1)
- aimX = (StartY2 - b_1) / k_1
- aimY = StartY2
- k_1,b_1 = analytic(StartX1,StartY1,EndX1,EndY1) #正常情况下(当两组点的横坐标与纵坐标不相等时)计算两直线交点
- k_2,b_2 = analytic(StartX2,StartY2,EndX2,EndY2)
- m = k_1 - k_2 #模拟解二元一次方程
- n = b_2 - b_1
- aimX = n / m #求出aimX与aimY
- aimY = (k_1 * aimX) + b_1
- return aimX,aimY #返回aimX与aimY
复制代码
我写的代码可能比较难理解(您是dalao另说),这里说明一下:
知道一次函数经过两个点,并且知道这两点的坐标,如何求该函数的解析式?
例子:
如图,已知该一次函数经过a( 1.5 , 0 )与b( -3 ,0 )两点,求函数解析式:
因为一次函数的解析式都可化为 y = kx + b 的形式,不妨设1.5x + b = 0 , 0x + b = -3
联立两个方程,易得斜率k = 2,常数项b = -3
现在有四个点,对应两个不同的一次函数,求他们的交点:
对这四个点如法炮制,分别求出两函数的解析式:y = 2x - 3和y = -x -3
随后使用解析式列方程 2x - 3 = -x - 3
解得交点的横坐标为0
将x = 0随便带入一个解析式即可求出交点的纵坐标为-3
所以交点的坐标为( 0,-3 )
Kituro_ 发表于 2020-2-12 21:04
感谢
逻辑有些问题
判断与x轴平行或与y轴平行以及后续处理
都应该放在analytic这个函数中做
这样在做第二个函数时,只要判断一下这两条线是否平行就可以了
|
|