章鱼豆腐 发表于 2024-4-20 16:03:16

代码编译第二次printf少东西

代码如下,是一个补线代码,输出应当是(12, 20)补线到 (40, 50);
但是devc++输出是从(17,25)开始,小熊猫c++第一次输出是(13,21),不过第二次输出就是(18,26)开始
但是用vs2010就是从(13,21)输出

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdint.h> // 包含int16_t的定义
#define BLACK 0
#define WHITE 255

int image; // 假设的二维图像数组,初始化为0(即BLACK)
int Left ; // 初始化Left数组为一个大值,以记录每行的最左侧点

// Bresenham的线段算法
void drawLine(int y0, int x0, int y1, int x1) {
        int dx = abs(x1 - x0);
        int dy = abs(y1 - y0);
        int sx = x0 < x1 ? 1 : -1;
        int sy = y0 < y1 ? 1 : -1;
        int err = dx - dy;
        int e2;
       
        while (1) {

                        image = BLACK;
                if (x0 == x1 && y0 == y1) {
                        break;
                }
               
                e2 = 2 * err;
                if (e2 > -dy) {
                        err -= dy;
                        x0 += sx;
                }
                if (e2 < dx) {
                        err += dx;
                        y0 += sy;
                }
                        printf("(%d,%d)\n", y0, x0);
       
        }
}

int main() {

        drawLine(12, 20, 40, 50); // 使用BLACK作为线段颜色
       
        return 0;
}

FishC 发表于 2024-4-20 16:03:33

问题出在你在循环中的 `printf` 语句。每次循环都会输出一个坐标点,但你在循环前没有重置 `image` 的值,导致每次循环中都会将 `image` 的值设为 `BLACK`,这就是为什么你得到的输出是从 (17,25) 或 (18,26) 开始的原因。

解决方法很简单,只需要将 `image = BLACK;` 这行代码放在 `while` 循环的外面即可。这样,每次循环开始时都会将 `image` 的值重置为 `BLACK`,然后再根据算法计算新的坐标点并打印。修改后的代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

#define BLACK 0

int image;
int Left;

void drawLine(int y0, int x0, int y1, int x1) {
    int dx = abs(x1 - x0);
    int dy = abs(y1 - y0);
    int sx = x0 < x1 ? 1 : -1;
    int sy = y0 < y1 ? 1 : -1;
    int err = dx - dy;
    int e2;

    image = BLACK;
    while (1) {
      if (x0 == x1 && y0 == y1) {
            break;
      }

      printf("(%d,%d)\n", y0, x0);

      e2 = 2 * err;
      if (e2 > -dy) {
            err -= dy;
            x0 += sx;
      }
      if (e2 < dx) {
            err += dx;
            y0 += sy;
      }
    }
}

int main() {
    drawLine(12, 20, 40, 50);
    return 0;
}

请注意,添加 `#include <stdlib.h>` 头文件以包含 `abs` 函数的声明。此函数用于计算两个数的绝对值。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 代码编译第二次printf少东西