用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) 最长公 ...
随机推荐
- java下载和环境变量配置
初学java,以前没有接触过这方面内容,所以简要记录一下我2个月的学习流程. 首先,我在慕课上学习java的基础,浙江大学翁恺老师的课程. 下载ECLIPSE-java 进入官网:https://ww ...
- MODBUS TCP/IP协议规范详细介绍
1.该规范的发展概况 原始版本1997年9月3日作为公共评论的草案. 再版1999年3月29日,即修订版1.0. ...
- 路飞-后台home模块
home模块 创建home模块 """ 前提:在 luffy 虚拟环境下 1.终端从项目根目录进入apps目录 >: cd luffyapi & cd ap ...
- C++11 auto的用法
参考博客:https://www.cnblogs.com/KunLunSu/p/7861330.html
- 牛客多校第二场H Second Large Rectangle 单调栈or悬线法
Second Large Rectangle 题意 给出n*m的01矩阵,问由1组成的第二大的矩阵的大小是多少? 分析 单调栈(or 悬线法)入门题 单调栈 预处理出每一个点的最大高度,然后单调栈每一 ...
- HTML5学习(1)简介
HTML5是HTML最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制定. HTML5的设计目的是为了在移动设备上支持多媒体. HTML5 简单易学. 什么是 HTML5? HTML5 ...
- 使用java实现AES算法的加解密(亲测可用)
话不多说,直接上代码 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.cryp ...
- webstorm运行npm run dev慢
打开cmd窗口输入: npm config set registry https://registry.npm.taobao.org 再输入npm run dev就变快了
- ACM-ICPC实验室20.2.21测试-图论(二)
A.患者的编号 给出一个有向图,要求你输出字典序最小的拓扑排序. 常规拓扑排序是做不了的,正解是反向建图,同时用大根堆的优先队列维护,保证每次优先访问编号大的结点,再反向输出~ #include< ...
- 创建Vue项目及其内容分析
利用 vue 脚手架开发企业级应用 # 全局安装 vue-cli npm install --global vue-cli # 创建一个基于 webpack 模板的新项目 ...