c++ - 查找两条 3d 线段的公共端点
问题描述
所以我有两个 3d 线段 A 和 B 唯一给定的是两个线段的起源和它们的长度。我需要以它们在同一位置结束的方式来定位两条线段。前任:
point3d common_end_position;
bool result= intersect_line_segments(
{0, 0, 0}, // position_0
2.0, // length_0
{2, 0, 0}, // position_1
2.0, // length_1
{0, 0, 1}, // hint_direction
&common_end_position);
该函数应返回 true,公共结束位置为 {1, 0, 1.7321} 如果它们不能定向以便它们在同一端点结束,则该函数将返回 false
解决方案
设位置是C1
和C2
,差向量是
D = C2-C1
,距离是d = |D|
,长度是r
和R
。
如果或P
_d > R + r
d < abs(R-r)
否则 on 的P
投影C1C2
有长度
x = (d^2 + R^2 - r^2) / (2d)
(数学世界页面)
和P
距离C1C2
是
y = sqrt(R^2-x^2)
如果保证提示向量H
垂直于D
,那么剩下的就很简单了:
1)获取归一化向量ud = D / d
2)找到投影点P' = C1 + ud * x
3)添加垂直向量P = P' + H * y
(假设单位H
向量)
如果H
可能不垂直(但不平行于C1C2
!)然后找到
H' = ud x (H x ud)
使用两个向量乘法并H'
改为使用。
推荐阅读
- wordpress - 如何使用 AWS 在同一台服务器上托管网站和 Web 应用程序?
- mysql - #1072 - 表 insql 中不存在键列“部门”
- c# - C# Chromium 浏览器 whatsapp web 使用文本框发送消息
- reactive-programming - SkipWhile 检查条件是否在 RxJava 中持续保持
- apache-spark - Dataproc 中的 Pyspark 检查点(StackOverFlowError)
- angular - 带有 x-www-form-urlencoded 数据的 Angular 6 http 发布请求
- bash - 如何使用 gcloud 命令为谷歌平衡器创建前端服务?
- javascript - Javascript/jQuery 表格元素抓取
- c++ - 推导出容器和 initializer_list-s 的模板函数
- google-analytics - 滚动跟踪 & 跳出率 & Adwords QS