Изменение ориентации набора точек (фигур) с помощью PCA не работает с квадратом - PullRequest
0 голосов
/ 29 октября 2018

У меня есть набор координат X и Y некоторых форм, которые нарисованы пользователем (то есть (x, y) в каждый момент времени). Эти фигуры могут быть в любой ориентации (пользователь может рисовать под любым углом / в любом направлении).

Теперь для дальнейшей обработки этих данных и применения моего собственного алгоритма для прогнозирования требуемого результата мне нужно изменить ориентацию всех этих фигур на общую ось (обычные оси X и Y).

После большого количества исследований и времени я решил использовать компонентный анализ Princpal для этого метода, и ниже приведен мой код

void ConvertToPCA( std::vector<double> &X, std::vector<double> &Y )
{
    ASSERT(X.size() == Y.size());

//First calculate Mean, Variance as well as Covariance for data1,data2.
double Xmean = 0;
double Ymean = 0;
double XSum = 0;
double YSum = 0;
for ( int i = 0; i < X.size(); i++ )
{
    XSum += X.at( i );
    YSum += Y.at( i );
}
Xmean = XSum / X.size();
Ymean = YSum / Y.size();

double varX = 0;
double varY = 0;
for (int n = 0; n < X.size(); n++ )
{
    varX += pow(( X.at(n) - Xmean ), 2);
    varY += pow( ( Y.at( n ) - Ymean ), 2 );
}
varX /= (X.size()-1);
varY /= (Y.size()-1);

double covar = 0;
for ( int n = 0; n < X.size(); n++ )
{
    covar += ( X.at( n ) - Xmean ) * ( Y.at( n ) - Ymean );
}
covar /= (X.size()-1);

Eigen::Matrix2d coVarianceMatrix;
coVarianceMatrix( 0, 0 ) = varX;
coVarianceMatrix( 0, 1 ) = covar;
coVarianceMatrix( 1, 0 ) = covar;
coVarianceMatrix( 1, 1 ) = varY;

Eigen::EigenSolver<Eigen::Matrix<double, 2, 2> > solver( coVarianceMatrix );
double First =  real( solver.eigenvectors()( 0, 0 ) );
double second =  real( solver.eigenvectors()( 0, 1 ) );
double third =  real( solver.eigenvectors()( 1, 0 ) );
double Four =  real( solver.eigenvectors()( 1, 1 ) );

for ( int n = 0; n < X.size(); n++ )
{
    double xVal = X[ n ];
    X[ n ] = ( X[ n ] * First ) + ( Y[n] * third );
    Y[ n ] = ( xVal * second ) + ( Y[ n ] * Four );
}

}

Используя это, я могу успешно изменить ориентацию Линии, Затмения и Круга), но эта реализация завершается неудачно, когда я пытаюсь сделать это на квадрате или дуге.

Я разместил здесь свои изображения.

Это точки под углом 45 градусов, на которые я пытаюсь ориентироваться по обычной оси X и Y.

Если кто-то может предложить какой-либо альтернативный метод, если PCA не является правильным подходом для решения ориентации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...