操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Unity2017.3 | NativeC 最近在学习 Unity tilemap Brush 自定义笔刷功能时候,看到其直线笔刷 LineBrush 是采用 Bresenham 算法实现,故借此机会在这里记录下学习过程,并在最后给出完整实现. Introduction Bresenham 是光栅化的直线算法,或者说是通过像素来模拟直线.比如下图所示像素点来模拟红色的直线. 给定两个起点 P1(x1, y1) | P2…
function DrawLineBresenham(x1,y1,x2,y2) %sort by x,sure x1<x2. if x1>x2 tmp=x1; x1=x2; x2=tmp; tmp=y1; y1=y2; y2=tmp; end dx=x2-x1; dy=y2-y1; twoDy=2*dy; twoDy_Dx=2*(dy-dx); twoDx=2*dx; twoDx_Dy=2*(dx-dy); twoDxPlusDy=2*(dx+dy); %branch 1: k>0 ?…
现在的计算机的图像的都是用像素表示的,无论是点.直线.圆或其他图形最终都会以点的形式显示.人们看到屏幕的直线只不过是模拟出来的,人眼不能分辨出来而已.那么计算机是如何画直线的呢,其实有比较多的算法,这里讲的是Bresenham的算法,是光栅化的画直线算法.直线光栅化是指用像素点来模拟直线,比如下图用蓝色的像素点来模拟红色的直线. 给定两个点起点P1(x1, y1), P2(x2, y2),如何画它们直连的直线呢,即是如何得到上图所示的蓝色的点.假设直线的斜率0<k>0,直线在第一象限,Bres…
在我们内部开发使用的一个工具中,我们需要几乎从 0 开始实现一个高效的二维图像渲染引擎.比较幸运的是,我们只需要画直线.圆以及矩形,其中比较复杂的是画直线和圆.画直线和圆已经有非常多的成熟的算法了,我们用的是Bresenham的算法. 计算机是如何画直线的?简单来说,如下图所示,真实的直线是连续的,但我们的计算机显示的精度有限,不可能真正显示连续的直线,于是我们用一系列离散化后的点(像素)来近似表现这条直线. (上图来自于互联网络,<计算机图形学的概念与方法>柳朝阳,郑州大学数学系) 接下来的…
Breaseman算法绘制直线算法公式推导|步骤|程序 BreaseMan算法优点: (1)不必计算直线的斜率,因此不用做除法: (2)不用浮点数,只用整数: (3)制作整数的加减乘除,和乘2操作,乘2操作可以直接用移位运算来处理: (4)BresenMan算法的运算速度非常快. 明白了数学原理,我们很快能确定算法步骤: 1. 输入线段的起点和终点. 2. 判断线段的斜率是否存在(即起点和终点的x坐标是否相同),若相同,即斜率不存在, 只需计算y方向的单位步进(△Y+1次),x方向的坐标保持不变…
转置矩阵 Time Limit: 1000ms   Memory limit: 32768K  有疑问?点这里^_^ 题目链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1592 题目描述 把矩阵A的行换成相应的列,得到的新矩阵称为A的转置矩阵,记作A'或A.给你一个矩阵,求它的转置矩阵. 输入 输入数据的第一行是两个正整数R和C(1<=R,C<=10),分别代表矩阵的行数和列数.接下来…
也没啥原创,就是在学习深度学习的过程中丰富一下我的博客,嘿嘿. 不喜勿喷! Hinton是深度学习方面的大牛,跟着大牛走一般不会错吧-- 来源:A fast learning algorithm for deep belief nets 看着引用次数,什么时候我也能来一篇(不要笑我这个学渣). 摘要中出现的几个词就让我有点茫然: complementary priors,这是一个启发规则还是什么鬼的 explaining away effects,没听说过这个效应捏 据说他的这种快速的贪心算法(…
源:Gamma原理及快速实现算法(C/C++) 原文:http://blog.csdn.net/lxy201700/article/details/24929013 参考 http://www.cambridgeincolour.com/tutorials/gamma-correction.htm http://en.wikipedia.org/wiki/Gamma_correction 论文Gamma矫正的快速算法以及其C语言实现 一.什么是Gamma校正 Gamma校正是对输入图像灰度值进行…
算法基础是一个整型数组,当且仅当第p个元素和第q个元素相等时,p和q时连通的.初始时,数组中的第i个元素的值为i,0<=i<N,为实现p与q的合并操作,我们遍历数组,把所有名为p的元素值改为q.我们也可以选择另外一种方式,把所有名为q的元素改为p. 这个程序从标准输入读取小于N的非负整数对序列(对p-q表示"把对象β 连接到q"),并且输出还未连通的输入对.程序中使用数组id,每个元素表示一个对象,且具有以下性质,当且仅当p和q时连通的,id[p]和id[q]想等.为简化起…
DDA_为微分绘制直线算法 以步进坐标轴部长=1像素为单位,计算y=kx + b,绘制像素点(x, round(y)). 即步进坐标增长1, 另一坐标增长K或者1/k. 程序如下: //数值微分算法DDA void CCGProjectWorkView::DDA_Line(const int startPos[], const int endPos[], const float lineColor[]) { glPushMatrix(); //绘制直线 long deltX, deltY, ma…