【问题标题】:Bresenhams on polygon C#多边形 C# 上的 Bresenhams
【发布时间】:2017-05-31 10:11:39
【问题描述】:

我需要从封闭的二维多边形像素化/获取点。不是轮廓,而是用“像素”体素填充它,并将它们的位置作为点检索。 现在我有用于线条光栅化的 C# 代码,有没有类似的多边形方法?

【问题讨论】:

    标签: c# bresenham


    【解决方案1】:

    只需使用您的DrawLine() 绘制一个多边形。没有用于绘制多边形的特定算法。

    void DrawPoly(IEnumerable<Point> points)
    {
        endpoints = points.Skip(1).Concat(new []{points.First()});
        pairs = points.Zip(endpoints, Tuple.Create);
    
        for(var pair in pairs)
        {
            DrawLine(pair.Item1, pair.Item2);
        }
    }
    
    void DrawLine(Point p1, Point p2)
    {
        // Your Bresenham code here
    }
    

    根据编辑,您需要一个填充的多边形。如果您希望手动实现此功能,请尝试these 之一。

    听起来你想要一个填充多边形的所有坐标的大列表。可能有更好的方法来解决根本问题。但是,您有两种选择:

    • 在绘制时存储每个点。这需要你重写上面提到的算法。
    • 使用现有库绘制多边形。然后,获取生成的图像并将坐标附加到图像矩阵,将其展平为一维列表,然后过滤掉非黑色值:

      /* (0,0), (0,1), ..., (w,h) */
      grid = Enumerable.Range(0, width)
          .SelectMany(x => Enumerable.Range(0, height)
              .Select(y => new Point(x, y)));
      
      flattened = image.SelectMany(p => p)
          .Zip(grid, (a,b) => new {PixelValue = a, Coordinate = b});
      
      filledPoints = flattened.Where(p => p.PixelValue == 0)
          .Select(p => p.Coordinate);
      

    【讨论】:

    • 也许我的问题不准确,我正在搜索如何用像素填充多边形并检索它们的位置。像体素化。
    • 听起来您正在寻找polygon filling algorithm。那里列出了一些。如果要提取所有点的列表,您可以:1. 在绘制点时存储点,或 2. 将坐标附加到图像矩阵,将其展平为一维列表,然后执行 .Where(p =&gt; p.PixelValue == 0) .
    • 如果我有绘制多边形并填充它的简单函数,如何附加图像矩阵?见下面我的功能
    • 这在我的第二个要点中有所介绍。 (您需要指定宽度、高度和图像。)因为看起来您使用的是 RGB 图像,所以最后一行变为 filledPoints = flattened.Where(p =&gt; p.PixelValue.Blue == 0).Select(p =&gt; p.Coordinate);
    • 等等,我有问题,因为我真的不想使用 Windows 窗体来提取关于点的信息。有什么方法可以不同地使用这个函数://填充多边形到屏幕。 e.Graphics.FillPolygon(blueBrush, curvePoints, newFillMode);或者我应该如何从这一行继续或检索有关屏幕的信息?
    【解决方案2】:

    如何将这个东西与矩阵连接到存储的填充像素?

    public static List<Tuple<int, int>> PixelizePolygon(PaintEventArgs e)
    {
        List<Tuple<int,int>> pixels = new List<Tuple<int, int>>();
    
        // Create solid brush.
        SolidBrush blueBrush = new SolidBrush(Color.Blue);
    
        // Create points that define polygon.
        PointF point1 = new PointF(50.0F, 50.0F);
        PointF point2 = new PointF(100.0F, 25.0F);
        PointF point3 = new PointF(200.0F, 5.0F);
        PointF point4 = new PointF(250.0F, 50.0F);
        PointF point5 = new PointF(300.0F, 100.0F);
        PointF point6 = new PointF(350.0F, 200.0F);
        PointF point7 = new PointF(250.0F, 250.0F);
        PointF[] curvePoints = { point1, point2, point3, point4, point5, point6, point7 };
    
        // Define fill mode.
        FillMode newFillMode = FillMode.Winding;
    
        // Fill polygon to screen.
        e.Graphics.FillPolygon(blueBrush, curvePoints, newFillMode);
    
    
    
        return pixels;
    
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 2012-12-30
      • 2020-05-26
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多