Wu反走样算法###

原理:在我看来,Wu反走样算法是在Bresenham算法基础上改进了一番,它给最靠近理想直线/曲线的两个点以不同的亮度值,以达到模糊锯齿的效果。因为人眼看到的是线附近亮度的平均值。

MFC 中给CXXXView类添加函数
void CMy3_4View::wuLine(CPoint p0, CPoint p1)
{
//自定义二维坐标系
CDC *pDC = GetDC();
CRect rect;
GetClientRect(&rect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(rect.Width(), rect.Height());
pDC->SetViewportExt(rect.Width(), -rect.Height());
pDC->SetViewportOrg(rect.Width()/2, rect.Height()/2);
rect.OffsetRect(-rect.Width()/2, -rect.Height()/2);
//----------------------------------------------------------- CPoint p, temp;
int dx=p1.x-p0.x;
int dy=p1.y-p0.y;
double k=(dy*1.00)/(dx*1.00);//计算斜率 if(dx==0)//垂线
{
if(dy<0)//起点在上方,调换
{
temp=p0;
p0=p1;
p1=temp;
}
for(p=p0; p.y<p1.y; p.y++)//主移动方向->y,不包括p1
{
pDC->SetPixelV(p.x, p.y, RGB(0,0,0));
}
} else
{
double e=0.00;//增量 if(k>=0 && k<=1)
{
if(dx<0)//p1在左侧,调换
{
temp=p0;
p0=p1;
p1=temp;
}//p0在左下 for(p=p0; p.x<p1.x; p.x++)//主移动方向->x,不包括p1
{
pDC->SetPixelV(p.x, p.y, RGB(e*255, e*255, e*255));
pDC->SetPixelV(p.x, p.y+1, RGB((1-e)*255, (1-e)*255, (1-e)*255));//不同亮度值
e+=k; if(e>=1.0)
{
p.y++;
e-=1;
}
}
/*p0.x+=10;
p1.x+=10;
pDC->MoveTo(p0);
pDC->LineTo(p1);*/
}
else if(k>1)
{
if(dy<0)//p1在左侧,调换
{
temp=p0;
p0=p1;
p1=temp;
}//p0在下方 for(p=p0; p.y<p1.y; p.y++)//主移动方向->y,不包括p1
{
pDC->SetPixelV(p.x, p.y, RGB(e*255, e*255, e*255));
pDC->SetPixelV(p.x+1, p.y, RGB((1-e)*255, (1-e)*255, (1-e)*255));
e+=1.00/(k*1.00); if(e>=1.0)
{
p.x++;
e-=1;
}
}
} else if(k>=-1 && k<0)
{
e=0.00;
if(dx<0)//p1在左上,调换
{
temp=p0;
p0=p1;
p1=temp;
}//p0在左上 for(p=p0; p.x<p1.x; p.x++)//主移动方向->x,不包括p1
{
pDC->SetPixelV(p.x, p.y, RGB(-1*e*255, -1*e*255, -1*e*255));
pDC->SetPixelV(p.x, p.y-1, RGB((1+e)*255, (1+e)*255, (1+e)*255));//这里e是负数!!!
e+=k; if(e<=-1.0)
{
p.y--;
e+=1.0;
}
}
} else if(k<-1)
{
if(dy>0)//p1在上方,调换
{
temp=p0;
p0=p1;
p1=temp;
}//p0在上
for(p=p0; p.y>p1.y; p.y--)//主移动方向->y,不包括p1
{
pDC->SetPixelV(p.x, p.y, RGB(e*255, e*255, e*255));
pDC->SetPixelV(p.x+1, p.y, RGB((1-e)*255, (1-e)*255, (1-e)*255));
e+=-1.0/(k*1.0); if(e>=1.0)
{
p.x++;
e-=1;
}
}
} }
pDC->DeleteDC();
}
VC++ 6.0编译通过!如有错误,或编译不通过,请留言。

Wu反走样算法绘制直线段的更多相关文章

  1. Wu反走样算法绘制圆(C++/MFC实现)

    Wu反走样圆 原理:参考Bresenham算法,在主位移过程中计算出离理想圆最近的两个点,赋予不同的亮度值,绘制像素点即可! MFC 中CXXXView类中添加函数: //Wu算法画反走样圆 void ...

  2. Qt 学习之路 2(26):反走样

    Qt 学习之路 2(26):反走样 豆子 2012年11月12日 Qt 学习之路 2 9条评论 我们在光栅图形显示器上绘制非水平.非垂直的直线或多边形边界时,或多或少会呈现锯齿状外观.这是因为直线和多 ...

  3. Simple2D-23(重构)反走样几何图形

    以前 Simple2D 使用 Canvas2D 对象来绘制几何图形,而且渲染出来的几何图形存在明显的锯齿.如果想要抗锯齿的几何图形,则需要开启 OpenGL 的 MSAA,这需要很大的开销. 如果不使 ...

  4. qt反走样(简选)

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #qt反走样(简选) #概念 """ ...

  5. Opengl研究4.0 走样与反走样

    Opengl研究4.0 走样与反走样 DionysosLai(906391500@qq.com) 2014-06-25          走样与反走样,也叫混淆与反混淆.所谓走样,是因为使用离散量(像 ...

  6. NeHe OpenGL教程 第四十六课:全屏反走样

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  7. Breaseman算法绘制直线算法公式推导|步骤|程序

    Breaseman算法绘制直线算法公式推导|步骤|程序 BreaseMan算法优点: (1)不必计算直线的斜率,因此不用做除法: (2)不用浮点数,只用整数: (3)制作整数的加减乘除,和乘2操作,乘 ...

  8. OpenGL(十八) 顶点数组和抗锯齿(反走样)设置

    顶点数组函数可以在一个数组里包含大量的与顶点相关的数据,并且可以减少函数的调用.使用顶点数组需要先启用顶点数组功能,使用glEnableClientState函数启用顶点数组,参数可以是GL_VERT ...

  9. canvas学习总结三:绘制路径-线段

    Canvas绘图环境中有些属于立即绘制图形方法,有些绘图方法是基于路径的. 立即绘制图形方法仅有两个strokeRect(),fillRect(),虽然strokezText(),fillText() ...

随机推荐

  1. 我面试过没有上万人也有十几个,简历要这么写才有hr要你

    今天终于有时间好好给大家写写关于如何写简历,给自己加分了. 这篇文章拖了很久了应该说,本来想在上周写的,但是事情实在是太多,又不想草草了事,所以搁置到现在.今天早上正好空出来了,就马上给大家码出来了. ...

  2. react-native热更新之CodePush详细介绍及使用方法

    react-native热更新之CodePush详细介绍及使用方法 2018年03月04日 17:03:21 clf_programing 阅读数:7979 标签: react native热更新co ...

  3. Python编程Day5——可变与不可变类型、数据类型整合

    一.可变与不可变类型1.可变类原值型:只改变,但id不变,证明就是在改变原值,是可变类型2.不可变类型:值改变,但id也跟着改变,证明是产生了新的值,是不可变类型 x= print(id(x)) x= ...

  4. (转)EVMON_FORMAT_UE_TO_TABLES procedure - move an XML document to relational tables

    原文:https://www.ibm.com/support/knowledgecenter/zh/SSEPGG_9.8.0/com.ibm.db2.luw.sql.rtn.doc/doc/r0054 ...

  5. Ubuntu apt-get和pip国内源更换

    Ubuntu apt-get和pip源更换 更新数据源为国内,是为了加速安装包的增加速度. 更换apt-get数据源 输入:sudo -s切换为root超级管理员: 执行命令:vim /etc/apt ...

  6. 使用3D Slicer对图像进行配准

    在进行深度学习之前,我们需要图像进行一些预处理操作,其中配准是很重要的一环,以下将介绍使用软件3D Slicer来进行图像配准 3D Slicer是(1)一个软件平台,用以图像分析(包括配准和实时编辑 ...

  7. Angular2入门:TypeScript的类 - 参数属性:定义和初始化类成员

  8. man rpcbind(rpcbind中文手册)

    本人译作集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.html RPCBIND() BSD System Manager's Manual RPCBI ...

  9. Perl的die和warn函数

    die和warn die可以在出现错误的时候停止程序,并给出消息.默认会输出出错的程序名称和出错行号 warn函数和die函数类似,但和die的区别是不会终止程序 die和warn的参数末尾如果给了\ ...

  10. python语法风格

    这里只给出其它文章里不适合出现部分语法风格. python有几种类型的复合语句:if.for.while.def.class.try/except.with/as等.这些复合类型的语句在编写时,要遵循 ...