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();
}
Пример #5
0
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;
    }
}
Пример #6
0
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;
}
Пример #7
0
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;
}