用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表,于是上网查了下果然可

import xlrd
import os


Base_dir = os.path.dirname(__file__)

file_name = 'data_excel.xlsx'
file_path = '%s/%s' % (Base_dir, file_name)


def read_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 in enumerate(high_low_angle_data):

        if (value_angle - high_low_angle_data[key_angle+1]) > 0: #当高低角差值大于0时
            point_z -= 10
            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

        elif (value_angle - high_low_angle_data[key_angle+1]) < 0: # 当高低角差值小于0时
            point_z += 10
            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

        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方法和判断思路,设计数学的一笔带过,如有需要请转载,尊重劳动成果!!!

posted @ 2019-06-23 20:06  辉辉辉辉a  阅读(1039)  评论(0编辑  收藏  举报