用C画好圆
draw good circle with C
我想用我的代码和输出画一个圆圈(SDL_SetRenderDrawHexColor
是我自己的函数,它给出十六进制并将其转换为 rgba 和 SDL_SetRenderDrawColor
)
我正在使用 C 和 C++。
为什么我的输出有点像像素我在 canvas(js) 中使用了这个算法,这很好但在 sdl 中它很糟糕我认为像素很大是真的吗?
(由于某些原因我不能使用 SDL_gfx
)
SDL_Cos()
等三角函数的参数是弧度和浮点类型(本例中为 double
)。您以整数形式传递它们。
通过在角度上循环(范围应为 0 <= i < 2 * pi
),您将绘制比小半径圆所需的点更多的点,以及绘制更大半径圆所需的不连续线。因为 sin(x)
和 cos(x)
是周期函数,使用度数而不是弧度意味着你仍然绕着圆圈移动,但不是你想要的方式。
Midpoint circle algorithm 是正确执行此操作的一种方法。这利用对称性仅计算一个 1/8th
圆周中的点,然后将它们投影到其他 8 种方式。
我同意其他答案,您可能在 HTML canvas 中使用了亚像素抗锯齿(更严格地说,它是向下过采样,然后使用低通滤波器向下采样)。这与您在此处尝试使用渐变绘制同心环是一个非常不同的命题。
我想用我的代码和输出画一个圆圈(SDL_SetRenderDrawHexColor
是我自己的函数,它给出十六进制并将其转换为 rgba 和 SDL_SetRenderDrawColor
)
我正在使用 C 和 C++。
为什么我的输出有点像像素我在 canvas(js) 中使用了这个算法,这很好但在 sdl 中它很糟糕我认为像素很大是真的吗?
(由于某些原因我不能使用 SDL_gfx
)
SDL_Cos()
等三角函数的参数是弧度和浮点类型(本例中为 double
)。您以整数形式传递它们。
通过在角度上循环(范围应为 0 <= i < 2 * pi
),您将绘制比小半径圆所需的点更多的点,以及绘制更大半径圆所需的不连续线。因为 sin(x)
和 cos(x)
是周期函数,使用度数而不是弧度意味着你仍然绕着圆圈移动,但不是你想要的方式。
Midpoint circle algorithm 是正确执行此操作的一种方法。这利用对称性仅计算一个 1/8th
圆周中的点,然后将它们投影到其他 8 种方式。
我同意其他答案,您可能在 HTML canvas 中使用了亚像素抗锯齿(更严格地说,它是向下过采样,然后使用低通滤波器向下采样)。这与您在此处尝试使用渐变绘制同心环是一个非常不同的命题。