2016-04-09 4 views
2

Я использую C++, и я хочу рассчитать симметричность точки относительно гиперплоскости. Я нахожусь в размере , указанном во время выполнения.Как вычислить симметричность точки (пространству высокого измерения) относительно гиперплоскости, образованной множеством точек?

У меня есть точки в гиперплоскости. Поэтому я вычислил нормальный вектор, решая набор линейных уравнений. Тогда получить гиперплоскость (с нормалью и точкой), проекцию первой точки и, наконец, симметричную.

Я пробовал использовать библиотеку eigen3, но, похоже, необходимо, чтобы измерение давалось во время компиляции.

Любая идея решить проблему с этой библиотекой (или любым другим) или методом коротких выводов приветствуется.

Заранее спасибо.

ответ

1

Eigen может работать как во время компиляции, так и во время выполнения. Для того, чтобы использовать размер во время выполнения, укажите Dynamic или использовать предопределенные псевдонимы:

Eigen::Matrix<double, Eigen::Dynamic, 1> x(n); 

или просто

Eigen::VectorXd x(n); 

где n является вашей среды выполнения, заданное количество измерений.

См документации here


После того, как вы вычислили вектор нормали и происхождение (просто один из ваших точек), вы можете сделать это:

#include <Eigen/Core> 

using namespace Eigen; 

VectorXd mirror(const VectorXd &normal, const VectorXd &origin, const VectorXd &x) 
{ 
    return x - 2.0 * normal * ((x-origin).dot(normal))/normal.dot(normal); 
} 

enter image description here

+0

OK. Я не знал о динамике ключевых слов. Это избавляет меня от одной проблемы. Я так хочу рассчитать симметричный хороший? – dev93

+0

@ dev93 См. Обновленный ответ. –

+0

ОК. Я очень благодарю вас. – dev93