惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
I
InfoQ
C
Check Point Blog
IT之家
IT之家
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
Last Week in AI
Last Week in AI
GbyAI
GbyAI
P
Proofpoint News Feed
量子位
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
B
Blog
T
The Blog of Author Tim Ferriss
H
Help Net Security
云风的 BLOG
云风的 BLOG

遐说

2026第一场日出日落-黄山 [徒步]宁波九龙爱心线 [徒步]仙居公盂徒步+丽人谷溯溪(多图) 文献引用批量标注蓝色-Zotero/EndNote [出差]内蒙草原风光 [徒步]浙东小九寨 [徒步]西湖小猫线 微软Office365家庭版拼车5年180 2024浏阳跨年烟火 一路向北-广西 落日余晖——武汉东湖 博士论文盲审通过 青海出差 我开盒了我自己 hexo-butterfly+artalk无法显示文章PV浏览次数 记某站字体混淆解析方案 记第一次进藏 2024川西大环线 Python读取NetCDF文件-裁剪&计算 2024武汉东湖樱花园 zotero批量修改条目语言解决”等”和”et al”混排问题 torch_geometric_temporal安装报错找不到to_dense_adj 武汉冻雨&乡村春节 云南镇雄县凉水村滑坡:卫星影像解析 博客聚合平台RSS订阅-BlogFinder&博友圈&十年之约 腾讯云CDN正式取消免费10G流量包 2023跨年闲逛武汉 观感|小米SU7技术发布会 【留痕】解密微信聊天记录工具:年度报告、聊天导出一键搞定! 小米电脑管家 vs. MIUI+: 手机与PC协同体验大比拼!
通过三个点绘制三维圆弧-python
Dorad · 2019-09-23 · via 遐说

起源于某同学今年打研究生数学建模竞赛。绘制飞机航迹图。通过中心点坐标c(x,y,z)端点坐标1p1(x,y,z)端点坐标2p2(x,y,z),绘制三维圆弧。起初以为很简单,接锅后发现事情不简单。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55










import numpy as np
from scipy.sparse.linalg import expm
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


def get_sita(p):
sita = np.arccos(np.dot(np.array((1, 0, 0)), p) / np.linalg.norm(p))
if (p[1] < 0):
sita = np.pi * 2 - sita
return sita


def get_arc_points(center, p1, p2, step=0.01):
center = np.array(center)
p1 = np.array(p1)
p2 = np.array(p2)

R = np.sqrt(np.sum(np.power(p1 - center, 2)))

cp = np.cross(center - p1, p2 - p1)
a, b, c = cp
d = np.dot(cp, center)

cs = np.arccos(np.dot(p1 - center, p2 - center) / np.linalg.norm(p1 - center) / np.linalg.norm(p2 - center))
roteAxis = np.cross(cp, [0, 0, 1])
sita = np.arccos(np.dot(cp, [0, 0, 1]) / np.linalg.norm(cp))
if (get_sita(cp - np.array((0, 0, 1)))) > 0:
sita = -sita
roteMatrix = expm(np.cross(np.eye(3), roteAxis / np.linalg.norm(roteAxis) * sita))
roteBackMatrix = expm(np.cross(np.eye(3), roteAxis / np.linalg.norm(roteAxis) * (-sita)))
P = np.vstack((center, p1, p2))
RP = np.dot(P, roteMatrix)
sp1 = get_sita(RP[1, :] - RP[0, :])
sp2 = get_sita(RP[2, :] - RP[0, :])
if np.abs(sp1 - sp2) > np.pi:
st = np.hstack((np.arange(sp1, 2 * np.pi, step), np.arange(0, sp2, step))) if sp1 > sp2 else np.hstack(
(np.arange(sp2, 2 * np.pi, step), np.arange(0, sp1, step)))
else:
st = np.arange(sp1, sp2, step) if sp2 > sp1 else np.arange(sp2, sp1, step)
arc = np.array((R * np.cos(st) + RP[0, 0], R * np.sin(st) + RP[0, 1], st * 0 + RP[0, 2]))
for i in np.arange(0, arc.shape[1]):
arc[:, i] = np.dot(arc[:, i], roteBackMatrix)
return arc