void EdgePrewitt::prepareMatrices() { math::matrix<double> tempX(3, 3); math::matrix<double> tempY(3, 3); for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) if (j == 0) tempX(i, j) = -1; else if (j == 1) tempX(i, j) = 0; else if (j == 2) tempX(i, j) = 1; for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) if (i == 0) tempY(i, j) = -1; else if (i == 1) tempY(i, j) = 0; else if (i == 2) tempY(i, j) = 1; g_x = tempX; g_y = tempY; }
void EdgeRoberts::prepareMatrices() { math::matrix<double> tempX(2, 2); math::matrix<double> tempY(2, 2); tempX(0, 0) = 1; tempX(0, 1) = 0; tempX(1, 0) = 0; tempX(1, 1) = -1; tempY(0, 0) = 0; tempY(0, 1) = 1; tempY(1, 0) = -1; tempY(1, 1) = 0; g_x = tempX; g_y = tempY; }
void MainWindow::calculate_middle_risk() { double middleRisk = 0.0; int count = 0; matrix<double> tempX(1, distributions[0].parameters.get_m()); for (int i = 0; i < distributions.size(); ++i) for (size_t j = 0; j < distributions[i].selection.RowNo(); ++j) { for (size_t k = 0; k < distributions[i].selection.ColNo(); ++k) tempX(0, k) = distributions[i].selection(j, k); middleRisk += classifier->calculate_recognition_error(tempX, distributions, regretMatrix); count++; } middleRisk /= static_cast<double>(count); // ui.labelMiddleRisk->setText(QString("%1").arg(middleRisk)); }
void MainWindow::recognize() { if (classifier) delete classifier; switch (ui.classifierTypeComboBox->currentIndex()) { case 0: { classifier = new BayesianClassifier(); } break; default: QMessageBox::critical(this, tr("Choosing of classifier type failed"), tr("Selected classifier not implemented! Choose another one."), QMessageBox::Ok); return; } for (int i = 0; i < distributions.size(); ++i) distributions[i].calculate_E(); matrix<double> tempX(1, distributions[0].parameters.get_m()); for (int i = 0; i < distributions.size(); ++i) for (size_t j = 0; j < distributions[i].selection.RowNo(); ++j) { for (size_t k = 0; k < distributions[i].selection.ColNo(); ++k) tempX(0, k) = distributions[i].selection(j, k); distributions[i].selectionVectorsInfo[j].recognizedDistribution = classifier->classify(tempX, distributions); } ui.labelClassificationErrorRisk->setText(QString("%1").arg(calculate_classification_error_probability())); calculate_middle_risk(); }
QVector<double> MainWindow::simpleIterations(QVector<double> A, QVector<double> B) { int n = B.size(); QVector<double> errorVector(B.size()); QVector<double> X(B.size()); QVector<double> tempX(B.size()); for(int i=0;i<B.size(); i++) { X[i]=0.0; tempX[i]=0.0; errorVector[i]=0.0; } double norm; int counter = 0; do { for(int i=0; i<n;i++) { tempX[i] = -1.0*B[i]; for(int g=0;g<n;g++) { if(i!=g) { tempX[i] += (A[i*n+g] *X[g]); } } tempX[i] /= -1* A[i*n+i]; } norm = fabs(X[0]-tempX[0]); for(int h=0; h<n;h++) { if(fabs(X[h] - tempX[h]) > norm) { norm = fabs(X[h]-tempX[h]); } X[h] =tempX[h]; } counter ++; }while(norm > eps && counter < maximumNumberOfIterations); if(counter >= maximumNumberOfIterations) { qDebug() << "Error solving method" << endl; // change this message later errorMessageString = "Method is not convergent"; return errorVector; } else { return X; } }
int Collision::AdjustCollisionIndependent(float &sx,float &sy,float dt,GameObject* dis,std::vector<GameObject*> vec,float msize,bool onlySolid){ Rect tempX(dis->box.x+sx*dt,dis->box.y,dis->box.w,dis->box.h); Rect tempY(dis->box.x,dis->box.y+sy*dt,dis->box.w,dis->box.h); int ret = -1; float colSize = msize; float colSize2 = msize; if (sx != 0 || sy !=0) for (auto &obj : vec){ if (obj != dis && !obj->IsDead()){ if (!onlySolid || obj->IsSolid(dis) ){ if (Collision::IsColliding(obj->box,tempY)){ float ax=0; if (sy > 0){ float dti = Game::GetInstance()->GetDeltaTimeI(); float checkSize = (sy/dti); for (ax=0;ax<sy;ax += checkSize){ Rect tempY2(dis->box.x,dis->box.y+ax*dt,dis->box.w,dis->box.h); if (Collision::IsColliding(obj->box,tempY2)){ if (ax == 0){ for (ax = -sy*2;ax < 0;ax += checkSize){ Rect tempY3(dis->box.x,dis->box.y+ax*dt,dis->box.w,dis->box.h); //bear::out << ax << " -> "<<Collision::IsColliding(obj->box,tempY3)<<":"<<(tempY3.y-dis->box.y) <<"\n"; if (Collision::IsColliding(obj->box,tempY3)){ //bear::out << "p:"<<ax<<"\n"; //ax = 0; //dis->box.y = obj->box.y-dis->box.h-checkSize*dt; ax -= checkSize; break; } } break; }else{ ax -= checkSize; } break; } } sy = ax; tempY = Rect(dis->box.x,dis->box.y+sy*dt,dis->box.w,dis->box.h); dis->NotifyCollision(obj); obj->NotifyCollision(dis); if (Collision::IsColliding(obj->box,tempY)){ sy = 0; } ret = 0; }else{ for (ax=colSize;ax>sy;ax-=colSize){ Rect tempY2(dis->box.x,dis->box.y-ax*dt,dis->box.w,dis->box.h); if (Collision::IsColliding(obj->box,tempY2)){ ax+=colSize2; break; } } sy = ax; tempY = Rect(dis->box.x,dis->box.y+sy*dt,dis->box.w,dis->box.h); if (Collision::IsColliding(obj->box,tempY)){ sy = 0; } dis->NotifyCollision(obj); obj->NotifyCollision(dis); ret = 1; } } if (Collision::IsColliding(obj->box,tempX)){ float ax=0; if (sx > 0){ for (ax=-colSize;ax<sx;ax+=colSize){ Rect tempY2(dis->box.x+ax*dt,dis->box.y,dis->box.w,dis->box.h); if (Collision::IsColliding(obj->box,tempY2)){ ax-=colSize2; break; } } sx = ax; Rect tempY2(dis->box.x+ax*dt,dis->box.y,dis->box.w,dis->box.h); if (Collision::IsColliding(obj->box,tempY2)){ sx = 0; } tempX = Rect(dis->box.x+sx*dt,dis->box.y,dis->box.w,dis->box.h); dis->NotifyCollision(obj); obj->NotifyCollision(dis); ret = 2; }else{ for (ax=colSize;ax>sx;ax-=colSize){ Rect tempY2(dis->box.x-ax*dt,dis->box.y,dis->box.w,dis->box.h); if (Collision::IsColliding(obj->box,tempY2)){ ax+=colSize2; break; } } sx = ax; Rect tempY2(dis->box.x+ax*dt,dis->box.y,dis->box.w,dis->box.h); if (Collision::IsColliding(obj->box,tempY2)){ sx = 0; } tempX = Rect(dis->box.x+sx*dt,dis->box.y,dis->box.w,dis->box.h); dis->NotifyCollision(obj); obj->NotifyCollision(dis); ret = 3; } } if (sy == 0 && sx == 0){ break; } //Rect tempXY(dis->box.x+sx*dt,dis->box.y+sy*dt,dis->box.w,dis->box.h); //if (Collision::IsColliding(obj->box,tempXY)){ //} } } } return ret; }
int Collision::AdjustCollisionIndependent(float &sx,float &sy,float dt,GameObject* dis,PoolManager &pool,PoolGroupId gid,float msize,bool onlySolid){ Rect tempX(dis->box.x+sx*dt,dis->box.y,dis->box.w,dis->box.h); Rect tempY(dis->box.x,dis->box.y+sy*dt,dis->box.w,dis->box.h); Rect tempXY(dis->box.x+sx*dt,dis->box.y+sy*dt,dis->box.w,dis->box.h); int ret = -1; float colSize = msize; float colSize2 = msize; if (sx != 0 || sy !=0) for (auto &obj : pool.ForGroup(gid)){ if (obj != dis && !obj->IsDead()){ if (!onlySolid || obj->IsSolid(dis) ){ if (Collision::IsColliding(obj->box,tempY)){ float ax=0; if (sy > 0){ /*if (canWarpInverted && Collision::IsColliding(obj->box,dis->box)){ for (ax=-sy;ax<0;ax -= colSize){ Rect tempY2(dis->box.x,dis->box.y+ax*dt,dis->box.w,dis->box.h); if (!Collision::IsColliding(obj->box,tempY2)){ ax-=colSize2; break; } } }else{*/ for (ax=-colSize*2.0f;ax<sy;ax += colSize){ Rect tempY2(dis->box.x,dis->box.y+ax*dt,dis->box.w,dis->box.h); if (Collision::IsColliding(obj->box,tempY2)){ if (ax >= 0){ ax -=colSize2; } break; } } sy = ax; Rect tempY2(dis->box.x,dis->box.y+sy*dt,dis->box.w,dis->box.h); if (Collision::IsColliding(obj->box,tempY2)){ sy = 0; } dis->NotifyCollision(obj); obj->NotifyCollision(dis); ret = 0; }else{ //for (ax=-colSize*2.0f;ax<sy;ax += colSize){ for (ax=colSize*2.0f;ax>sy;ax-=colSize){ Rect tempY2(dis->box.x,dis->box.y-ax*dt,dis->box.w,dis->box.h); if (Collision::IsColliding(obj->box,tempY2)){ if (ax <= 0){ ax +=colSize2; } //ax+=colSize2; break; } } sy = ax; Rect tempY2(dis->box.x,dis->box.y-sy*dt,dis->box.w,dis->box.h); if (Collision::IsColliding(obj->box,tempY2)){ sy = 0; } dis->NotifyCollision(obj); obj->NotifyCollision(dis); ret = 1; } } if (Collision::IsColliding(obj->box,tempX)){ float ax=0; if (sx > 0){ int iter = 0; for (ax=-colSize;ax<sx;ax+=colSize){ Rect tempY2(dis->box.x+ax*dt,dis->box.y,dis->box.w,dis->box.h); iter++; if (Collision::IsColliding(obj->box,tempY2)){ ax-=colSize2; break; } } sx = ax; Rect tempY2(dis->box.x+ax*dt,dis->box.y,dis->box.w,dis->box.h); if (Collision::IsColliding(obj->box,tempY2)){ sx = 0; } dis->NotifyCollision(obj); obj->NotifyCollision(dis); ret = 2; }else{ for (ax=colSize;ax>sx;ax-=colSize){ Rect tempY2(dis->box.x-ax*dt,dis->box.y,dis->box.w,dis->box.h); if (Collision::IsColliding(obj->box,tempY2)){ ax+=colSize2; break; } } sx = ax; Rect tempY2(dis->box.x+ax*dt,dis->box.y,dis->box.w,dis->box.h); if (Collision::IsColliding(obj->box,tempY2)){ sx = 0; } dis->NotifyCollision(obj); obj->NotifyCollision(dis); ret = 3; } } if (sy == 0 && sx == 0) break; } } } return ret; }