首页 > 解决方案 > 我在多边形函数中的观点有什么问题?

问题描述

我正在尝试在 Photoshop 或其他类似的图像编辑程序中制作套索功能。

我在多边形函数中有一个点,它检查图像中的每个像素是否位于定制的多边形内

然后我将每个不匹配的像素着色为透明

然而,这些线会出现,并且该函数表示这些像素位于给定的多边形内。

多边形函数中的点:

#define INF 10000 
struct Point
{
    int x;
    int y;
};
bool onSegment(Point p, Point q, Point r)
{
    if (q.x <= max(p.x, r.x) && q.x >= min(p.x, r.x) &&
        q.y <= max(p.y, r.y) && q.y >= min(p.y, r.y))
        return true;
    return false;
}
int orientation(Point p, Point q, Point r)
{
    int val = (q.y - p.y) * (r.x - q.x) -
        (q.x - p.x) * (r.y - q.y);

    if (val == 0) return 0; 
    return (val > 0) ? 1 : 2; 
}

bool doIntersect(Point p1, Point q1, Point p2, Point q2)
{

    int o1 = orientation(p1, q1, p2);
    int o2 = orientation(p1, q1, q2);
    int o3 = orientation(p2, q2, p1);
    int o4 = orientation(p2, q2, q1);

    if (o1 != o2 && o3 != o4)
        return true;


    if (o1 == 0 && onSegment(p1, p2, q1)) return true;


    if (o2 == 0 && onSegment(p1, q2, q1)) return true;


    if (o3 == 0 && onSegment(p2, p1, q2)) return true;

    if (o4 == 0 && onSegment(p2, q1, q2)) return true;

    return false;
}


bool isInside(vector<Point> polygon, Point p)
{
    int n = polygon.size();

    if (n < 3) return false;


    Point extreme = { INF, p.y };


    int count = 0, i = 0;
    do
    {
        int next = (i + 1) % n;


        if (doIntersect(polygon[i], polygon[next], p, extreme))
        {
        
            if (orientation(polygon[i], p, polygon[next]) == 0)
                return onSegment(polygon[i], p, polygon[next]);

            count++;
        }
        i = next;
    } while (i != 0);


    return count & 1; 
}

标签: c++math

解决方案


推荐阅读