1、修改圆算法,使其能够绘制以任意整数坐标 (xc, yc) 为圆心的圆。
要修改现有的圆算法以绘制以任意整数坐标 (xc, yc) 为圆心的圆,需要对原算法进行调整,将圆心坐标考虑进去。原算法是基于圆心在原点 (0, 0) 的情况,现在要将圆心移动到 (xc, yc) ,只需在设置像素时,将圆心坐标加到相应的 x 和 y 坐标上。
以下是修改后的算法:
circle(int r, int xc, int yc, color c) {
int x, y, e;
x = 0;
y = r;
e = -r;
while (x <= y) {
/* assert e == x^2 + (y - 1/2)^2 - r^2 */
set8pixels(xc, yc, x, y, c);
e = e + 2*x + 1;
x = x + 1;
if (e >= 0) {
e = e - 2*y + 2;
y = y - 1;
}
}
}
set8pixels(int xc, int yc, int x, int y, color c) {
setpixel(xc + x, yc + y, c);
setpixel(xc + y, yc + x, c);
setpixel(xc + y, yc - x, c);
setpixel(xc + x, yc - y, c);
setpixel(xc - x, yc - y, c);
setpixel(xc - y, yc - x, c);
setpixel(xc - y, yc + x, c);
setpixel(xc - x, yc + y, c);
}
在这个修改后的算法中, circle 函数增加了两个参数 xc 和 yc 来表示圆心的坐标。 set8pixels 函数也相应地进行了修改,在设置像素时,将圆心坐标 xc 和 yc 分别加到 x 和 y 上,从而实现以任意整数坐标为圆心的圆的绘制。
2、triangle1算法可以推广到convex1,通过在任意凸多边形边界框内的所有像素上增量评估其边(线)函数,对任意凸多边形进行光栅化。请实现此算法。
convex1算法伪代码说明
以下是根据需求实现的 convex1 算法的伪代码:
convex1 (vertex v[], int n, color c) {
line l[];
float e[];
float et[];
int i;
/* 为边分配内存 */
l = (line*)malloc(n * sizeof(line));
e = (float*)malloc(n * sizeof(float));
et = (float*)malloc(n * sizeof(float));
/* 计算各边的线系数 (a,b,c) */
for (i = 0; i < n; i++) {
mkline(v[i], v[(i + 1) % n], &l[i]);
}
/* 计算多边形的边界框 */
int bb_xmin = v[0].x;
int bb_xmax = v[0].x;
int bb_ymin = v[0].y;
int bb_ymax = v[0].y;
for (i = 1; i < n; i++) {
if (v[i].x < bb_xmin) bb_xmin = v[i].x;
if (v[i].x > bb_xmax) bb_xmax = v[i].x;
if (v[i].y < bb_ymin) bb_ymin = v[i].y;
if (v[i].y > bb_ymax) bb_ymax = v[i].y;
}
/* 在 (bb_xmin, bb_ymin) 处评估线性函数 */
for (i = 0; i < n; i++) {
e[i] = l[i].a * bb_xmin + l[i].b * bb_ymin + l[i].c;
}
for (y = bb_ymin; y <= bb_ymax; y++) {
for (i = 0; i < n; i++) {
et[i] = e[i];
}
for (x = bb_xmin; x <= bb_xmax; x++) {
int same_sign = 1;
for (i = 1; i < n; i++) {
if (sign(e[0]) != sign(e[i])) {
same_sign = 0;
计算机图形学算法解析与实现

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



