WPFヘルパー:ImageBufferHelper.cs – DrawCircle・FillCircle 円の描画

コンピュータ

ImageBufferHelper.cs

        // 円・グレースケール
        public void DrawCircle(int cx, int cy, int r, byte v)
        {
            int x = r;
            int y = 0;
            int err = 0;

            while (x >= y)
            {
                SetPixel(cx + x, cy + y, v);
                SetPixel(cx + y, cy + x, v);
                SetPixel(cx - y, cy + x, v);
                SetPixel(cx - x, cy + y, v);
                SetPixel(cx - x, cy - y, v);
                SetPixel(cx - y, cy - x, v);
                SetPixel(cx + y, cy - x, v);
                SetPixel(cx + x, cy - y, v);

                y++;
                if (err <= 0)
                {
                    err += 2 * y + 1;
                }
                if (err > 0)
                {
                    x--;
                    err -= 2 * x + 1;
                }
            }
        }
        // 円・カラー
        public void DrawCircle(int cx, int cy, int rr, byte r, byte g, byte b)
        {
            int x = rr;
            int y = 0;
            int err = 0;

            while (x >= y)
            {
                SetPixel(cx + x, cy + y, r, g, b);
                SetPixel(cx + y, cy + x, r, g, b);
                SetPixel(cx - y, cy + x, r, g, b);
                SetPixel(cx - x, cy + y, r, g, b);
                SetPixel(cx - x, cy - y, r, g, b);
                SetPixel(cx - y, cy - x, r, g, b);
                SetPixel(cx + y, cy - x, r, g, b);
                SetPixel(cx + x, cy - y, r, g, b);

                y++;
                if (err <= 0)
                {
                    err += 2 * y + 1;
                }
                if (err > 0)
                {
                    x--;
                    err -= 2 * x + 1;
                }
            }
        }
        // 円塗り潰し・グレースケール
        public void FillCircle(int cx, int cy, int r, byte v)
        {
            for (int y = -r; y <= r; y++)
            {
                int dx = (int)Math.Sqrt(r * r - y * y);
                for (int x = -dx; x <= dx; x++)
                {
                    SetPixel(cx + x, cy + y, v);
                }
            }
        }
        // 円塗り潰し・カラー
        public void FillCircle(int cx, int cy, int rr, byte r, byte g, byte b)
        {
            for (int y = -rr; y <= rr; y++)
            {
                int dx = (int)Math.Sqrt(rr * rr - y * y);
                for (int x = -dx; x <= dx; x++)
                {
                    SetPixel(cx + x, cy + y, r, g, b);
                }
            }
        }

利用例
MainWindow.xaml.cs

using System.Windows;

using Maywork.WPF.Helpers;

namespace WpfSample01;

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        
        var buff = ImageBufferHelper.Create(256, 256, 1); // カラーの場合、第3引数を1→3

        buff.FillCircle(128, 128, 64, 255);
        buff.DrawCircle(128, 128, 32, 0);

        Image1.Source = buff.ToBitmapSource();
    }
}

MainWindow.xaml

    <Grid>
        <Image x:Name="Image1" />
    </Grid>

ImageConverter.cs


実行例

グレースケール

カラー

アンチエイリアスが無いので線がガタガタですね。

コメント