游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5092|回复: 11

刚刚写了一个画线段的函数,不知道对错,望高手指教~~

[复制链接]

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2003-9-16 23:17:00 | 显示全部楼层 |阅读模式
void DrawLine( WORD x1, WORD y1, WORD x2, WORD y2 )
{
WORD x = x1;
WORD y = y1;
float k = (x2-x1)?(y2-y1)/(x2-x1):0;

DrawPixel( x, y );

if( abs(x2-x1) >= abs(y2-y1) )
{
char add = x2>x1?1:-1;
while( (x+=add) < x2 )
{
y = y1 + (x-x1) * k;
DrawPixel( x, y );
}
}
else
{
char add = y2>y1?1:-1;
while( (y+=add) < y2 )
{
x = x1 + 1.0f / ( k / (y-y1) );
DrawPixel( x, y );
}
}
}

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20463
发表于 2003-9-16 23:49:00 | 显示全部楼层

Re:刚刚写了一个画线段的函数,不知道对错,望高手指教~~

// -------------------------------------------------------
// Name: DrawLine()
// Describe: 绘线(基于Buffer)
// -------------------------------------------------------
HRESULT CDisplay:rawLine( LP_BITMAPX pBitmap, int nBeginX, int nBeginY, int nEndX, int nEndY, PIXEL Color )
{
#if _DEBUG
        ASSERT(pBitmap);
        ASSERT(pBitmap->GetBuffer());
#endif

        register int t;
        int distance;
        int x = 0, y = 0, delta_x, delta_y, incx, incy;
        delta_x = nEndX-nBeginX;
        delta_y = nEndY-nBeginY;
        if(delta_x > 0)
                incx = 1;
        else if(delta_x == 0)
                incx = 0;
        else
        {
                delta_x = -delta_x;
                incx = -1;
        }
        if(delta_y > 0)
                incy = 1;
        else if(delta_y == 0)
                incy = 0;
        else
        {
                delta_y = -delta_y;
                incy = -1;
        }
        if(delta_x > delta_y)
                distance = delta_x; /* **** */
        else
                distance = delta_y;
        for(t=0; t<distance+2; t++)
        {
//                pBitmap->m_pBuffer[nBeginX + nBeginY * pBitmap->m_nPitchWidth] = Color;
                DrawPixel(pBitmap, nBeginX, nBeginY, Color);
                x += delta_x;
                y += delta_y;
                if(x > distance)
                {
                        x -= distance;
                        nBeginX += incx;
                }
                if(y > distance)
                {
                        y -= distance;
                        nBeginY += incy;
                }
        }
        return S_OK;
}


这是一段hoho里面的画线函式,不知道对你有没有用。
你上面的那段代码可以自己执行测试一下才能知道对错。

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2003-9-16 23:59:00 | 显示全部楼层

谢谢大哥~~~~


正在写DrawPixel(),写完就可以测试了。

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2003-9-17 00:02:00 | 显示全部楼层

大哥的代码好象也没有四舍五入,这没关系吧?

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20463
发表于 2003-9-17 00:11:00 | 显示全部楼层

Re:刚刚写了一个画线段的函数,不知道对错,望高手指教~~

我们的2D坐标系本来只能支持整数,没关系的。
或者你可以自己测试一下。

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2003-9-17 02:35:00 | 显示全部楼层

Re


惨哟~~~~~~~刚刚才想到,float跟double型都是无符号的,不支持负数的斜率~~
请问有没变量类型既能表示小数又有正负之分?…… 看来得弄多一个bool变量来标志k是否为负数了。

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20463
发表于 2003-9-17 02:51:00 | 显示全部楼层

Re:刚刚写了一个画线段的函数,不知道对错,望高手指教~~

float 和 double 不支持符号????? 迷惑!

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2003-9-17 02:58:00 | 显示全部楼层

失礼失礼~~~

支持符号的,是我弄错了~~
刚才调试,我用wsprintf里面不能用%f或者%g,我就用了%d,结果显示为0,所以就误会咯。。。
不过运算结果也是0,也许是其他原因导致,我再慢慢想想,呵呵

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20463
发表于 2003-9-17 03:21:00 | 显示全部楼层

Re:刚刚写了一个画线段的函数,不知道对错,望高手指教~~

写代码要注意休息,深更半夜就剩我两个人了。

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2003-9-17 03:34:00 | 显示全部楼层

嗯嗯

现在弄好啦,
把    float k = (wEndX-wOriginX)?(wEndY-wOriginY)/(wEndX-wOriginX):0;
改为 float k = (wEndX-wOriginX)?float(wEndY-wOriginY)/float(wEndX-wOriginX):0;
忘了转换,WORD型/WORD型,所以变成0了。
刚才肚子好饿,现在吃完月饼马上就发现了。好,睡觉~~BYE~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-20 04:33

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表