python求两条直线的交点_用python计算一条射线到两个平面的交点

前两天,一个朋友找我(半个程序猿)用python帮他写数学模型,当时的我直接是懵逼的,当听到三维啥的时候,整个人都不好了,最终在周末花了3个小时把逻辑理了一遍,给小伙伴一个满意的答复了,话不多说,我来整理一下怎么用python来做数学!!!

首先题目是:建立一个三维坐标,有一个y点和一个x点,假设x点是匀速的,已知第一个x点的坐标,之后的坐标只知道方位角和高低角(相对于y点),相当于确定一个点和一个射线,以之之前的点做球,求球与射线的交点就是下一个点,要得出点的坐标

经分析下来:

初始点z的坐标为343.2

角度a 为方位角

角度b 为高低角

当高低角差值>0的时候 Zn+1 = Zn +10

当高低角差值<0的时候 Zn+1 = Zn - 10

当高低角差值=0的时候 Zn+1 = Zn

Xn+1 = Rn*1*sin(an+1)*cos(bn+1)

Yn+1 = Rn*1*sin(an+1)*sin(bn+1)

Zn+1 = Rn*cos(bn+1)

另外有一个excel表里面有方位角和高低角的值

思路就是先求出Z的坐标,再通过去求Rn,从而求出X和Y

表数据

开始码代码

一开始看到excel里几百条数据是懵逼的 一开始居然蠢到手动把数据放到列表里,后面突然想起来了python可以读excel表,于是上网查了下果然可

importxlrdimportos

Base_dir= os.path.dirname(__file__)

file_name= 'data_excel.xlsx'file_path= '%s/%s' %(Base_dir, file_name)defread_excel():#读取excel表里的数据 wb = xlrd.open_workbook(filename=file_path) # 获取整个excel表的内容

sheet1=wb.sheet_by_index(0) #通过索引获取sheet1这张表

cols= sheet1.col_values(2) # 获取第3列内容(高低角)

high_low_angle_data= cols[1:] 切割把标题切掉,剩下的就是高低角的数据

cols2= sheet1.col_values(1) 获取第2列的内容(方位角)

azimuth= cols2[1:] 切割把标题切掉,剩下的就是方位角的数据

point_z= 343.2

拓展:

获取表还可以通过name

sheet1 = wb.sheet_by_name('sheet1')

# 如想要取第二行的数据

hang = sheet1.row_values(1)

#如果要获取136.49

value = sheet1.cell_value(1,1) # 行 列

下面来判断Z的情况

for key_angle, value_angle inenumerate(high_low_angle_data):if (value_angle - high_low_angle_data[key_angle+1]) >0: #当高低角差值大于0时

point_z-= 10r= point_z/(math.cos(azimuth[key_angle+1]))

x= r*(math.sin(azimuth[key_angle+1])*(math.cos(high_low_angle_data[key_angle+1])))

y= r*(math.sin(azimuth[key_angle+1])*(math.sin(high_low_angle_data[key_angle+1])))if key_angle == 333:break

elif (value_angle - high_low_angle_data[key_angle+1]) <0: # 当高低角差值小于0时

point_z+= 10r= point_z / (math.cos(azimuth[key_angle + 1]))

x= r * (math.sin(azimuth[key_angle + 1]) * (math.cos(high_low_angle_data[key_angle + 1])))

y= r * (math.sin(azimuth[key_angle + 1]) * (math.sin(high_low_angle_data[key_angle + 1])))if key_angle == 333:break

else:

point_z=point_z #当高低角差值等于0时

r= point_z / (math.cos(azimuth[key_angle + 1]))

x= r * (math.sin(azimuth[key_angle + 1]) * (math.cos(high_low_angle_data[key_angle + 1])))

y= r * (math.sin(azimuth[key_angle + 1]) * (math.sin(high_low_angle_data[key_angle + 1])))if key_angle == 333:break

print(x, y, point_z)

最后执行方法,得到结果。。。

此篇博客主要讲的是用到到excel方法和判断思路,设计数学的一笔带过,如有需要请转载,尊重劳动成果!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值