目前我正在使用Bresenham的圆圈绘制算法,它可以精细地绘制圆圈,但是我想要一种相对快速有效的方法来绘制具有指定厚度的圆圈(因为Bresenham的方法只绘制单个像素厚度)。我意识到我可以简单地绘制多个具有不同半径的圆圈,但我相信这将是非常低效的(并且效率很重要,因为这将在每微秒都很宝贵的Arduino上运行)。我目前使用以下代码:
void circle(byte xc, byte yc, int radius, Colour colour) {
int x = -radius, y = 0, err = 2 - 2 * radius;
while(x < 0) {
setPixel(xc - x, yc + y, colour);
setPixel(xc - y, yc - x, colour);
setPixel(xc + x, yc - y, colour);
setPixel(xc + y, yc + x, colour);
radius = err;
if(radius <= y) {
err += ++y * 2 + 1;
}
if(radius > x || err > y) {
err += ++x * 2 + 1;
}
}
}
我如何修改它以允许指定圆的厚度?PS我不想使用任何外部库,请!
下面的解决方案可能很慢,但是,它非常简单。
首先,使用Bresenham算法绘制内圆和外圆。然后,检查条件:
if (pow(i - centre, 2) + pow(j - centre, 2) <= pow(outern_radius,2) &&
pow(i - centre, 2) + pow(j - centre, 2) >= pow(inner_radius,2))
如果满足,则设置像素(i,j)。
如果按照中点圆算法所述沿八分之一点扫描,主坐标y
将始终增加1。然后你可以同时画两个圆,因为它们的主坐标是同步的。
您没有放置像素,而是在内外圆的点之间绘制水平线(和垂直线),它们具有相同的y
(或x
)坐标。您这样做直到外圆到达对角线。
对于两个圆圈,保持状态为x
和err
,内圈i
和外圈o
。内圈到达对角线后,内点位于该对角线上。这意味着您正在绘制八个相邻的八分之一扇区。
这个想法与@oakad在评论中提出的非常相似,但不需要保留列表。中点圆算法可能比Bresenham算法慢,因此可能有改进的余地,但内存占用较低是一个优势。
下面的代码将绘制一个具有给定内外半径的空心圆。线条宽度为ro-ri 1
,因此即使半径相等,也会打印出一个像素宽的圆。如果内半径小于外半径,则不会打印任何内容。
void xLine(int x1, int x2, int y, int colour)
{
while (x1 <= x2) setPixel(x1++, y, colour);
}
void yLine(int x, int y1, int y2, int colour)
{
while (y1 <= y2) setPixel(x, y1++, colour);
}
void circle2(int xc, int yc, int inner, int outer, int colour)
{
int xo = outer;
int xi = inner;
int y = 0;
int erro = 1 - xo;
int erri = 1 - xi;
while(xo >= y) {
xLine(xc + xi, xc + xo, yc + y, colour);
yLine(xc + y, yc + xi, yc + xo, colour);
xLine(xc - xo, xc - xi, yc + y, colour);
yLine(xc - y, yc + xi, yc + xo, colour);
xLine(xc - xo, xc - xi, yc - y, colour);
yLine(xc - y, yc - xo, yc - xi, colour);
xLine(xc + xi, xc + xo, yc - y, colour);
yLine(xc + y, yc - xo, yc - xi, colour);
y++;
if (erro < 0) {
erro += 2 * y + 1;
} else {
xo--;
erro += 2 * (y - xo + 1);
}
if (y > inner) {
xi = y;
} else {
if (erri < 0) {
erri += 2 * y + 1;
} else {
xi--;
erri += 2 * (y - xi + 1);
}
}
}
}
我已经写了一个Bresenham的圆绘制算法的实现。该算法利用了圆的高度对称特性(它只计算第一个八分之一的点,并利用对称性绘制其他点)。因此,我希望它会非常快。《图形编程黑皮书》第35章的标题是“Bresenham是快的,而且快是好的”,虽然它是关于线条绘制算法的,但我可以合理地预期圆形绘制算法也很快(因为原理是一样的)。 这是我的java,摇摆实现 此方法使用以下方法: getNativeX和g
我想在不显示直方图的情况下绘制密度线,我使用了以下代码:
我已经尝试了很多算法来渲染Mandelbrot集,包括简单的逃逸时间算法,以及优化的逃逸时间算法。但是,有没有更快的算法可以像我们在YouTube上看到的那样有效地产生真正深的缩放。此外,我很想得到一些想法,如何提高我的精度超过C/C
我正在尝试不使用图像视图。这是因为,稍后,我将生成许多形状相同但颜色不同的对象,所以我不需要继续添加图像视图,而只是在代码上添加颜色。
drawtext=fontfile=./fonts/trueType/freeFont/helveticaneue.ttf:text='foo':x=5:y=5:shadowx=0:shadowx=0:fontsize=12:fontcolor=0xeeeee@1.0:box=0:boxcolor=0xeeeee@0.5,drawbox=x=0:y=490:w=960:h=50:color=0xe
本文向大家介绍C#绘制椭圆的方法,包括了C#绘制椭圆的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#绘制椭圆的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。