网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 大学论文导航 设计下载 最新论文 下载排行 原创论文 论文源代码
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > C/C++ > 正文

关于画图底层算法

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 14/07/08

本文主要为广大网友提供“关于画图底层算法”,希望对需要关于画图底层算法网友有所帮助,学习一下!

    平时, 用惯了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));

    }

    }

  • 上一篇资讯: C++ strtok应用方式浅析
  • 网学推荐

    免费论文

    原创论文

    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号