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

  • 相关阅读:
    Java实现 蓝桥杯 历届试题 翻硬币
    后台管理UI推荐
    js跳转页面方法(转)
    Request常用方法 (总结)
    Eclipse项目 迁移到 Intellj IDEA
    由后端来类比前端设计的思考(转)
    数据库字段命名及设计规范(转)
    如何改变Myeclipse编辑区背景色(转)
    Myeclipse和windows调节成护眼色
    qt截获html请求(继承QNetworkAccessManager和QNetworkReply)
  • 原文地址:https://www.cnblogs.com/huizaia/p/11074057.html
Copyright © 2011-2022 走看看