У меня есть набор координат 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 не является правильным подходом для решения ориентации?