简单的程序来移动一组共面点不起作用

时间:2014-06-01 17:04:21

标签: c++ math vector-graphics

我正在使用简单的交叉积来计算一组原点的一组移位点。后来我进行比较,看看得到的矢量集是否平行。我看到几乎所有情况下的比较测试都失败了。有人可以告诉我为什么吗?

// Here osg::Vec3 is a container for three floats
std::vector<osg::Vec3 > originalPoints;
originalPoints.push_back(osg::Vec3(10.0,11.0,13.0));
originalPoints.push_back(osg::Vec3(-10.0,12.0,13.0));
originalPoints.push_back(osg::Vec3(5.0,6.0,13.0));
originalPoints.push_back(osg::Vec3(6.75,11.0,13.0));
originalPoints.push_back(osg::Vec3(8.6,-11.0,13.0));

// Here the "^" operator represents cross product   
osg::Vec3 tileUpVec = originalPoints[0]^originalPoints[1];
tileUpVec.normalize(); 

std::vector<osg::Vec3> shift;

osg::Vec3 lineVec1, lineVec2. resultVec;
lineVec1  = originalPoints[0] - originalPoints[1];
resultVec = lineVec1 ^ tileUpVec;
resultVec.normalise();
shift.push_back(resultVec);

for(unsigned int i = 0; i < originalPoints.size(); i++)
{
  lineVec1 = originalPoints[i-1] - originalPoints[i];
  lineVec2 = originalPoints[i] - originalPoints[i+1];
  resultVec = (lineVec + lineVec2) ^ tileUpVec;
  resultVec.normalise();
  shift.push_back(resultVec);
}

lineVec1  = originalPoints[i-1] - originalPoints[i];
resultVec = lineVec1 ^ tileUpVec;
resultVec.normalise();
shift.push_back(resultVec);

ASSERT_TRUE(shift.size() == originalPoints.size());

std::vector<osg::Vec3> shiftedPoints;

for(unsigned int i = 0; i < shift.size(); i++)
{
  shiftedPoints.push_back((shift[i]+originalPoints[i])); 
}

float result;

// Here "*" operator represnts dot product
for(unsigned int j = 0; j < (originalPoints.size() - 1); j++)
{
  lineVec1 = shiftedPoints[j] - shiftedPoints[j+1];
  lineVec1.normalize();
  lineVec2 = originalPoints[j] - originalPoints[j+1];
  lineVec2.normalize();
  result = lineVec1 * lineVec2;
  std::cout << result << std::endl;
  EXPECT_TRUE(result > 0.995);
}

EXPECT_TRUE始终失败。这意味着它们并不平行。是什么原因?

1 个答案:

答案 0 :(得分:0)

您正在创建一个充满轮班的矢量,这些轮班都是不同的。当你通过一堆不同的移位向量移动旧集合中的点时,你不应该期望新点和旧点之间的向量是相同的。 (如果你已经完成了一些数学运算,你认为它们将是保证,那么你应该在你的问题中加入它,以便我们检查它。)

如果您确信数学是正确的并且问题与代码有关,那么在for循环的第一次迭代中似乎确实存在边界错误。它会查找originalPoints[-1]

编辑添加:

在第一个for循环中,您可以定义

linevec1 = original_points[i-1] - original_points[i] linevec2 = original_points[i] - original_points[i+1]

然后你只使用linevec1+linevec2,所以为什么不说

linevec = original_points[i-1]-original_points[i+1]