关于画图底层算法

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

    }

    }

时间: 2024-09-17 03:10:08

关于画图底层算法的相关文章

java-求关于图片裁剪的底层算法解释

问题描述 求关于图片裁剪的底层算法解释 根据鼠标点击位置得到裁剪范围,然后把指定范围裁剪出来.从底层来看,就是输出指定范围的数据.拿jpg为例,jpg是个压缩格式,经过了游程编码和哈夫曼树,算法是怎么找到鼠标点击位置是在图像数据的哪里?怎么确定的指定范围对应的图形数据?我看了一些裁剪的源码,但是没有看懂......求大神帮忙解答!! 解决方案 自己顶下--求解答啊求解答

从计步底层算法切入智能穿戴设备,入选APPStore2013年度优秀APP

手机计步类产品很多,但"乐动力"(iOS/Android)是当中唯一入选中国区 APP Store 2013 年度精选的,作为年度精中的"年度优秀 APP","乐动力"CEO 刘超和我们分享了入选 APP Store 年度精选的趣事,以及作为智能可穿戴式设备产业链的中的一环,计步类 APP 可能的发展方向."乐动力"是一款手机计步 APP,和我们之前介绍过的Nike+ Move.Moves.动动计步类似.除了基础的计步功能外,

C++算法、C#界面

问题描述 小弟最近在做一个工业控制上位机软件项目,准备用C#界面,C++/cli封装层,c++做底层算法,底层算法里面的数据很多是多层vector嵌套,C#里面用多层List嵌套去接收,发现性能很差,不知道哪位大大知道有类似的开源项目没有?三层架构的就可以了. 解决方案 解决方案二:自己顶一下!!!!解决方案三:能推荐几本C++CLI的参考书不?这类书感觉好少解决方案四:该回复于2016-01-31 23:14:33被版主删除解决方案五:性能很差?c#和C++PI/invoke的数据量很大么,c

《R的极客理想——高级开发篇 A》一一2.1 用R重写Mahout协同过滤算法

2.1 用R重写Mahout协同过滤算法 问题 如何用R语言实现推荐算法? 引言 推荐系统在互联网应用中很常见,比如亚马逊为你推荐购书列表,豆瓣为你推荐电影列表.Mahout是Hahoop家族用于机器学习的分步式计算框架,主要包括三类算法,即推荐算法.聚类算法和分类算法.本节将用R语言来重写推荐部分的基于用户的协同过滤算法.用R语言重写Mahout的基于用户的协同过滤推荐算法,将完全按照Mahout的思路和设计进行实现,并与Mahout的计算结果进行对比.2.1.1 Mahout的推荐算法模型

深入理解JVM之三:垃圾回收算法

前言 垃圾收集算法是JVM中垃圾收集器的方法论,所以了解算法是必要的,在算法领域只做最简单的介绍,力求文章的简单易懂.垃圾收集算法主要有以下几种:标记-清除算法(mark-sweep).复制算法(copying)和标记-整理算法(mark-compact).随着jdk版本的升级,垃圾收集器也在不断的升级,现在最新的垃圾收集器已经能够对Java堆中一部分进行回收,也能够对Java堆中另一部分进行回收,这一成果在jdk1.7中得到体现.但是垃圾收集器的底层算法是深入垃圾收集器所必须了解的,这篇文章将

jni-android中向底层传递字符串

问题描述 android中向底层传递字符串 我想在android的中将一个字符串传递到底层,然后在底层判断传过来的字符串是否与 底层算法生成的一样,我该怎么做呢 ,求帮助谢谢 解决方案 http://blog.csdn.net/zgyulongfei/article/details/7409441

开发基于以太坊的区块链底层平台,秘猿科技想做共识数据时代的Oracle

  "与其说区块链是比特币的底层技术,不如说比特币是区块链技术的第一个成功的应用."秘猿科技的创始人谢晗剑这样看待区块链和比特币的关系. 秘猿科技是一家从事底层区块链平台开发和共识算法研究的公司,其不久前发布了一个基于以太坊构架的区块链平台CITA,其上面可以开发各种区块链应用.CITA的底层算法被称为太极,这是一个许可链共识算法,具有高吞吐量.高容忍度.低通讯开销.低延迟等优点. "比特币的底层区块链是公有链,公有链的问题在于效率太低,主要原因是公有链由全网所有节点共同控制

智能家庭本周锋闻:小米智能家居露真容

  传闻已久的小米智能家居终于露出真容,宅客君再次探营亲身体验,很有些触动要跟大家分享.另外,本周宅客君开始关注到了家庭安防领域,安防设备一直以来都是面向商用市场或者高端别墅,作为智能家居的一部分,高大上的安防设备如何飞入寻常百姓家?且看本周锋闻: 一. 小米智能家居进展如何?来一探究竟 小米智能家居以路由器为控制中心,以此为平台把可联网的智能设备协调起来,实现统一管理.用手机app控制智能单品最没劲了,小米路由器可以开启智能场景联动模式,让相关的智能设备之间互相通信,减少人为操作.除了这些固定

大数据分析平台Hadoop与Spark之争

ZD至顶网软件频道消息 原创文章(文/邓晓蕾): 有人把大数据称为信息资产.有人称为金矿.甚至社会财富.而大数据,即,无法在可承受的时间范围内用常规软件工具进行捕捉.管理和处理的数据集合.Gartne认为"大数据"是需要新处理模式才能具有更强的决策力.洞察发现力和流程优化能力的海量.高增长率和多样化的信息资产.大数据并不在"大",而在于"有用".价值含量.挖掘成本比数量更为重要.对于很多行业而言,如何利用这些大规模数据是成为赢得竞争的关键.大数据