鱼C论坛

 找回密码
 立即注册
查看: 1777|回复: 13

[已解决]关于函数中调用函数的参数传递问题

[复制链接]
发表于 2020-2-12 19:41:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Kituro_ 于 2020-2-12 19:41 编辑

写了一个平面直角坐标系内求两直线交点的小程序,没学过解析几何,于是使用了用求一次函数交点的方式进行计算
初始使用需要传入四个点的坐标参数,使用待定系数法求出函数的解析式
这里遇到了一个问题,请看如下图红圈所标注的代码:

                               
登录/注册后可看大图

这里调用analytic函数计算函数解析式,传入了StartX2,StartY2,EndX2,EndY2这四个参数,对应analytic函数参数列表中的x_1到y_2。
可是这四个参数并没有被传到analytic函数中进行计算,被传入的反而是StartX1,StartY1,EndX1,EndY1这四个参数
简而言之,参数传错了!
VSCode把光标放在变量名上可以显示出变量的值:

                               
登录/注册后可看大图


                               
登录/注册后可看大图

这样就出现了ZeroDivisionError的错误。


  1. def analytic(x_1,y_1,x_2,y_2):      #定义一个计算一次函数解析式的函数
  2.     p = x_1 - x_2                   #模拟待定系数法
  3.     q = y_1 - y_2
  4.     k = q / p                       #求出斜率k
  5.     b = y_1 - (k * x_1)             #求出常数项b
  6.     return k,b                      #返回 k,b

  7. def point(StartX1,StartY1,EndX1,EndY1,StartX2,StartY2,EndX2,EndY2):     #定义计算两直线交点的函数,传入两组起始点坐标与终点坐标(第一组StartX1-EndY1,第二组StartX2-EndY2)
  8.     if StartX1 == EndX1:                                                #当第一组起始点的横坐标与终点的横坐标一致时(即该直线不能用一次函数表示,该直线垂直于x轴)
  9.         k_2,b_2 = analytic(StartX2,StartY2,EndX2,EndY2)                 #调用analytic函数计算关于第二组点的函数解析式
  10.         aimX = StartX1                                                  #两直线的交点的横坐标(aimX)即为第一组起始点的横坐标
  11.         aimY = (StartX1 * k_2) + b_2                                    #利用解析式 y = kx + b ,求出aimY
  12.     if StartX2 == EndX2:                                                #同上,当第二组起始点横坐标与终点横坐标相等时
  13.         k_1,b_1 = analytic(StartX1,StartY1,EndX1,EndY1)
  14.         aimX = StartX2
  15.         aimY = (StartX2 * k_1) + b_1
  16.     if StartY1 == EndY1:                                                #当第一组起始点纵坐标与终点纵坐标相等时
  17.         k_2,b_2 = analytic(StartX2,StartY2,EndX2,EndY2)
  18.         aimX = (StartY1 - b_2) / k_2                                    #利用 y = kx + b,则 x = (y - b) / k 求出aimX
  19.         aimY = StartY1
  20.     if StartY2 == EndY2:                                                #同上
  21.         k_1,b_1 = analytic(StartX1,StartY1,EndX1,EndY1)
  22.         aimX = (StartY2 - b_1) / k_1
  23.         aimY = StartY2
  24.     k_1,b_1 = analytic(StartX1,StartY1,EndX1,EndY1)                     #正常情况下(当两组点的横坐标与纵坐标不相等时)计算两直线交点
  25.     k_2,b_2 = analytic(StartX2,StartY2,EndX2,EndY2)
  26.     m = k_1 - k_2                                                       #模拟解二元一次方程
  27.     n = b_2 - b_1                                                      
  28.     aimX = n / m                                                        #求出aimX与aimY
  29.     aimY = (k_1 * aimX) + b_1
  30.     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 )
最佳答案
2020-2-12 21:19:02
Kituro_ 发表于 2020-2-12 21:04
感谢

逻辑有些问题
判断与x轴平行或与y轴平行以及后续处理
都应该放在analytic这个函数中做
这样在做第二个函数时,只要判断一下这两条线是否平行就可以了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-12 19:45:53 From FishC Mobile | 显示全部楼层
只有一个交点吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-12 20:05:49 | 显示全部楼层

欧式几何下两条直线只有一个交点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 20:08:02 From FishC Mobile | 显示全部楼层
Kituro_ 发表于 2020-2-12 20:05
欧式几何下两条直线只有一个交点

a.b.c.d四点ab  交cd   ac  交bd  ad交bc   ???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-12 20:10:46 | 显示全部楼层
wp231957 发表于 2020-2-12 20:08
a.b.c.d四点ab  交cd   ac  交bd  ad交bc   ???

这个的话,只计算两条直线,是根据输入的参数的顺序来判定的,a,b两点对应的是第一条直线,c,d两点对应的是第二条直线
我代码里的StartX1,StartY1对应的是a点的坐标,EndX1,EndY1对应的是b点的坐标
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 20:43:50 | 显示全部楼层
Kituro_ 发表于 2020-2-12 20:10
这个的话,只计算两条直线,是根据输入的参数的顺序来判定的,a,b两点对应的是第一条直线,c,d两点对应的 ...

直接数学模型????
m=(-3,4)
n=(1,-8)
p=(-1,2)
q=(2,5)

a1=(m[1]-n[1])/(m[0]-n[0])
b1=m[1]-a1*m[0]

a2=(p[1]-q[1])/(p[0]-q[0])
b2=p[1]-a2*p[0]

print(a1,b1,a2,b2)

x0=(b2-b1)/(a1-a2)
y0=b2+a2*x0

result=(x0,y0)

print(result)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-12 20:47:05 | 显示全部楼层
wp231957 发表于 2020-2-12 20:43
直接数学模型????
m=(-3,4)
n=(1,-8)

嗯,感谢dalao的指正,但是如原帖中的问题,为什么函数中调用函数传递参数时会出错.....
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 20:58:56 From FishC Mobile | 显示全部楼层
Kituro_ 发表于 2020-2-12 20:47
嗯,感谢dalao的指正,但是如原帖中的问题,为什么函数中调用函数传递参数时会出错.....

哈,等我有空帮你看一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-12 21:04:13 | 显示全部楼层
wp231957 发表于 2020-2-12 20:58
哈,等我有空帮你看一下

感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 21:19:02 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
Kituro_ 发表于 2020-2-12 21:04
感谢

逻辑有些问题
判断与x轴平行或与y轴平行以及后续处理
都应该放在analytic这个函数中做
这样在做第二个函数时,只要判断一下这两条线是否平行就可以了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-12 21:30:46 | 显示全部楼层
wp231957 发表于 2020-2-12 21:19
逻辑有些问题
判断与x轴平行或与y轴平行以及后续处理
都应该放在analytic这个函数中做

嗯,确实,不过这个功能是一个项目里的内容,真正使用的话不会出现两条直线平行的情况的
仅仅是逻辑有问题吗,如果在其他程序的其他函数里调用了另一函数并且进行了参数的传递,会出现传错参数的可能吗?问题有点多,请dalao见谅
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 21:33:09 From FishC Mobile | 显示全部楼层
Kituro_ 发表于 2020-2-12 21:30
嗯,确实,不过这个功能是一个项目里的内容,真正使用的话不会出现两条直线平行的情况的
仅仅是逻辑有问 ...

我手机发贴,看你的图片看不太清楚
不过我好像看到有除0的错误
这必然是有平行出现
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 21:35:04 From FishC Mobile | 显示全部楼层
Kituro_ 发表于 2020-2-12 21:30
嗯,确实,不过这个功能是一个项目里的内容,真正使用的话不会出现两条直线平行的情况的
仅仅是逻辑有问 ...

不管参数是咋来的,你的函数都应该做好判断,
这是你这个函数的任务
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 21:43:37 From FishC Mobile | 显示全部楼层
Kituro_ 发表于 2020-2-12 21:30
嗯,确实,不过这个功能是一个项目里的内容,真正使用的话不会出现两条直线平行的情况的
仅仅是逻辑有问 ...

函数必须有处理参数非法的能力
不然你还指望着调用者必须百分之百的传入正确参数????
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-3 11:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表