slider

还是菜鸟
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

how to determine-point-inline-polyno

Posted on 2013-05-03 10:06  slider  阅读(288)  评论(0编辑  收藏  举报
// Globals which should be set before calling this function:
    //
    // int polySides = how many corners the polygon has
    // float polyX[] = horizontal coordinates of corners
    // float polyY[] = vertical coordinates of corners
    // float x, y = point to be tested
    //
    // (Globals are used in this example for purposes of speed. Change as
    // desired.)
    //
    // The function will return YES if the point x,y is inside the polygon, or
    // NO if it is not. If the point is exactly on the edge of the polygon,
    // then the function may return YES or NO.
    //
    // Note that division by zero is avoided because the division is protected
    // by the "if" clause which surrounds it.

    private boolean pointInPolygon(float x, float y) {
        float[] pots = { bitmapRectF.left, bitmapRectF.top, bitmapRectF.right, bitmapRectF.top, bitmapRectF.right, bitmapRectF.bottom, bitmapRectF.left, bitmapRectF.bottom };
        matrix1.mapPoints(pots);
        float polyX[] = {pots[0],pots[2],pots[4],pots[6]};
        float polyY[] = {pots[1],pots[3],pots[5],pots[7]};
        int polySides = 4;
        int i, j = polySides - 1;
        boolean oddNodes = false;

        for (i = 0; i < polySides; i++) {
            if ((polyY[i] < y && polyY[j] >= y || polyY[j] < y && polyY[i] >= y)
                    && (polyX[i] <= x || polyX[j] <= x)) {
                oddNodes ^= (polyX[i] + (y - polyY[i]) / (polyY[j] - polyY[i])
                        * (polyX[j] - polyX[i]) < x);
            }
            j = i;
        }

        return oddNodes;
    }