用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方法和判断思路,设计数学的一笔带过,如有需要请转载,尊重劳动成果!!!
用python计算一条射线到两个平面的交点的更多相关文章
- 在3D中两条射线的相交性检测
摘自[3D数学基础: 图形与游戏开发] 考虑在3D中两条以参数形式定义的射线: \(\vec{r_1}(t_1)=\vec{p_1}+t_1\vec{d_1}\) \(\vec{r_2}(t_2)=\ ...
- Python之进度条及π的计算
Python之进度条及π的计算 文本进度条 1. 简单的开始 这是利用print()函数来实现简单的非刷新文本进度条.它的基本思想是按照任务执行百分比将整个任务划分为100个单位,每执行N%输出一次 ...
- 利用Python计算π的值,并显示进度条
利用Python计算π的值,并显示进度条 第一步:下载tqdm 第二步;编写代码 from math import * from tqdm import tqdm from time import ...
- 用Python计算幂的两种方法,非递归和递归法
用Python计算幂的两种方法: #coding:utf-8 #计算幂的两种方法.py #1.常规方法利用函数 #不使用递归计算幂的方法 """ def power(x, ...
- Python计算斗牛游戏的概率
Python计算斗牛游戏的概率 过年回家,都会约上亲朋好友聚聚会,会上经常会打麻将,斗地主,斗牛.在这些游戏中,斗牛是最受欢迎的,因为可以很多人一起玩,而且没有技术含量,都是看运气(专业术语是概率). ...
- [转载] python 计算字符串长度
本文转载自: http://www.sharejs.com/codes/python/4843 python 计算字符串长度,一个中文算两个字符,先转换成utf8,然后通过计算utf8的长度和len函 ...
- python 计算校验和
校验和是经常使用的,这里简单的列了一个针对按字节计算累加和的代码片段.其实,这种累加和的计算,将字节翻译为无符号整数和带符号整数,结果是一样的. 使用python计算校验和时记住做截断就可以了. 这里 ...
- python计算时间差的方法
本文实例讲述了python计算时间差的方法.分享给大家供大家参考.具体分析如下: 1.问题: 给定你两个日期,如何计算这两个日期之间间隔几天,几个星期,几个月,几年? 2.解决方法: 标准模块date ...
- 用Python计算最长公共子序列和最长公共子串
如何用Python计算最长公共子序列和最长公共子串 1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公 ...
随机推荐
- Charles 查看https请求数据 Mac/ android
Charles_v4.0.1_Mac_破解版下载地址:https://pan.baidu.com/s/1c23VPuS 1.在Mac电脑上安装Charles的根证书 打开Charles->菜单H ...
- css 页面滚动 多背景固定不动
经常看到一些网站,滚动页面但是背景图不会跟着滚动,好像一直固定在浏览器窗口,感觉挺酷的,哇哦 ~ ~ 原来都是 background-attachment 这位大兄弟的功劳 background-at ...
- HTML的内联框架(iframe)
HTML的内联框架(iframe) 第一种:打开网页就是带内联框架的页面 可以实现在自己的网页内部,打开另一个网页 语法: <!--src:地址frameborder:0为无边框:1为有边框-- ...
- selenium grid的使用
Selenium grid是用来分布式执行测试用例脚本的工具,比如测试人员经常要测试多浏览器的兼容性,那就可以用到grid了. selenium grid的hub相当于一个接收脚本并分发脚本的角色,n ...
- DVWA全级别之XSS(Reflected)、XSS(Stored)【跨站脚本攻击】
XSS XSS,全称Cross Site Scripting,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要强 ...
- php抛出异常Exception和\Exception使用区别
没有定义命名空间的情况下 , Exception和\Exception 均可正常执行抛出异常;定义命名空间的情况 , Exception 会在定义的命名空间下找对应的异常类 , 如果没有定义异常类 , ...
- C语言合法标识符 题解
输入一个字符串,判断其是否是C的合法标识符. Input输入数据包含多个测试实例,数据的第一行是一个整数n,表示测试实例的个数,然后是n行输入数据,每行是一个长度不超过50的字符串. Output对 ...
- IntelliJ IDEA 2017.3尚硅谷-----显示行号和方法分隔符
- C语言随笔5:函数、函数指针
函数 C语言中函数参数传递时,将实参的值拷贝到函数参数的存储区中.这种传递参数的方式称为按值传递. 函数不会访问实参本身,访问的是函数存储在栈区的副本,不会改变实参.函数凋用结束,函数在栈区的内容释放 ...
- Saber-图集
PS:狙击手