⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inpoly.c

📁 pathgenerator source, filtering for matlab
💻 C
📖 第 1 页 / 共 2 页
字号:
        
        cnect[Nnode*2-2] = Nnode;
        
        cnect[Nnode*2-1] = 1.0;
        
    }
    
    else
    {
        
        cnect  = mxGetPr(prhs[2]); // (2 x Ncnect) vector
        
        Ncnect = mxGetN(prhs[2]);
        
    }
    
    
    
    /* Outputs */
    
    plhs[0]   = mxCreateLogicalMatrix(1 , N);
    
    in        = (bool *)mxGetPr(plhs[0]);
    
    
    plhs[1]   = mxCreateLogicalMatrix(1 , N);
    
    bnd       = (bool *)mxGetPr(plhs[1]);
    
    
    
    /* Temporal vectors */
    
    cn        = (bool *)mxMalloc(N*sizeof(bool));
    
    on        = (bool *)mxMalloc(N*sizeof(bool));
    
    x         = (double *)mxMalloc(N*sizeof(double));
    
    y         = (double *)mxMalloc(N*sizeof(double));
    
    index     = (int *)mxMalloc(N*sizeof(int));
    
    
    
    
    for (i = 0; i < 2*N ; i=i+2)
        
    {
        
        temp  = X[i];
        
        
        if(temp < minix)
        {
            
            minix = temp;
        }
        
        if(temp >maxix)
            
        {
            
            maxix = temp;
            
        }
        
        temp  = X[i + 1];
        
        if(temp < miniy)
        {
            
            miniy = temp;
        }
        
        if(temp > maxiy)
            
        {
            
            maxiy = temp;
            
        }
        
    }
    
    for (i = 0 ; i < 2*Nnode ; i = i + 2)
        
    {
        
        temp = fabs(node[i]);
        
        if(temp > norminf)
            
        {
            
            norminf = temp;
        }
        
        temp = fabs(node[i + 1]);
        
        if(temp > norminf)
            
        {
            
            norminf = temp;
            
        }
        
    }
    
    
    tol = norminf*eps;
    
    lim = norminf + tol;
    
    
    if ((maxix - minix) > (maxiy-miniy))
        
    {
        
        for (i = 0; i < 2*N ; i=i+2)
            
        {
            
            temp     = X[i];
            
            X[i]     = X[i + 1];
            
            X[i + 1] = temp;
            
        }
        
        for (i = 0 ; i < 2*Nnode ; i=i+2)
            
        {
            
            temp         = node[i];
            
            node[i]      = node[i + 1];
            
            node[i + 1]  = temp;
            
        }
        
    }
    
    for (i = 0 ; i< N ; i++)
        
    {
        
        cn[i]    = 0;
        
        on[i]    = 0;
        
        y[i]     = X[2*i + 1];
        
        index[i] = i;
        
        
    }
    
    
    
    qsindex( y , index , 0 , N - 1 );
    
    for (i = 0 ; i < N ; i++)
    {
        
        x[i]     = X[2*index[i]];
        
    }
    
    
    
    for (k = 0 ; k < Ncnect ; k++)
        
    {
        
        n1 = (int) cnect[2*k] - 1;
        
        n2 = (int) cnect[2*k + 1] - 1;
        
        x1 = node[2*n1];
        
        y1 = node[2*n1 + 1];
        
        
        x2 = node[2*n2];
        
        y2 = node[2*n2 + 1];
        
        
        if (x1 > x2)
        {
            xmin = x2;
            
            xmax = x1;
        }
        
        else
        {
            xmin = x1;
            
            xmax = x2;
        }
        
        if (y1 > y2)
        {
            ymin = y2;
            
            ymax = y1;
            
        }
        
        else
        {
            ymin = y1;
            
            ymax = y2;
            
        }
        
        if (y[0] == ymin)
        {
            start = 0;
            
        }
        else if (y[N-1] <= ymin)
        {
            
            start = N - 1;
            
        }
        else
            
        {
            
            lower = 0;
            
            upper = N - 1;
            
            start = ((lower+upper)/2);
            
            for (l = 0 ; l < N ; l++)
            {
                if (y[start] < ymin)
                {
                    
                    lower = start;
                    
                    start = ((lower+upper)/2);
                    
                }
                else if (y[start-1]<ymin)
                {
                    
                    break;
                    
                }
                else
                    
                {
                    upper = start;
                    
                    start = ((lower+upper)/2);
                    
                }
            }
            
            start--;
        }
        
        for (j = start ; j < N ; j++)
        {
            
            YY = y[j];
            
            if (YY <= ymax)
            {
                if (YY >= ymin)
                {
                    XX = x[j];
                    
                    if (XX >= xmin)
                    {
                        if (XX <= xmax)
                        {
                            
                            on[j] = on[j] || ( fabs( (y2-YY)*(x1-XX) - (y1-YY)*(x2-XX) )<tol );
                            
                            if (YY < ymax)
                            {
                                ub = ( (x2-x1)*(y1-YY) - (y2-y1)*(x1 - XX) )/( (XX - lim)*(y2-y1) );
                                
                                if ( (ub > -tol) && (ub < (1.0 + tol) ) )
                                {
                                    cn[j] = !cn[j];
                                    
                                }
                            }
                        }
                    }
                    
                    else if (YY < ymax)
                        
                    {
                        
                        cn[j] = !cn[j];
                        
                    }
                    
                }
            }
            else
                
            {
                break;
            }
            
        }
        
    }
    
    
    for(i = 0 ; i < N ; i++)
    {
        
        ind      = index[i];
        
        in[ind]  = (cn[i] || on[i]);
        
        bnd[ind] = on[i];
        
    }
    
    mxFree(cn);
    
    mxFree(on);
    
    mxFree(x);
    
    mxFree(y);
    
    mxFree(index);
    
}


/* ----------------------------------------------------------------------------- */

void qsindex( double *array, int *index , int left, int right )
{
    
    double pivot;	// pivot element.
    
    int ipivot , holex;	// hole index.
    
    int i;
    
    holex          = left + ( right - left ) / 2;
    
    pivot          = array[holex];		     // get pivot from middle of array.
    
    ipivot         = index[holex];
    
    array[holex]   = array[left];              // move "hole" to beginning of
    
    index[holex]   = index[left];              // move "hole" to beginning of
    
    holex          = left;			           // range we are sorting.
    
    for ( i = left + 1 ; i <= right ; i++ )
    {
        if ( array[ i ] <= pivot )
        {
            array[ holex ] = array[ i ];
            
            index[ holex ] = index[ i ];
            
            
            array[ i ]     = array[ ++holex ];
            
            index[ i ]     = index[ holex ];
            
        }
    }
    
    if ( holex - left > 1 )
    {
        
        qsindex( array, index , left, holex - 1 );
        
    }
    if ( right - holex > 1 )
    {
        
        qsindex( array, index , holex + 1, right );
        
    }
    
    array[holex] = pivot;
    
    index[holex] = ipivot;
    
}


/* ----------------------------------------------------------------------------- */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -