在3d中移动点的集合
Shift set of points in 3d
我在3d中有一组点。我把这些点连接起来,形成一条直线。我必须得到另一条线,它是这条线的位移版本,使得最终的位移总是在原始线的右边。解决这个问题的方法是什么?如何每次都使上向量在正确的方向上?
假设这些点位于一个球体上。看看球体的顶视图,我想要这样写
////
////
第一行是点的原始集合,第二行是移位的集合
好的,我正在添加代码
std::vector<osg::Vec3> vertArray; // The array containig the 3d points
std::vector<osg::Vec3> shiftVec; // The array to store the shifted vectors
osg::Vec3 line1, line2, result, upVec, p1, p2, cross1, cross2;
result = vertArray[1] - vertArray[0];
result.normalise();
result = result X upVec; // i am not sure how to get this upvec for general set of points
shiftVec.push_back(result);
for(unsigned int i = 1; i < vertArray.size() - 1; i++)
{
line 1 = vertArray[i-1] - vertArray[i];
line 2 = vertArray[i+1] - vertArray[i];
line1.normalise();
line2.normalise();
upVec = line1 X line2;
line 1 = line1 X upVec;
p1 = vertArray[i-1] + line1;
line 2 = line2 X upVec;
p2 = vertArray[i+1] + line2;
cross1 = upVec;
cross2 = (p2-p1)X line2
float factor = cross2.lenght()/cross1.length();
result = p1+line1*factor;
result = result - vertArray[i];
shiftVec.push_back(result);
}
result = vertArray[i] - vertArray[i-1];
result.normalise();
result = result X upVec; // i am not sure how to get this upvec for general set of points
shiftVec.push_back(result);
看这里:ECEF <-> ENU坐标,这可能有帮助
我宁愿使用NEH本地北、东、高(或海拔)坐标系
- 类似罗盘+高度计
- 如果你没有在旋转轴方向(ECEF z轴)…在波兰人
- 则
North
向量就是(0,0,6356754.7)-viewer_position
(全部在ECEF中) -
East,West
向量可以得到North x (0,0,6356754.7)
- 不记得是东还是西(取决于你的坐标系和交叉乘子顺序)
- 目视检查,如果错误,颠倒顺序或否定结果
-
Up
矢量(高度或海拔)很容易从这只是Up=North x East
或Up=North x West
如果方向错误,请再次反转或否定结果…
- 6356754.7 [m]为地球极半径
- 如果你从极点(ECEF z轴)看
- 则North vector和Up vector在同一轴上(相反方向)
- 这意味着没有东方或西方(奇点) 南半球的
- 通常使用south而不是North
-
South = (0,0,-6356754.7)-viewer_position
如果三个点分别是A, B和c,那么这三个点定义了一个平面。一般来说,这些点不在一条直线上。如果他们这样做,那么"正确"的含义就变得模棱两可了。如果所有的东西都在一个球体上,那么这三点将定义一个由球体和平面相交形成的曲线。你可以通过求球面与平行平面的交点来形成另一条直线。
我不太确定你想要什么,但我猜你想要第二条线在一个平行平面上。你可以通过求外积N=(A-B) X (C-B)
找到这个平面的法向量。看起来你正在做这样的事情,但你需要^
操作符。见https://www8.cs.umu.se/kurser/TDBD12/VT04/lab/osg/html/doc + +/用osg Vec3.html # DOC.2.224.21
upVec = line1 ^ line2;
相关文章:
- 处理多个异常集合的C++方法
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何将ampl中的集合表示为c++中的向量
- 检查值是否在集合p1和p2中,但不在p3中
- 如何从具有移动语义的类对象中生成共享指针
- 带过滤器的现代迭代c++集合
- 如何将结构插入到集合中并打印集合的成员
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- 集合上的输出迭代器:assign和increment迭代器
- 如何将函数集合传递给客户端类,以便将它们当作客户端类本身的成员使用
- 实现一个在集合上迭代的模板函数
- std::set的替代品(可以将元素从一个集合移动到另一个集合)
- 在集合之间移动“ unique_ptr”
- 移动语义、标准集合和构造时间地址
- 将unique_ptr从一个集合移动到另一个集合
- 不能移动集合迭代器
- 在3d中移动点的集合