代码编译第二次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;
} 问题出在你在循环中的 `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]