中点画线法算法

合集下载

绘制任意方向的直线

绘制任意方向的直线

p1 p2 p
p p1 p2
9
void MidpointLine3(int x0,int y0,int x1, int y1,int color) { int a, b, d1, d2, d, x, y; a=y0-y1; b=x1-x0; d=a+2*b; d1=2*b ; d2=2* (a+b); x=x0; y=y0; putpixel(x, y, color); while (x<x1){ if (d<0) {y++; d+=d1; } else {x++; y++; d+=d2; } putpixel (x, y, color); } }
编程实现中点画直线算法
编写不同斜率范围内的中点画线算法函数 编写主函数,输入端点坐标,初始化图形模 式,根据斜率调用相应的函数画线
判断斜率时要注意斜率为无穷大的情况 以上算法前提是x1<x2;对于x1>x2的情况可以直 接将起点与终点交换.所以算法执行前应该先将2 个坐标按照x递增的顺序进行排序.
1
2
ห้องสมุดไป่ตู้
构造判别式: d= F(M) =F(xp+1,yp-0.5) =a(xp+1)+b(yp-0.5)+c 若d≥0 中点在直线上方 取P2; p p1 此时再下一个象素的判别式为 p2 d2= F(xp+2, yp-1.5) =a(xp+2)+b(yp-1.5)+c = a(xp +1)+b(yp +0.5)+c +a -b =d+a-b ; 增量为a-b 若d<0 取P1; 此时再下一个象素的判别式为 d1=F(xp+2, yp-0.5)=a(xp+2)+b(yp-0.5)+c = a(xp +1)+b(yp -0.5)+c +a =d+a; 增量为a

中点画线算法(任意斜率)

中点画线算法(任意斜率)

中点画线算法(任意斜率)基本原理在画直线段的过程中,当前像素点为(xp ,yp ),下⼀个像素点有两种可选择点P1(xp +1,yp )或P2(xp +1,yp +1)。

若M=(xp +1,yp +0.5)为P1与P2之中点,Q为P理想直线与x=xp +1垂线的交点。

当M在Q的下⽅,则P2应为下⼀个像素点;M在Q的上⽅,应取P1为下⼀个像素点。

在斜率0<=k<=1的时候,实现代码如下(书本代码):void MidpointLine(int x0,int y0,int x1,int y1,int color){int a,b,d1,d2,d,x,y;a=y0-y1,b=x1-x0,d=2*a+b;d1=2*a,d2=2*(a+b);x=x0,y=y0;Drawpixel(x,y,color);while (x<x1){if (d<0){ x++,y++,d+=d2;}else{ x++,d+=d1; }Drawpixel(x,y,color);}}对于其他斜率,我们可以推出如下关系:实现代码如下:void MidpointLine(int x0,int y0,int x1,int y1,int color){int a,b,d1,d2,d,x,y;float m;if (x1<x0){d=x0,x0=x1,x1=d;d=y0,y0=y1,y1=d;}a=y0-y1,b=x1-x0;if (b==0) m=-1*a*100;else m=(float)a/(x0-x1);x=x0,y=y0;Drawpixel(x,y,color);if (m>=0 && m<=1){d=2*a+b;d1=2*a,d2=2*(a+b);while (x<x1){ if (d<=0) { x++,y++,d+=d2;}else { x++,d+=d1; }Drawpixel(x,y,color);}}else if (m<=0 && m>=-1){d=2*a-b;d1=2*a-2*b,d2=2*a;while (x<x1){ if (d>0) { x++,y--,d+=d1;}else { x++,d+=d2; }Drawpixel(x,y,color);} }else if (m>1){d=a+2*b;d1=2*(a+b),d2=2*b;while (y<y1){ if (d>0) { x++,y++,d+=d1;}else { y++,d+=d2; }Drawpixel(x,y,color);} }else{d=a-2*b;d1=-2*b,d2=2*(a-b);while (y>y1){ if (d<=0) { x++,y--,d+=d2;}else { y--,d+=d1; }Drawpixel(x,y,color);}}}备注:Drawpixel(x,y,color);是pDC->SetPixel(x,y,crColor);的意思。

计算机图像图形学-中点画线法

计算机图像图形学-中点画线法

场景渲染
通过中点画线法,游戏开 发者可以快速渲染复杂的 场景,提高游戏运行效率。
计算机辅助设计
机械零件绘图
在计算机辅助设计中,中 点画线法可以用于绘制机 械零件的轮廓和细节,提 高绘图精度。
建筑设计
中点画线法可以用于建筑 设计领域,生成建筑物的 平滑轮廓,提高设计效果。
电路板设计
在电路板设计中,中点画 线法可以用于绘制电路路 径,优化电路布局和信号 传输。
图像处理与编辑
图像平滑处理
中点画线法可以用于图像平滑处 理,减少图像中的噪声和细节失
真。
图像修复
中点画线法可以用于图像修复,对 损坏或缺失的图像部分进行修复和 填充。
图像变换与合成
通过中点画线法,图像处理与编辑 软件可以实现图像的缩放、旋转和 平移等变换操作,以及图像合成和 拼接等操作。
PART 04
优化线条质量可以提高绘制的准确性和视觉效果,使线条 更加平滑、自然。
PART 03
中点画线法的应用场景
REPORTING
WENKU DESIGN
游戏开发
01
02
03
游戏中的பைடு நூலகம்图绘制
中点画线法可以用于游戏 中的地图绘制,生成平滑、 连续的路径,提高游戏体 验。
角色移动动画
在游戏开发中,中点画线 法可以用于生成角色移动 动画,使角色移动更加自 然流畅。
PART 02
中点画线法的实现过程
REPORTING
WENKU DESIGN
确定起点和终点
01
确定线条的起点和终点是中点画 线法的第一步,通常通过输入坐 标或鼠标点击屏幕上的位置来确 定。
02
起点和终点的坐标需要精确,否 则可能导致线条绘制错误或出现 偏差。

2019初中数学辅助线专项突破 专题1——中点专题 中点常见辅助线的作法

2019初中数学辅助线专项突破 专题1——中点专题 中点常见辅助线的作法

第一章中点专题三角形是初中几何的重要内容之一,也是历年中考命题的热点。

其中,三角形各边的中点、中线及中位线的有关性质的应用,是中考的必考内容,历年多以计算和证明题的形式出现。

我们预计与中点有关的操作性试题和综合性的探究题将是今后几年中考数学的重点题型。

方法技巧提炼与中点有关的辅助线,我们总结下列四种类型:类型一见中线,可倍长1.倍长中线或类中线(与中点有关的线段)构造全等三角形或平行四边形2.有些几何题在利用“倍长中线”证完一次全等三角形后,还需再证一次全等三角形,即“二次全等”.在证明第二次全等时,难点通常会体现在倒角上.常见的倒角方法有:①“8”字型(如图1-8);②平行线;③180° (平角;三角形内角和);④360° (周角;四边形内角和);⑤小旗子(三角形外角);⑥90° (互余角)类型二见等腰三角形,想“三线合一”已知等腰三角形底边的中点,可以考虑与顶点连接,用“三线合一”类型三见斜边,想中线已知直角三角形斜边的中点,可以考虑构造斜边中线,目的是得到三条等线段和两对等角.类型四见多个中点,想中位线已知三角形的两边有中点,可以连接这两个中点构造中位线;已知一边中点,可以在另一边上取中点,连接构造中位线;已知一边中点,过中点作平行线可构造相似三角形.精题精讲精练类型一见中线可倍长例题1.如图1-9,在∆ABC中,AD是BC边上的中线,E是AD上一点,延长BE交AC于点 F, AF=EF,求证:AC=BE.【思路提示】AD是中线,可考虑倍长中线.变式.如图1-10,在∆ABC中,AD交BC于点D,点E是BC的中点,EF//AD交CA的延长线于点F,交AB于点G,若AD为三角形ABC的角平分线,求证:BG=CF.例题2.如目1-11,在 Rt△ABC中,∠BAC=90°,点D为BC的中点,点E,F分别为AB,AC上的点,且ED⊥FD,以线段BE、EF、FC为边能否构成一个三角形?若能,该三角形是锐角三角形、直角三角形还是钝角三角形?【思路提示】倍长中线DF,造全等三角形变式1.如图1-12,已知点M 为△ABC 中BC 边上的中点,∠AMB, ∠AMC 的平分线分别交AB, AC 于点E ,F,连接 EF.求证:BE+CF>EF.变式2.如图1-13,在△ABC 中,点 D 是 BC 的 中 点,DM ⊥DN ,如果BM 2+CM 2=DM 2+DN2求证:AD 2=41(AB 2+AC 2).例题3.(丰台一模)已知 ABC 和△AED 是两个不全等的等腰直角三角形,其中BA = BC ,DA = DE ,连接EC ,取EC 的中点M ,连接BM 和DM. 如图1-14(1),如果点D ,E 分别在边AC ,AB 上,那么BM ,DM 的数量关系与位置关系是 ; 将图1-14(1)中的△ADE 绕点A 旋转到图1-14(2)的位置,判断(1)中的结论是否依然成立,并说明理由.【思路提示】见到中点可考虑倍长中线证全等,得到线段相等和平行线,再证二次全等即可.检测1:如图1-15,在∆ABC中,若AB=10,AC = 6,求边上的中线AD的取值范围.检测2:如图1-16,在∆ABC中,D是BC边上的中点,DE丄DF于点D,DE交AB于点E:,DF交 AC 于点F,连接EF.求证:BE + CF>EF.类型二见等腰三角形,想“三线合一”例题4.如图1-17,一副三角板如图放置,等腰直角三角板ABC固定不动,另一块三角板的直角顶点放在等腰直角三角形的斜边中点D处,且可以绕点D旋转,在旋转过程中,两直角边的交点G, H始终在边AB,BC上.(1)在旋转过程中线段和CH大小有何关系?证明你的结论.(2)若AB=BC=4cm,在旋转过程中四边形的面积是否改变?若不变,求出它的值;若改变,求出它的取值范围.(3)若交点G,H分别在边AB,BC的延长线上,则(1)中的结论仍然成立吗?请画出相应的图形,直接写出结论.【思路提示】见到中点D,而且在等腰直角三角形的底边上,可以想“三线合一”,再证全等.例题5.如图1-18,点P是等腰Rt∆ABC底边BC上一点,过点P作BA,AC的垂线,垂足分别为点E,F,设点D为BC的中点.求证:DEF∆是等腰直角三角形.【思路提示】欲证明DEF∆=90°,故只要证明∆是等腰直角三角形,需证明DE=DF,DEF∆即可解决.≅DEF∆DAF检测1:如图1-19,∆ABC是等腰直角三角形,AB=AC,D是斜边BC的中点,E, F分别是AB, AC 边上的点,且DE丄DF.(1)请说明:DE=DF;(2)请说明:BE2+ CF2= EF2;(3)若BE=6,CF=8,求∆DEF的面积.(直接写结果)类型三见斜边,想中线例题6.如图1-20,∆ABC中,若∠B=2∠C,AD丄BC,E为BC边的中点.求证:AB=2DE.【思路提示】取斜边AC或AB的中点,利用斜边中线性质和中位线性质.例题7.如图1-21,在Rt∆ABC中,∠ACB = 90°,点D,E分别是AB, AC的中点,点F在BC 的延长线上,且∠CEF=∠A.求证:DE=CF.【思路提示】点D,E分别是直角三角形ABC斜边和直角边的中点,利用斜边中线的性质和中位线解题.检测1:如图1-22,在Rt ∆ABC 中,∠ACB = 90°,M 是AB 的中点,E ,F 分别是AC ,BC 延长线上的点,且CE=CF=21AB ,则EMF ∠的度数为多少?检测2:如图1-23,在Rt ∆ACB 中,C 为直角顶点,∠ABC=25°,O 为斜边中点.将OA 绕着点O 逆时针旋转θ (0°<θ<180°)至OP ,当∆BCP 恰为轴对称图形时,θ的值为多少?类型四见多个中点,想中位线例题8.问题一:如图1-24 (1),在四边形ABCD中,AB=CD,E,F分别是BC,AD的中点,连接EF 并延长,分别与BA,CD的延长线交于点M,N.求证:∠BME=∠CNE.问题二:如图1-24 (2),在四边形ADBC中,AB与CD相交于点O,AB=CD,E,F分别是BC,AD 的中点,连接EF,分别交DC,AB于点M,N,判断OMN∆的形状,请直接写出结论.问题三:如图1-24 (3),在∆ABC中,AC>AB,点D在AC上,AB=CD,E,F分别是BC,AD的中点,连接EF并延长,与BA的延长线交于点G,连接GD。

全等三角形辅助线系列之二中点类辅助线作法大全

全等三角形辅助线系列之二中点类辅助线作法大全
【解析】延长 至 ,使 ,连接 、 、 .
因为 , , ,那么 .
从而 , .
而 , ,故 ,因此 ,
即 ,那么 ,即 .
因为 ,故 ,那么 .
为Rt 斜边 上的中线,故 .
由此可得 .
【例5】在 中, 是斜边 的中点, 、 别离在边 、 上,知足 .假设 , ,那么线段 的长度为_________.
因为 是 的中点, 是 的中点,
故 是 的中位线,从而 ,
由 可得 ,故 ,
从而 , .
【例7】已知:ABCD是凸四边形,且 .E、F别离是AD、BC的中点,EF交AC于M;EF交BD于N,AC和BD交于G点.求证: .
【解析】取AB中点H,连接EH、FH.
∵ , ,∴EH∥BD, ,∴
∵ ,
∴FH∥AC,
【解析】(1) ;
(2)如图2,过点C作CE的垂线交BD于点G,设BD与AC的交点为Q.
由题意, ,∴ .
∵D、E、B三点共线,∴AE⊥DB.
∵ , ,∴ .
∵ , ,∴ .
∴ ,∴ ,∴ .
∵F是BD中点,∴F是EG中点.
在 中, ,∴ .
(3)情形1:如图,当 时,取AB的中点M,连结MF和CM,
(1) ;
(2) .
【解析】(1)如下图,依照题意可知 且 ,
且 ,
因此 .
而 、 别离是直角三角形 、 的斜边的中点,
因此 , ,
又已知 ,
从而 .
(2)由(1)可知 ,那么由 可得 .
而 、 均为等腰三角形,
因此 .
【例10】已知,如图四边形 中, , 、 别离是 和 的中点, 、 、 的延长线别离交于 、 两点.求证: .

七上数学中点问题解题技巧和方法

七上数学中点问题解题技巧和方法

七上数学中点问题解题技巧和方法一、认识中点1、什么是中点在平面几何中,中点指的是线段的中心点,也就是将一条直线段平均分成两段的点。

在坐标系中,中点的坐标可以通过相应线段的两个端点的坐标来求得。

2、中点的特点中点具有以下特点:- 与两端点距离相等- 与两端点连线构成的线段长度是全线段长度的一半- 坐标为两端点坐标的算术平均值二、中点问题解题技巧和方法1、求直线段中点的坐标求直线段中点的坐标,可以通过端点坐标的平均值来求得。

假设直线段的两个端点分别为A(x1,y1)和B(x2,y2),则中点的坐标为:\[M(\frac{x1+x2}{2},\frac{y1+y2}{2} )\]2、中点问题解题步骤求解中点问题一般需要经过以下步骤:- 确定问题:明确问题中需要求解的中点的具体内容,确定问题中所给条件以及未知数。

- 分析问题:通过问题分析,理清思路,确定解题的方法和步骤。

- 求解过程:根据问题需求,使用公式或者坐标的求解方法求得中点坐标。

- 检验答案:求得中点坐标后,通过计算或者图示方法对答案进行检验,确保结果的准确性。

三、实例分析下面通过实例对中点问题的解题技巧和方法进行具体分析。

例题:已知直线段AB的端点坐标分别为A(2,3)和B(6,8),求直线段AB的中点坐标M。

分析解题步骤:1. 确定问题:根据题目要求,需要求解直线段AB的中点坐标M。

2. 分析问题:根据中点的定义和公式,可以通过端点坐标的平均值求得中点坐标。

3. 求解过程:根据公式\[M(\frac{x1+x2}{2},\frac{y1+y2}{2} )\],带入端点坐标得到:\[M(\frac{2+6}{2},\frac{3+8}{2} )\],计算得中点坐标M为:\[M(4,5)\]。

4. 检验答案:通过计算得到的中点坐标进行检验,发现满足与端点距离相等的特点,因此得出结论,中点坐标M为(4,5)。

四、总结与思考中点问题是数学中的基础问题,其求解过程涉及到坐标系的运用、平均值的计算等数学知识。

例谈中点问题的几种辅助线的作法

例谈中点问题的几种辅助线的作法

