在3d中转移点集

时间:2014-06-03 16:01:09

标签: c++ math vector-graphics

我在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);

2 个答案:

答案 0 :(得分:0)

如果你的三个点是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;

答案 1 :(得分:0)

看这里:ECEF <-> ENU coordinates这可能会有所帮助

我宁愿使用NEH本地北,东,高(或海拔)坐标系

  • 类似于罗盘+高度计
  • 如果您没有查看旋转轴方向(ECEF Z轴)......在杆上
  • 然后North向量只是(0,0,6356754.7)-viewer_position(全部在ECEF中)
  • East,West向量可以North x (0,0,6356754.7)
  • 获得
  • 不记得它是东方还是西方(取决于你的坐标系和交叉乘数顺序)
  • 只是目视检查,如果错误地颠倒顺序或否定结果
  • Up向量(高度或高度)很容易从Up=North x EastUp=North x West
  • 如果错误的方向逆序或否定结果......

[注释]

  • 6356754.7 [m]是地极半径
  • 如果您从杆(ECEF Z轴)观察
  • 然后北向量和向上向量位于同一轴(相反方向)
  • 这意味着没有东方或西方(奇点)
  • 南半球的
  • 通常用于南方而不是北方
  • 就此而言South = (0,0,-6356754.7)-viewer_position