当前位置:首页 » 操作系统 » 画线算法

画线算法

发布时间: 2022-01-12 03:38:22

Ⅰ bresenham画线算法与计算机图形学画线算法有什么不同

计算机图形学画线算法很多,有DDA算法、逐点比较法、Bresenham算法等,Bresenham算法是最着名的,而且算法中只用到了加法和移位运算,没有浮点数,没有乘除法,所以执行速度最快。

Ⅱ 划线算法 原理

1.这不是新的算法,它和我们的乘法竖式其实是一样的

2.算交点数就能得出乘法的结果,这不奇怪,
从最简单的乘法看,比如1x3=3
你在横向划一条线,纵向划三条线,交点数当然是3个

再比如2x3=6
你在横向划两条线,纵向划三条线,交点数当然是6个,不信,你可以数。
原因是:横向一条线,与纵向三条线,交点数是3个;
而现在,横向有两条线,所以交点数有2x3个,也就是6个

这是一位数的乘法,已经清楚了。
但对于多位数的呢,也可以用和上面一样的方法,横向划一组线,纵向划一组线,然后数交点数,对于比较大的数,恐怕大家没耐心把点数完。

3.对于多位数的乘法,用视频中的划线法,其实和我们的乘法竖式其实是一样的。
视频的例子:21x13=273

乘法竖式:
21
x13
----
63
21
----
273

我们在视屏中,看到有数出:2,1,6,3这么些点数,并且把6和1相加变成7放到了结果中。
而在以上乘法竖式中,也有2,1,6,3这么些数字,并且也是把6和1相加变成7放到了结果中。

视频的例子:123x321=39483

乘法竖式:
123
x321
-------
123
246
369
-------
39483

我们在视屏中,看到有把点数:1,4,9相加得出14,而14中的这个1被进到前面一位去了;
而在以上乘法竖式中,也有把数字:1,4,9相加得出14,而14中的这个1被进到前面一位去。

Ⅲ 求长方形之间的画线算法

长方形之间的画线是怎么画的?都不明白楼主想画什么线.

Ⅳ 如何用Java实现DDA画线算法,逐点画线算法,BRESENHAM画线算法

C++ JAVA 或其它语言, 他们的+-*/ if else while 这些都几乎一样, API和数据类型有差异, 但不影响读懂算法,还是去试着看懂吧,
而且我搜了一下, 网上有很多这些算法的文字描述, 理解起来不难;
研究算法还是自己动手吧;
LZ加油;

Ⅳ Bresenham画线算法

基本上Bresenham画线算法的思路如下:
//
假设该线段位于第一象限内且斜率大于0小于1,设起点为(x1,y1),终点为(x2,y2).
//
根据对称性,可推导至全象限内的线段.
1.画起点(x1,y1).
2.准备画下个点。x坐标增1,判断如果达到终点,则完成。否则,由图中可知,下个要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点.
2.1.如果线段ax+by+c=0与x=x1+1的交点的y坐标大于M点的y坐标的话,下个点为U(x1+1,y1+1)
2.2.否则,下个点为B(x1+1,y1+1)
3.画点(U或者B).
4.跳回第2步.
5.结束.
这里需要细化的是怎么判断下个要画的点为当前点的右邻接点还是当前点的右上邻接点.
设线段方程:ax+by+c=0(x1<x<x2,y1<y<y2)
令dx=x2-x1,dy=y2-y1
则:斜率-a/b
=
dy/dx.
从第一个点开始,我们有F(x,1,y1)
=
a*x1+b*y1+c=0
下面求线段ax+by+c=0与x=x1+1的交点:
由a*(x1+1)+b*y+c
=
0,
求出交点坐标y=(-c-a(x1+1))/b
所以交点与M的y坐标差值Sub1
=
(-c-a(x1+1))/b
-
(y1+0.5)
=
-a/b-0.5,即Sub1的处始值为-a/b-0.5。
则可得条件当
Sub1
=
-a/b-0.5>0时候,即下个点为U.
反之,下个点为B.
代入a/b,则Sub1
=
dy/dx-0.5.
因为是个循环中都要判断Sub,所以得求出循环下的Sub表达式,我们可以求出Sub的差值的表达式.下面求x=x1+2时的Sub,即Sub2
1.如果下下个点是下个点的右上邻接点,则
Sub2
=
(-c-a(x1+2))/b
-
(y1+1.5)
=
-2a/b
-
1.5
故Sub差值Dsub
=
Sub2
-
Sub1
=
-2a/b
-
1.5
-
(-a/b-0.5)
=
-a/b
-
1.代入a/b得Dsub
=
dy/dx
-1;
2.如果下下个点是下个点的右邻接点,
Sub2
=
(-c-a(x1+2))/b
-
(y1+0.5)
=
-2a/b
-
0.5
故Sub差值Dsub
=
Sub2
-
Sub1
=
-2a/b
-
0.5
-
(-a/b-0.5)
=
-a/b.
代入a/b得Dsub
=
dy/dx;
于是,我们有了Sub的处始值Sub1
=
-a/b-0.5
=
dy/dx-0.5,又有了Sub的差值的表达式Dsub
=
dy/dx
-1
(当Sub1
>
0)或
dy/dx(当Sub1
<
0).细化工作完成。
于是pcode可以细化如下:
//
Pcode
for
Bresenham
Line
//
By
SoRoMan
x=x1;
y=y1;
dx
=
x2-x1;
dy
=
y2-y1;
Sub
=
dy/dx-0.5;
//
赋初值,下个要画的点与中点的差值
DrawPixel(x,
y);
//
画起点
while(x<x2)
{
x++;
if(Sub
>
0)
//
下个要画的点为当前点的右上邻接点
{
Sub
+=
dy/dx
-
1;
//下下个要画的点与中点的差值
y++;
//
右上邻接点y需增1
}
else//
下个要画的点为当前点的右邻接点
{
Sub
+=
dy/dx;
}
//
画下个点
DrawPixel(x,y);
}
PS:一般优化:
为避免小数转整数以及除法运算,由于Sub只是用来进行正负判断,所以可以令Sub
=
2*dx*Sub
=
2dy-dx,则
相应的DSub
=
2dy
-
2dx或2dy.
思考1:如果Sub
=
0时,会产生取两个点都可以的问题。这个问题还没深入。

Ⅵ Bresenham openGL画线算法

建议把环境配置的语句弄上来,画不出来不一定是算法问题。OPENGL有很多错误都是黑屏,看不到想要的画面

Ⅶ 用C++如何实现bresenham画线算法计算机图形学上面有个drawpixel的函数。不知道怎么用。

drawpixel()函数这就是VC画点的,不同的平台由不同的函数来画点,这个是API函数不管什么平台归结到底都是调用这个函数来画点。
COLORREF SetPixel(
HDC hdc, // handle to DC
int X, // x-coordinate of pixel
int Y, // y-coordinate of pixel
COLORREF crColor // pixel color
);

Ⅷ 图形学中的中点画线法与Bresenham算法画线的区别

个人认为最关键的区别就是那个决策参数的计算方式!
在Bresenham算法中,假设我们在(x0,y0)处画了一个点,那我们就要决定下一个点是在(x0+1,y0)还是在(x0+1,y0+1)处画,这两个点一般都不在直线上,我们要计算这两个点离直线有多远,分别设两个点离直线的距离为p1、p2,然后决策参数就是p=p2-p1,再根据p的符号来判断选择哪个点
至于中点法,我没有用它来画过直线,只用来画过圆(自我感觉画圆用这个算法比Bresenham算法要好很多),但原理应该差不多!
在中点算法中,决策参数的就是方式就是圆的方程(换成直线就是直线的方程了),比如要画x^2+y^2=r^2的圆,那决策参数p=x^2+y^2-r^2,然后就不是代入上面找到的两个点直接代进去,而是代这两个点的中点进去,求出p的值,根据p的符号来判断那个中点是在圆上、圆内还是圆外,再进一步决定选择绘哪个点!
具体的计算过程没办法在这里完整演示,但个人认为不同之处还是在于决策参数的选择与计算

Ⅸ bresenham画线算法

用MFC还要bresenham干嘛

热点内容
qt文件加密 发布:2024-11-15 23:40:35 浏览:737
咸阳做脚本的 发布:2024-11-15 23:38:57 浏览:772
途观与探岳哪个配置高 发布:2024-11-15 23:30:39 浏览:517
dhcp服务器如何更新ip地址 发布:2024-11-15 23:18:40 浏览:125
ai清除缓存 发布:2024-11-15 23:12:38 浏览:602
电脑版我的世界如何退出服务器 发布:2024-11-15 23:00:39 浏览:312
哪里有存储器零售商 发布:2024-11-15 22:55:42 浏览:46
手机如何设置锁屏密码个性 发布:2024-11-15 22:44:08 浏览:417
mysql导入存储过程 发布:2024-11-15 22:43:18 浏览:638
net连接数据库代码 发布:2024-11-15 22:40:16 浏览:61