例谈中点问题的几种辅助线的作法U思路方法37例谈中点问题的几种辅助线的作法■娄茹在研究几何图形时,若有涉及中点的问题,我们常需要添加一些适当的辅助线来解答问题,如果能够把这一类问题的一般方法作出全面的归纳,那将对我们思考问题是很有益处的.一,作等腰三角形底边上的中线在等腰三角形中,作它底边上的中线,我们可利用等腰三角形"三线合一"的性质来解答问题.例1已知:如图1,点D,E在△ABC的边BC上,AB=AC,=AE,求证:BD=CE.分析:本题利用全等三角形可以证明,但若作底边上的高线,运用等腰三角形"三线合一"的性质,证法更显简洁.证明:作AF上BC,垂足为F,则AF上DE.BDFEc图1'.'AB=AC,AD=Ao又AF上BC,.IF上DE,o'oBF=CF.DF=EF.因此:BID=CE.二,作平行线.构造全等三角形已知三角形一边的中点,我们可以经过其中一个顶点作对边的平行线,构造""型图,从而可以得到全等三角形.例2已知:如图2,ABC=忸=90*,AD+BC=CD,为佃的中点,求证:DEC=9.证明:延长DE,交CB的延长线于点F.'.'DAE=船=90",=髓,.tED=BEF,.△AED兰△BEF.AD口C图2.'.DE=EF,AD=BFo又+BC=CD,..BF+BC=CD,即CF=CD.又DE=EF....CE上DF.因此:DEC=9.三,作平行线,构造中位线已知三角形一边的中点,我们可以过这个中点,或者过其中一个端点作平行线,构造"A"型图,从而可以得到三角形的中位线,运用中位线解答答问题. 例3已知:如图3,AD是/"ABC的中线,直线CF交AD于E,交liB于F,求证::2BFAF1B分析:本题属于三角形边上的中点问题,除了构造全等(即作BM∥CF,交AD 的延长线于点)外,也可以过中点D作平行线,构造中位线.证明:作DG∥cF,交BF于c,则AE:ED=AF:彤.DG//CF.BD:CD,.FG=吉.笪一'ED一B—I一,.田.笪一儿:ED—BF.四,作直角三角形斜边上的中线在直角三角形中,我们可以作斜边上的中线,运用"直角三角形斜边上的中线等于斜边的一半"这个重要性质来解答问题.例4已知:如图4,在/xABC中,B=2LC,AD上BC,为BC的中点,求证:DM=吉他.证明:取的中点E,连结DE和EM,则A图4DE=÷AB,B=EDB.又EM是△BAC的中位线,..EM∥AC,即EMB=C.'.'MED=BED一EMD=B一÷B=二C,.'.仍=MED,因此:DM=DE=—1AB.注:本例取AC的中点同样可证.五,连结圆心与弧(弦)的中点在圆中,我们可以连结圆心与弧(弦)的中点,利用垂径定理的推论来解答问题.例5已知:如图5,BC为oD的直径,ADJIBC,垂足为D.A日=AF,BF和.tD相交于点E,求证:AE=BE.分析:由于点A为BF的中点,圆心是点0,若连结,则可利用垂径定理的推论来解答问题.证明:连结AO,交BF于点G,.点0为圆心,佃=AF,..AO_l_BF.在AAOD与△BOG中,'.'AJDD=BC.O=90*,AO=BO,A0=BOG,.'.△A0口兰△肋G(AAS),.'.A=B,DO=GO,又BD=A0,.'.BD:AG...△肋E兰△ACE.因此:A=BE.(作者单位:江苏省新沂市第四中学)。

实验1中点画线和Bresenham画线算法的实现

实验1中点画线和Bresenham画线算法的实现

实验1中点画线和Bresenham画线算法的实现计算机图形学实验报告实验1 使用画线算法,绘制直线段一.实验目的及要求(1)掌握图形学中常用的三种画线算法:数值微分法、中点画线法和Bresenham画线算法。

(2)掌握绘制直线的程序设计方法。

(3)掌握使用文件来保存直线段的方法。

(4)掌握从文本文件中恢复出直线的方法。

二.实验内容使用VC++ 6.0开发环境,分别实现中点画线算法和Bresenham 画线算法,绘制直线(注意,不能使用VC中已有的绘制直线的函数),并以文本文件的形式保存绘制的结果,可以从文本文件中恢复出以前绘制过的直线。

三.算法设计与分析Bresenham算法绘制直线的程序(仅包含整数运算)。

void MidBresenhamLine(int x0,int y0,int x1,int y1,int color) {int dx,dy,d,UpIncre,DownIncre,x,y;if(x0>x1){x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;}x=x0;y=y0;dx=x1-x0;dy=y1-y0;d=dx-2*dy;UpIncre=2*dx-2*dy;DownIncre=-2*dy;while(x<=x1){putpixel(x,y,color);X++;if(d<0){y++;d+=UpIncre;}else d+=DownIncre;}}四.程序调试及运行结果的自我分析与自我评价// testView.cpp : implementation of the CT estView class#include "stdafx.h"#include "test.h"#include "testDoc.h"#include "testView.h"#include // ifstream、ofstream等位于其中#include#include // string类型需要#include "DlgInput.h" //CDlgInput类的头文件using namespace std;#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif// CTestViewIMPLEMENT_DYNCREATE(CTestView, CView)BEGIN_MESSAGE_MAP(CTestView, CView)//{{AFX_MSG_MAP(CTestView)ON_COMMAND(ID_MENUITEM32771, OnMenuitem32771)ON_COMMAND(ID_MENUBRESENHAMLINE, OnMenubresenhamline) ON_COMMAND(ID_MENUCLEARVIEW, OnMenuclearview)ON_COMMAND(ID_FILE_OPEN, OnFileOpen)ON_COMMAND(ID_FILE_SA VE, OnFileSave)//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview) END_MESSAGE_MAP()// CTestView construction/destructionCTestView::CTestView(){// TODO: add construction code herem_nFlag = -1; // 不是任何绘图类型}CTestView::~CT estView(){}BOOL CTestView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}// CTestView drawingvoid CTestView::OnDraw(CDC* pDC){CTestDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereif(1==m_nFlag) // 中点画线{MidPointLine(m_X0, m_Y0, m_X1, m_Y1, RGB(255,0,0) );}else if(2==m_nFlag) // Bresenham画线{BresenhamLine(m_X0, m_Y0, m_X1, m_Y1, RGB(0,255,0) );}}// CTestView printingBOOL CTestView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CTestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CTestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}// CTestView diagnostics#ifdef _DEBUGvoid CTestView::AssertValid() const{CView::AssertValid();}void CTestView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CTestDoc* CTestView::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CT estD oc)));return (CT estDoc*)m_pDocument;}#endif //_DEBUG// CTestView message handlersvoid CTestView::OnMenuitem32771(){// TODO: Add your command handler code herem_nFlag = 1; // 中点画线CDlgInput dlg;if(IDOK==dlg.DoModal()){m_X0=dlg.m_nX0;m_Y0=dlg.m_nY0;m_X1=dlg.m_nX1;m_Y1=dlg.m_nY1;RedrawWindow(); //重绘窗口}}void CTestView::OnMenubresenhamline(){// TODO: Add your command handler code herem_nFlag = 2; // Bresenham画线CDlgInput dlg;if(IDOK==dlg.DoModal()){m_X0=dlg.m_nX0;m_Y0=dlg.m_nY0;m_X1=dlg.m_nX1;m_Y1=dlg.m_nY1;RedrawWindow(); //重绘窗口}}// 算法: 中点画线// 输入: 起点(x0,y0),终点(x1,y1);// 输入要求x0<=x1;void CTestView::MidPointLine( int x0, int y0, int x1, int y1, int color ){CDC * pDC=GetDC();int a,b,d0,d1,d2,d3,d4,d5,d,x,y;a=y0-y1;b=x1-x0; // 之前的设置已经保证始终有x1>=x0d=2*a+b;d0=2*a-b;d1=2*a;d2=2*(a+b);d3=2*b;d4=2*(a-b);d5=a-2*b;x=x0;y=y0;pDC->SetPixel(x,y,color);if(x==x1) // 斜率k为无穷大{if(y<=y1){while(y<=y1){pDC->SetPixel(x,y,color);y++;}}else{while(y>=y1){pDC->SetPixel(x,y,color);y--;}}}// if 斜率k为无穷大else // 斜率k为有限值{// double k=-a/b;// if( k+1>1e-6 && k-1<1e-6 || fabs(k-1)<1e-6 || fabs(k+1)<1e-6) // |k|<=1(即:-1<= k <=1),与1e-6比较是浮点数比较方法if( -b<=-a && -a<=b ) // 用浮点数比较在|k|=1.0f时容易出问题,所以直接用整数比较(将斜率k转换为a与b的比较;之前的设置已经保证b为正数){if(y<=y1){while(x<x1)< p="">{if(d<0){x++;y++;d+=d2;}else{x++;d+=d1;}pDC->SetPixel(x,y,color);}}else{while(x<x1)< p="">{if(d0<0){ x++;d0+=d1;}else{ x++;y--; d0+=d4; }pDC->SetPixel(x,y,color);}}}// if( |k|<=1 )else // |k|>1{if(y<=y1){while(x<x1)< p="">{if(d<0){y++;d+=d3;}else{y++;x++;d+=d2;}pDC->SetPixel(x,y,color);}}else{while(x<x1)< p="">{if(d5<0){ x++;y--; d5+=d4;}else{y--; d5+=-2*b;}pDC->SetPixel(x,y,color);}}}// else( |k|>1 )}// else 斜率k为有限值ReleaseDC(pDC);}// 算法: Bresenham画线// 输入: 起点(x0,y0),终点(x1,y1);// 输入要求x0<=x1;void CTestView::BresenhamLine( int x0, int y0, int x1, int y1, int color ){ CDC * pDC=GetDC();int x,y,dx,dy,e;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;while(x<=x1){ pDC->SetPixel(x,y,color);x++;e=e+2*dy;if(e>0){y++;e=e-2*dx;}}}void CTestView::OnMenuclearview(){// TODO: Add your command handler code here m_X0=0;m_Y0=0;m_X1=0;m_Y1=0;RedrawWindow();//重绘窗口}// 打开过去保存的文件,该文件包含直线的端点坐标void CTestView::OnFileOpen(){// TODO: 在此添加命令处理程序代码if( m_nFlag!=1 && m_nFlag!=2 ){MessageBox("请先在菜单中选择绘制直线的方法!","提示",MB_ICONWARNING);return;}CFileDialog dlgFile (TRUE, _T("txt"), _T(""),OFN_FILEMUSTEXIST| OFN_HIDEREADONL Y, _T("线段端点坐标文件(*.txt)|*.txt||"), this);if( IDOK == dlgFile.DoModal()){CString fileName = dlgFile.GetFileName();ifstream rFile;rFile.open(fileName,ios::in);if ( ! rFile.is_open() ){MessageBox("文件打开失败!","提示",MB_ICONW ARNING);return;}CString strLine0;string strLine;int nX,nY;// 起点、终点,两个坐标rFile>>strLine;strLine0 = strLine.c_str();nX = atoi( strLine0.Left( strLine0.Find(",") ) ); // 解析文件,如“220,221”表示一个点的x、y坐标nY = atoi( strLine0.Mid( strLine0.Find(",")+1 ) );m_X0 = nX;m_Y0 = nY;rFile>>strLine;strLine0 = strLine.c_str();nX = atoi( strLine0.Left( strLine0.Find(",") ) );nY = atoi( strLine0.Mid( strLine0.Find(",")+1 ) );m_X1 = nX;m_Y1 = nY;RedrawWindow();rFile.close();}}// 保存当前视图上绘制的所有直线的端点坐标void CTestView::OnFileSave(){// TODO: 在此添加命令处理程序代码CFileDialog dlgFile(FALSE, _T("txt"), _T(""), OFN_OVERWRITEPROMPT, _T("线段端点坐标文件(*.txt)|*.txt||"), this);if( IDOK == dlgFile.DoModal()) // 保存文件{CString strFileName = dlgFile.GetFileName(); // 包含完整路径的文件名称ofstream wFile;wFile.open(strFileName,ios::out|ios::ate|ios::app);if ( ! wFile.is_open() ){MessageBox(strFileName+"文件创建失败!","提示",MB_ICONW ARNING);return;}wFile<<m_x0<<","<<m_y0<<="">wFile<<m_x1<<","<<m_y1<<="">五.实验心得及建议实验心得:Bresenham算法是一种很方便很实用很简单的算法,它对任意斜率的直线段具有通用性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档