// 円・グレースケール
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>
実行例
グレースケール

カラー

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

コメント