| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2680 人关注过本帖, 1 人收藏
标题:[分享]关于画图底层算法
只看楼主 加入收藏
blueboy82006
Rank: 5Rank: 5
来 自:幻想世界
等 级:贵宾
威 望:16
帖 子:1227
专家分:57
注 册:2007-7-23
结帖率:0
收藏(1)
 问题点数:0 回复次数:6 
[分享]关于画图底层算法
平时, 用惯了API、CDC和封装好的内部函数,关于画线,画圆这些东西都是信手拈来...
最近学习计算机图形学,不得不深入内部研究一下底层算法...
在这里贴几个代码分享一下!
(这里只给出MFC的OnDraw函数)

一、画线的三个算法:
1。DDA(数值微分)法:
程序代码:
void CDDALineView::OnDraw(CDC* pDC)
{
    CDDALineDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    int x,x0(200),y0(200),x1(500),y1(500);
    float dx,dy,y,k;
    dx=x1-x0;
    dy=y1-y0;
    k=dy/dx;
    y=y0;
    for(x=x0;x<=x1;x++)
    {
        pDC->SetPixel(x,(int)(y+0.5),RGB(255,0,0));
        y+=k;
    }
}

2.中点画线算法
程序代码:
void CMidpointLineView::OnDraw(CDC* pDC)
{
    CMidpointLineDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    int a,b,d1,d2,d,x,y;
    int x0(200),x1(500),y0(200),y1(500);
    a=y0-y1;
    b=x1-x0;
    d=2*a+b;
    d1=2*a;
    d2=2*(a+b);
    x=x0;
    y=y0;
    pDC->SetPixel(x,y,RGB(0,255,0));
    while(x<x1)
    {
        if(d<0)
        {
            x++;
            y++;
            d+=d2;
        }
        else
        {
            x++;
            d+=d1;
        }
        pDC->SetPixel(x,y,RGB(0,255,0));
    }
}


3。Bresenham算法:
程序代码:
void CBresenhamline2View::OnDraw(CDC* pDC)
{
    CBresenhamline2Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    int x0(200),y0(200),x1(500),y1(500);
    int x,y,dx,dy;
    dx=x1-x0;
    dy=y1-y0;
    int e=-dx;
    x=x0;
    y=y0;
    for(int i=0;i<=dx;i++)
    {
        pDC->SetPixel(x,y,RGB(0,0,255));
        x=x+1;
        e=e+2*dy;
        if(e>=0)
        {
            y++;
            e=e-2*dx;
        }
    }
}


二、中点画圆算法:
程序代码:
void CMidPointCircleView::OnDraw(CDC* pDC)
{
    CMidPointCircleDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    int r=100;            //半径
    int m(300),n(250);    //圆心坐标 
    int x,y;
    float d;
    x=0;
    y=0+r;
    d=1.25-r;
    //中点画圆算法

    pDC->SetPixel(m+x,n+y,RGB(255,0,0));
    pDC->SetPixel(m+y,n+x,RGB(255,0,0));
    pDC->SetPixel(m-x,n+y,RGB(255,0,0));
    pDC->SetPixel(m+y,n-x,RGB(255,0,0));
    pDC->SetPixel(m+x,n-y,RGB(255,0,0));
    pDC->SetPixel(m-y,n+x,RGB(255,0,0));
    pDC->SetPixel(m-x,n-y,RGB(255,0,0));
    pDC->SetPixel(m-y,n-x,RGB(255,0,0));
    while(x<=y)
    {
        if(d<0)
            d+=2*x+3;
        else
        {
            d+=2*(x-y)+5;
            y--;
        }
        x++;
        pDC->SetPixel(m+x,n+y,RGB(255,0,0));
        pDC->SetPixel(m+y,n+x,RGB(255,0,0));
        pDC->SetPixel(m-x,n+y,RGB(255,0,0));
        pDC->SetPixel(m+y,n-x,RGB(255,0,0));
        pDC->SetPixel(m+x,n-y,RGB(255,0,0));
        pDC->SetPixel(m-y,n+x,RGB(255,0,0));
        pDC->SetPixel(m-x,n-y,RGB(255,0,0));
        pDC->SetPixel(m-y,n-x,RGB(255,0,0));        
    }
}
搜索更多相关主题的帖子: 算法 底层 分享 
2008-10-02 11:13
pchen_88
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-8-18
收藏
得分:0 
谢谢分享哈!呵呵。。。。。。。
2008-10-02 20:14
yushui
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:1355
专家分:22
注 册:2006-7-19
收藏
得分:0 
找点贴出来就好了 呵呵

fighting!from now on!
2008-10-06 20:10
blueboy82006
Rank: 5Rank: 5
来 自:幻想世界
等 级:贵宾
威 望:16
帖 子:1227
专家分:57
注 册:2007-7-23
收藏
得分:0 
[bo][un]yushui[/un] 在 2008-10-6 20:10 的发言:[/bo]

找点贴出来就好了 呵呵


啥意思哦...

2008-10-06 20:15
xxping
Rank: 1
来 自:重庆
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-10-4
收藏
得分:0 
这是C++格式的吗?
2008-10-06 21:01
blueboy82006
Rank: 5Rank: 5
来 自:幻想世界
等 级:贵宾
威 望:16
帖 子:1227
专家分:57
注 册:2007-7-23
收藏
得分:0 
[bo][un]xxping[/un] 在 2008-10-6 21:01 的发言:[/bo]

这是C++格式的吗?

当然,
MFC而已...

2008-10-07 17:57
快速回复:[分享]关于画图底层算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023869 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved