前两天,一个朋友找我(半个程序猿)用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方法和判断思路,设计数学的一笔带过,如有需要请转载,尊重劳动成果!!!

用python计算一条射线到两个平面的交点的更多相关文章

  1. 在3D中两条射线的相交性检测

    摘自[3D数学基础: 图形与游戏开发] 考虑在3D中两条以参数形式定义的射线: \(\vec{r_1}(t_1)=\vec{p_1}+t_1\vec{d_1}\) \(\vec{r_2}(t_2)=\ ...

  2. Python之进度条及π的计算

    Python之进度条及π的计算 文本进度条 1.  简单的开始 这是利用print()函数来实现简单的非刷新文本进度条.它的基本思想是按照任务执行百分比将整个任务划分为100个单位,每执行N%输出一次 ...

  3. 利用Python计算π的值,并显示进度条

    利用Python计算π的值,并显示进度条  第一步:下载tqdm 第二步;编写代码 from math import * from tqdm import tqdm from time import ...

  4. 用Python计算幂的两种方法,非递归和递归法

    用Python计算幂的两种方法: #coding:utf-8 #计算幂的两种方法.py #1.常规方法利用函数 #不使用递归计算幂的方法 """ def power(x, ...

  5. Python计算斗牛游戏的概率

    Python计算斗牛游戏的概率 过年回家,都会约上亲朋好友聚聚会,会上经常会打麻将,斗地主,斗牛.在这些游戏中,斗牛是最受欢迎的,因为可以很多人一起玩,而且没有技术含量,都是看运气(专业术语是概率). ...

  6. [转载] python 计算字符串长度

    本文转载自: http://www.sharejs.com/codes/python/4843 python 计算字符串长度,一个中文算两个字符,先转换成utf8,然后通过计算utf8的长度和len函 ...

  7. python 计算校验和

    校验和是经常使用的,这里简单的列了一个针对按字节计算累加和的代码片段.其实,这种累加和的计算,将字节翻译为无符号整数和带符号整数,结果是一样的. 使用python计算校验和时记住做截断就可以了. 这里 ...

  8. python计算时间差的方法

    本文实例讲述了python计算时间差的方法.分享给大家供大家参考.具体分析如下: 1.问题: 给定你两个日期,如何计算这两个日期之间间隔几天,几个星期,几个月,几年? 2.解决方法: 标准模块date ...

  9. 用Python计算最长公共子序列和最长公共子串

    如何用Python计算最长公共子序列和最长公共子串 1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公 ...

随机推荐

  1. Working copy not locked; this is probably a bug, please report

    问题描述 svn: Unable to lock 'G:\chengXu\2017_Year\JFW\Easy7\src' 解决方案

  2. IntelliJ IDEA快捷键设置

      IntelliJ IDEA是java编程语言开发的集成环境,目前有很多用户喜欢使用IDEA进行相关开发,IDEA使用起来十分方便,本篇博客主要是介绍IDEA快捷键(Keymap)的设置和使用. I ...

  3. AM335X的应用程序自启动流程以及U盘更新应用程序记录

    在AM335X的SD卡更新系统学习记录中最后更新完系统后,以后运行应用程序都会从EMMC中取出Linux系统运行.接着介绍Linux系统是怎么自己启动我们编写的应用程序的. 1.在AM335X的SD卡 ...

  4. 随缘记录 LeetCode第168场周赛 2019-12-22

    5292. 划分数组为连续数字的集合 给你一个整数数组 nums 和一个正整数 k,请你判断是否可以把这个数组划分成一些由 k 个连续数字组成的集合. 如果可以,请返回 True:否则,返回 Fals ...

  5. 【Unity|C#】基础篇(0)——C#与.NET框架

    [学习资料] <C#图解教程>(第1章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu.c ...

  6. 抽象语法树 Abstract syntax tree

    什么是抽象语法树? 在计算机科学中,抽象语法和抽象语法树其实是源代码的抽象语法结构的树状表现形式 在线编辑器 我们常用的浏览器就是通过将js代码转化为抽象语法树来进行下一步的分析等其他操作.所以将js ...

  7. AcWing 842. 排列数字

    深搜的一道水题 https://www.acwing.com/problem/content/844/   正确输入输出 #include<bits/stdc++.h> using nam ...

  8. [RedHat]“is not in the sudoers file”解决方法

    当在终端执行sudo命令时,系统提示“luckchengis not in the sudoers file”: $ sudo ls Password: luckcheng is not in the ...

  9. [AGC027E]ABBreviate

    Description AGC027E 给定一个仅由\(AB\)构成的字符串\(S\),给定两个操作,把\(AA\)换成\(B\),和把\(BB\)换成\(A\),问由这个字符串和任意次操作可以得到几 ...

  10. django入门(二)MTV开发模式

    MTV开发模式,顾名思义,M是models,T是templates,V是view. 之前的教程没有牵扯到html,然后今天将告诉你如何转到自己做的静态页面 首先还是先创建一个app,python ma ...