1

ポリゴンのすべての頂点のx、y座標、たとえば(1,1)(20,10)(10,30)がありますが、ポリゴンの内側のすべてのピクセルが1で、外側が0のマスクを生成するにはどうすればよいですか?C#には、ほとんど仕事をしているように見える関数があることは知っていますがFillPolygon()、マスクを返さないようです。

4

3 に答える 3

1
Bitmap b = new Bitmap(30, 30);

using (Graphics g = Graphics.FromImage(b))
{
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
    g.Clear(Color.Black);
    g.FillPolygon(Brushes.White, new Point[] {
        new Point(5,5),
        new Point(20,20),
        new Point(2,15)});
}

byte[,] mask = new byte[b.Width, b.Height];

for (int y = 0; y < b.Height; y++)
for (int x = 0; x < b.Width; x++)
{
    mask[x, y] = b.GetPixel(x, y).R > 0 ? 1 : 0;
}

もちろん、のLockBits代わりにを使用して直接ピクセルアクセスを使用すると、パフォーマンスが向上しますGetPixel

于 2013-01-16T15:43:14.123 に答える
1

私はこれがかなり古い質問であることを知っていますが、誰かがやって来て似たようなものを探した場合に備えて...

マスクを取得したいだけの場合は、System.Drawingを参照してメモリ内の画像に実際に描画するよりもはるかに優れたアプローチがあります...

struct Point
{
    public readonly int X;
    public readonly int Y;

    public Point(int x, int y)
    {
        this.X = x;
        this.Y = y;
    }
}

bool PointInPolygon(Point[] polygon, int x, int y)
{
    if(polygon == null || polygon.Length < 3) return false;

    int counter = 0;
    double intersections;
    Point p1 = polygon[0];
    Point p2;
    for (int i = 1; i <= polygon.Length; i++)
    {
        p2 = polygon[i % polygon.Length];
        if ((y > (p1.Y < p2.Y ? p1.Y : p2.Y)) && (y <= (p1.Y > p2.Y ? p1.Y : p2.Y)) && (x <= (p1.X > p2.X ? p1.X : p2.X)) && (p1.Y != p2.Y))
        {
            intersections = (y - p1.Y) * (p2.X - p1.X) / (p2.Y - p1.Y) + p1.X;
            if (p1.X == p2.X || x <= intersections) counter++;
        }
        p1 = p2;
    }

    return counter % 2 != 0;
}

void Main()
{
    Point[] polygon = new Point[] { new Point(1,1), new Point(20,10), new Point(10,30) };
    bool[,] mask = new bool[30,30];

    for(int i=0;i<30;i++)
    {
        for(int j=0;j<30;j++)
        {
            mask[i,j] = PointInPolygon(polygon, i, j);
            Console.Write(mask[i,j]?"*":".");
        }
        Console.WriteLine();
    }
}

これは次のように出力されます:

..............................
..............................
..............................
..***.........................
...*****......................
...********...................
....**********................
....**************............
.....****************.........
.....*******************......
......*********************...
......************************
.......*********************..
.......*******************....
........****************......
........**************........
.........***********..........
.........*********............
..........******..............
..........****................
..........**..................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
于 2015-05-17T14:35:51.467 に答える
0

マスキングを使用したプレイには、Regionを使用できます。

于 2013-01-16T15:45:35.740 に答える