Простая программа для смещения набора копланарных точек не работает

Я вычисляю набор смещенных точек для набора исходных точек, используя простые перекрестные произведения. Позже я сравниваю, чтобы увидеть, параллельны ли результирующие наборы векторов. Я вижу, что сравнительный тест не проходит почти во всех случаях. Может кто-нибудь сказать, пожалуйста, почему?

// 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

Решение

Вы создаете вектор, полный сдвигов, которые все разные. Когда вы сдвигаете точки в старой коллекции с помощью набора различных векторов сдвига, не следует ожидать, что векторы между новыми точками и старыми будут одинаковыми. (Если вы сделали какую-то математику, которая, по вашему мнению, гарантирует, что это так, вы должны включить это в свой вопрос, чтобы мы могли проверить это.)

Если вы уверены, что математика верна, и проблема в коде, у вас, похоже, есть ошибка границ в первой итерации цикла 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]?

0

Другие решения


По вопросам рекламы [email protected]