函数在c中绘制一条直线
我试图创建一个函数,通过读取用户的两个点来绘制一条直线,(x1,y1)直线的起点和(x2,y2)终点。 以下是我的功能:函数在c中绘制一条直线,c,C,我试图创建一个函数,通过读取用户的两个点来绘制一条直线,(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
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");
}
void行(结构像素*屏幕)
{
浮动X,Y;
int i,j,x1,y1,x2,y2,mX,mY;
扫描频率(“%d%d%d%d”、&x1、&y1、&x2、&y2);
如果((x1>=0&&x1宽度)和((y1>=0&&y1高度)和((x2>=0&&x2宽度)和((y2>=0&&y2高度))
{
X=(x2-x1);
Y=(y2-y1);
if(X<0)
mX=X*(-1);
其他的
mX=X;
if(Y<0)
mY=Y*(-1);
其他的
mY=Y;
如果(mX>mY)
{
如果(X>0)
{
对于(i=0;i像素[x1+i][y1+j]='*';
}
}
其他的
{
对于(i=0;i>X;i--)
{
j=(int)((i*Y)/X)+0.5);
屏幕->像素[x1+i][y1+j]='*';
}
}
}
其他的
{
如果(Y>0)
{
对于(j=0;j像素[x1+i][y1+j]='*';
}
}
其他的
{
对于(j=0;j>Y;j--)
{
i=(int)((j*X)/Y)+0.5);
屏幕->像素[x1+i][y1+j]='*';
}
}
}
}
其他的
printf(“错误:坐标超出屏幕限制\n”);
}
问题是:当用户输入例如从(1,1)到(10,10)的行时,代码工作得很好,但是当它从(10,10)到(1,1)时,它就不工作了 Google Bresenham的线条绘制算法。这里有一个很棒的教程/解释,介绍了如何在网站上处理这类事情。文章中提出了你的具体问题。强烈推荐
这是他的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.;
}
}
}
void line(int x0,int y0,int x1,int y1,tga图像和图像,tga颜色){
布尔陡峭=假;
如果(std::abs(x0-x1)x1){
std::swap(x0,x1);
标准:互换(y0,y1);
}
int dx=x1-x0;
int-dy=y1-y0;
浮点数=std::abs(dy/浮点数(dx));
浮动误差=0;
int y=y0;
对于(int x=x0;x.5){
y+=(y1>y0?1:-1);
错误-=1。;
}
}
}
您可能想看看“它不起作用”是值得一提的错误/问题/问题描述。(int)((i*Y)/X)+0.5)代码>是对数字进行四舍五入的错误方法。使用(int)圆形((i*Y)/X)代码>