gpt4 book ai didi

c - c中画直线的函数

转载 作者:太空宇宙 更新时间:2023-11-04 03:31:44 24 4
gpt4 key购买 nike

我正在尝试创建一个函数来绘制一条直线,方法是从用户那里读取两个点,直线开始的 (x1,y1) 和结束的 (x2,y2)。这是我的功能:

    void line(struct pixels* screen)
{
float X, Y;
int i, j, x1, y1, x2, y2, mX, mY;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);

if ((x1 >= 0 && x1 <= screen->width) && (y1 >= 0 && y1 <= screen->height) && (x2 >= 0 && x2 <= screen->width) && (y2 >= 0 && y2 <= screen->height))
{
X = (x2 - x1);
Y = (y2 - y1);
if (X < 0)
mX = X*(-1);
else
mX = X;

if (Y < 0)
mY = Y*(-1);
else
mY = Y;

if( mX>mY )
{
if (X > 0)
{
for (i = 0; i < X; i++)
{
j = (int)(((i*Y) / X) + 0.5);
screen->pixel[x1 + i][y1 + j] = '*';
}

}
else
{
for (i = 0; i > X; i--)
{
j = (int)(((i*Y) / X) + 0.5);
screen->pixel[x1 + i][y1 + j] = '*';
}
}

}
else
{
if (Y > 0)
{
for (j = 0; j < Y; j++)
{
i = (int)(((j*X) / Y) + 0.5);
screen->pixel[x1 + i][y1 + j] = '*';
}
}
else
{
for (j = 0; j > Y; j--)
{
i = (int)(((j*X) / Y) + 0.5);
screen->pixel[x1 + i][y1 + j] = '*';
}
}
}
}
else
printf("ERROR: coordinates exceed the screen limits\n");
}

问题是:当用户输入例如从 (1,1) 到 (10,10) 的行时,代码可以完美运行,但是当它从 (10,10) 到 (1,1) 时,它不会工作!

最佳答案

Google Bresenham 的画线算法。在 How OpenGL works: software renderer in 500 lines of code 上有一个关于如何处理这种事情的精彩教程/解释。 .您的具体问题在文章中提出。强烈推荐。

这是他的 C++ 实现:

void line(int x0, int y0, int x1, int y1, TGAImage &image, TGAColor color) { 
bool steep = false;
if (std::abs(x0-x1)<std::abs(y0-y1)) {
std::swap(x0, y0);
std::swap(x1, y1);
steep = true;
}
if (x0>x1) {
std::swap(x0, x1);
std::swap(y0, y1);
}
int dx = x1-x0;
int dy = y1-y0;
float derror = std::abs(dy/float(dx));
float error = 0;
int y = y0;
for (int x=x0; x<=x1; x++) {
if (steep) {
image.set(y, x, color);
} else {
image.set(x, y, color);
}
error += derror;
if (error>.5) {
y += (y1>y0?1:-1);
error -= 1.;
}
}
}

关于c - c中画直线的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35970872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com