当前位置:文档之家› 直线生成算法 DDA画线算法、中点画线算法、Bresenham画线算法

直线生成算法 DDA画线算法、中点画线算法、Bresenham画线算法

直线生成算法 DDA画线算法、中点画线算法、Bresenham画线算法
直线生成算法 DDA画线算法、中点画线算法、Bresenham画线算法

101x x y y x y k --=??=B

kx y i i +=()()11

1111<+==??+=?++=+?+=+=++++k k

y y x let x

k y y x k B kx B x x k B kx y i i i i i i i i ()

11

1

111>+==??+-=-=+++k k x x y let k

y k B k y k B k y x i i i i i 实验一、直线生成算法

DDA 画线算法

一 .名称:DDA 画线算法;

二 . 算法分析:

1.设直线两端点为:P1(x1,y1)及 P0(x0,y0),

2.则直线斜率

3.则直线方程为

4.当 k <1 , x 每增加1,y 最多增加1(或增加小于1)。

5.当 k>1 ,y 每增加1,x 最多增加1 (或增加小于1) 。 y i

x i y i +1 x i +1

三.算法实现:

void CHuayahuaView::OnDda() //DDA画直线

{

// TODO: Add your command handler code here

CDC* pdc1 = GetDC();

int color = RGB(255,0,0);

int x1=10,y1=20,x2=200,y2=200;

double k=(y2-y1)*1.0/(x2-x1);//k<1;

double y=y1;

for(int i=x1;i<=x2;i++)

{

pdc1->SetPixel(i,(int)(y+0.5),color);

y=y+k;

}

ReleaseDC(pdc1);

}四:程序截图:

中点画线算法

一.实验名称:中点画线算法

二.算法分析:

直线方程

直线将二维空间划分为三个区域:

如F(x,y)=0, 则(x,y) 在直线上

如F(x,y)<0, 则(x,y)在直线下方

如F(x,y)>0, 则(x,y)在直线上方

条件: a= -(y1-y0)

b=(x1-x0)

c= -B(x1-x0)

三.代码实现:

void CHuayahuaView::MidPointLine()

{

// TODO: Add your command handler code here

CDC* pdc1 = GetDC();

int color = RGB(255,0,0);

int x1=30,y1=50,x2=200,y2=100;//斜率;

int x,y,a,b,d,d0,d1,d2;

a=y2-y1;

b=x2-x1;

d=2*a+b;

d1=2*a;

d2=2*(a+b);

x=x1,y=y1;

pdc1->SetPixel(x,(int)(y+0.5),color);

while(x < x2)

{

if(d>0)

{

x++;

y++;

d+=d2;

}

else

{

x++;

d+=d1;

}

pdc1->SetPixel(x,(int)(y+0.5),color);

}

ReleaseDC(pdc1);

}

四.程序截图:

Bresenham画线算法

一.算法名称:Bresenham画线算法

二.算法分析:

定义决策变量d = d+k (0=0.5) 当d>1时,

让以证0<=d<1d0=0定义决策变量d = d+k (0

的一点为( x,y), 则下一点为: (x+1,y) (d<0.5) 或(x+1,y+1)

(d>=0.5) 当d>1时, 让d=d-1,以保证0<=d<1

定义决策变量e = d-0.5 (0

则下一点为:(x+1,y) (e<0) 或(x+1,y+1)(e>=0) 当e >0时, 让

e=e-1, (重新初始化误差项)

由于算法只用到误差项的符号,为了改用整数以避免除法,可以作如下替换:

e = 2*e*dx

定义决策变量e = 2*e*dx, e0 = - dx;

e=e +2*dy

则下一点为: (x+1,y) (e <0) ;或(x+1,y+1)(e >=0) 当e >0时, 让

e= e - dx, (重新初始化误差项)

三.算法实现:

void CHuayahuaView::Breshnham()

{

// TODO: Add your command handler code here

CDC* pdc2 = GetDC();

int color = RGB(255,0,0);

int x1=50,y1=50,x2=200,y2=150;

int x,y,dx,dy,e;

dx=x2-x1;dy=y2-y1;e=-dx;

x=x1;

y=y1;

for(int i=0;i<=dx;i++)

{

pdc2->SetPixel(x,(int)(y+0.5),color);

x++;

e=e+2*dy;

if(e>=0)

{

y++;

e=e-2*dx;

}

}

ReleaseDC(pdc2);

}

四:程序运行截图:

常用的几种画线方法

常用的几种画线方法成功总结操盘程序 (一)结合均线的金叉点和死叉点画线 以金叉点或者死叉点为基准画水平线。 均线死叉点如果伴随较大的成交量,那么均线死叉点将成为重要压力位。今后股价第一次上升到此时会有阻力。此时应减仓观望。反之,均线金叉点如果伴随较大的成交量,那么均线金叉点将成为重要支撑位。今后股价第一次下跌到此时获得支撑的可能性较大,此时不宜再抛股票。股价向上突破均线死叉点,回落调整时,此均线死叉点位又转变成支撑位。可在死叉点和金叉点处画水平直线,以观察股价走势。 (二)黄金分割法 一般软件画线工具中都有黄金分割画线工具,使用很简单,这里我不再多说。 利用黄金分割画线的关键是找基准点,常用的是最高点和最低点。 (三)股价高点低点连线 (四)跳空缺口处水平线 (五)前期支撑位连线及压力位连线

A线是高点之间连线与地点之间连线的平行线。 B线是点1的水平线(支撑线),股价跌破B线后反弹到点2处受阻回落B线转变成压力线,在点3处突破(30分钟K线回调确认)又变成支撑线。 C线是下跳空缺口处的水平线。 D线是前期高点之间的连线。 E线(黄线)是点6的水平线(支撑线),股价跌破E线后反弹到点8处受阻回落B线转变成压力线。 F线是4,5,6的连线(支撑线),股价跌破F线后反弹到点8处受阻回落F线转变成压力线。 (六)关键K线的黄金点处水平线

2)头肩顶形态 头肩顶形态是有非常大杀伤力的头部形态之一。在实际操盘过程中宁可信其有不可信其无,股票卖了还能再买,套牢就只能做旁观者。研判头肩顶形态要和成交量结合起来。一般情况下,左肩量最大,头部量次之,右肩量最小。

中点画线法算法

中点画线法算法: void CMyView::OnMidpointline() { CDC *pDC=GetDC(); int x0=100,y0=100,x1=400,y1=300,c=RGB(0,0,0); //黑色直线float 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; pDC->SetPixel(x,y,c); while(xSetPixel(x,y,c); } ReleaseDC(pDC); } Bresenham算法: void CTestView ::OnBresenhamline() { CDC *pDC=GetDC(); int x1=100,y1=200,x2=600,y2=800,color=RGB(0,0,255); int i,x,y,dx,dy; float k,e;

dx=x2-x1; dy=y2-y1; k=dy/dx; e=-0.5; x=x1; y=y1; for(i=0;i<=dx;i++) { pDC->SetPixel(x,y,color); x++; e=e+k; if(e>=0) { y++; e=e-1;} } } 中点画圆: void CTestView::OnMindpointcircle() { CDC *pDC=GetDC(); int x=100,y=200,r=150,color=RGB(0,0,255); float d; x=0; y=r; d=1.25-r; pDC->SetPixel(x,y,color); while(x<=y) { if(d<0) d+=2*x+3; else {d+=2*(x-y)+5;y--;} x++; pDC->SetPixel(x,y,color); }

案例2-直线中点Bresenham算法

课程实验报告

步骤 为了规范颜色的处事,定义了CRGB类,重载了“+”,“-”、“*”、“\”、“+=”、“-=”、“*=”、“/=”运算符。成员函数Normalize()将颜色分量red,green,blue规范到[0,1]闭区间内。 RGB.h #pragma once class CRGB { public: CRGB(); CRGB(double, double, double); ~CRGB(); friend CRGB operator + (const CRGB&, const CRGB&); friend CRGB operator - (const CRGB&, const CRGB&); friend CRGB operator * (const CRGB&, const CRGB&); friend CRGB operator * (const CRGB&, double); friend CRGB operator * (double, const CRGB&); friend CRGB operator / (const CRGB&, double); friend CRGB operator += (const CRGB&, const CRGB&); friend CRGB operator -= (const CRGB&, const CRGB&); friend CRGB operator *= (const CRGB&, const CRGB&); friend CRGB operator /= (const CRGB&, double); void Normalize(); public: double red; double green; double blue; }; RGB.cpp #include"stdafx.h" #include"RGB.h" CRGB::CRGB() { red = 1.0; green = 1.0; blue = 1.0;

计算机图形学实验—中点算法画直线

计算机图形学实验报告 班级:软件1102 姓名:夏明轩 学号:201109020221

中点算法的线段光栅化 一、设计思想和算法流程 1.假定直线斜率0 P 2离直线更近更近->取P 2 。 M 在Q 的上方-> P 1离直线更近更近->取P 1 M 与Q 重合, P 1、P 2任取一点。 问题:如何判断M 与Q 点的关系? 由常识知:若y=kx+b; F(x,y)=y-kx-b;则有 ()()()?????<>=点在直线下方 0,点在直线上方0,点在直线上面0,y x F y x F y x F 假设直线方程为:ax +by +c=0 (y=(-a/b)x-c/b) 通过两点不能唯一确定a,b,c, 取 a=y 0-y 1, b=x 1-x 0, c=x 0y 1-x 1y 0 F(x,y)=ax +by +c=b(y-(-a/b)x-c/b); ()()()?????<>=点在直线下方0,点在直线上方0 ,点在直线上面0,y x F y x F y x F 则有 ∴欲判断M 点是在Q 点上方还是在Q 点下方,只需把M 代入F (x ,y ),并检查它的符号。构造判别式:d=F(M)=F(x p +1,y p +0.5)=a(x p +1)+b(y p +0.5)+c 当d<0,M 在直线(Q 点)下方,取右上方P 2; 当d>0,M 在直线(Q 点)上方,取右方P 1; 当d=0,选P 1或P 2均可,约定取P 1; 能否采用增量算法呢?若d ≥0 ---->M 在直线上方->取P1;此时再下一个象素的判别式为 d 1=F(x p +2, y p +0.5) =a(x p +2)+b(y p +0.5)+c = a(x p +1)+b(y p +0.5)+c +a =d+a ; 增量为a 若d<0 ------>M 在直线下方->取P2;此时再下一个象素的判别式为 d 2= F(x p +2, y p +1.5) =a(x p +2)+b(y p +1.5)+c = a(x p +1)+b(y p +0.5)+c +a +b =d+a+b ;

股市K线画线方法及用法

画线方法及用法 一、支撑线和压力线 画法: 将两个或两个以上的相对低点连成一条直线即得到支撑线 将两个或两个以上的相对高点连成一条直线即得到压力线 用法: 1.支撑线和压力线的作用 支撑线又称为抵抗线。当股价跌到某个价位附近时,股价停止下跌,甚至有可能还有回升。这个起着阻止股价继续下跌或暂时阻止股价继续下跌的价格就是支撑线所在的位置。 压力线又称为阻力线。当股价上涨到某价位附近时,股价会停止上涨,甚至回落。这个起着阻止或暂时阻止股价继续上升的价位就是压力线所在的位置。 支撑线和压力线的作用是阻止或暂时阻止股价向一个方向继续运动。同时,支撑线和压力线又有彻底阻止股价按原方向变动的可能。 2.支撑线与压力线相互转化 一条支撑线如果被跌破,那么这个支撑线将成为压力线;同理,一条压力线被突破,这个压力线将成为支撑线。这说明支撑线和压力线的地位不是一成不变的,而是可以改变的,条件是它被有效的足够强大的股价变动突破。 3.支撑线和压力线的确认和印正 一般来说,一条支撑线或压力线对当前影响的重要性有三个方面的考虑,一是股价在这个区域停留时间的长短;二是股价在这个区域伴随的成交量大小;三是这个支撑区域或压力区域发生的时间距离当前这个时期的远近。 二、趋势线 画法: 在上升趋势中,将两个低点连成一条直线,就得到上升趋势线。 在下降趋势中,将两个高点连成一条直线,就得到下降趋势线。 用法: 趋势线是衡量价格波动的方向的,由趋势线的方向可以明确地看出股价的趋势。要得到一条真正起作用的趋势线,要经多方面的验证才能最终确认。首先,必须确实有趋势存在。其次,画出直线后,还应得到第三个点的验证才能确认这条趋势线是有效的。 三、轨道线 画法: 轨道线又称通道线或管道线,是基于趋势线的一种方法。在已经得到了趋势线后,通过第一个峰和谷可以作出这条趋势线的平行线,这条平行线就是轨道线。 用法: 两条平行线组成一个轨道,这就是常说的上升和下降轨道。轨道的作用是限制股价的变动范围。对上面的或下面的直线的突破将意味着有一个大的变化。与突破趋势线不同,对轨道线的突破并不是趋势反向的开始,而是趋势加速的开始。轨道线的另一个作用是提出趋势转向的警报。 四、黄金分割线

实验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 CTestView 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_FILE static char THIS_FILE[] = __FILE__; #endif // CTestView IMPLEMENT_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 commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)

交易中的重要画线方法及用法

交易中的重要画线方法及用法 一、支撑线和压力线画法: 将两个或两个以上的相对低点连成一条直线即得到支撑线;将两个或两个以上的相对 高点连成一条直线即得到压力线。 1.支撑线和压力线的作用 支撑线又称为抵抗线。当银价跌到某个价位附近时,银价停止下跌,甚至有可能还有回升。这个起着阻止银价继续下跌或暂时阻止银价继续下跌的价格就是支撑线所在的位置。压力线又称为阻力线。当银价上涨到某价位附近时,银价会停止上涨,甚至回落。这个起着阻止或暂时阻止银价继续上升的价位就是压力线所在的位置。支撑线和压力线的作用是阻止或暂时阻止银价向一个方向继续运动。同时,支撑线和压力线又有彻底阻止银价按原方向变动的可能。 2.支撑线与压力线相互转化 一条支撑线如果被跌破,那么这个支撑线将成为压力线;同理,一条压力线被突破,这个压力线将成为支撑线。这说明支撑线和压力线的地位不是一成不变的,而是可以改变的,条件是它被有效的足够强大的银价变动突破。 3.支撑线和压力线的确认和印正 一般来说,一条支撑线或压力线对当前影响的重要性有三个方面的考虑: 一是银价在这个区域停留时间的长短; 二是银价在这个区域伴随的成交量大小; 三是这个支撑区域或压力区域发生的时间距离当前这个时期的远近。 二、趋势线画法: 在上升趋势中,将两个低点连成一条直线,就得到上升趋势线。在下降趋势中,将两个高点连成一条直线,就得到下降趋势线。 用法: 趋势线是衡量价格波动方向的,由趋势线的方向可以明确地看出银价的趋势。要得到一条真正起作用的趋势线,要经多方面的验证才能最终确认。首先,必须确实有趋势存在。其次,画出直线后,还应得到第三个点的验证才能确认这条趋势线是有效的。 三、轨道线画法: 轨道线又称通道线或管道线,是基于趋势线的一种方法。在已经得到了趋势线后,通过第一个峰和谷可以作出这条趋势线的平行线,这条平行线就是轨道线。 用法: 两条平行线组成一个轨道,这就是常说的上升和下降轨道。轨道的作用是限制银价的变动范围。对上面的或下面的直线的突破将意味着有一个大的变化。与突破趋势线不同,对轨道线的突破并不是趋势反向的开始,而是趋势加速的开始。轨道线的另一个作用是提出趋势转向的警报。

计算机图形学-设计算法绘制直线与圆

信息与计算科学专业基础课 Computer Report Of course 计算机图形学课程实验 报告 实验题目设计算法绘制直线与圆 班级 姓名 学号 指导教师 日期

实验说明 试验目的: 掌握直线和圆的基本生成算法思想,并上机编程实现相应的算法。 试验地点: 教九楼401 数学系机房 实验要求(Direction): 1. 每个学生单独完成;2.开发语言为TurboC 或C++,也可使用其它语言;3.请在自己的实验报告上写明姓名、学号、班级;4.每次交的实验报告内容包括:题目、试验目的和意义、程序制作步骤、主程序、运行结果图以及参考文件;5. 自己保留一份可执行程序,考试前统一检查和上交。 实验内容 实验题一 实验题目 1).用DDA 法在屏幕上画一条具有三个像素宽的直线段L1。要求:(1)直线段L1的两个端点坐标和画线颜色都要求可以随机输入;(2)要求输出直线段L1上的各点坐标;(3)画出直线的同时要求标明两端点坐标。 2).将课堂所讲的斜率01、-1

Bresenham算法

Course Page
Page 1 of 6
课程首页 > 第二章 二维图形的生成 > 2.1 直线的生成 > 2.1.2 生成直线的Bresenham算法
全部隐藏
2.1.2 生成直线的Bresenham算法
从上面介绍的DDA算法可以看到,由于在循环中涉及实型数据的加减运算,因此直线的生成速度较慢。 在生成直线的算法中,Bresenham算法是最有效的算法之一。Bresenham算法是一种基于误差判别式来生成直线的方法。 一、直线Bresenham算法描述: 它也是采用递推步进的办法,令每次最大变化方向的坐标步进一个象素,同时另一个方向的坐标依据误差判别式的符号来决定是否也要步进一 个象素。 我们首先讨论m=△ y/△x,当0≤m≤1且x1有两种Bresenham算法思想,它们各自从不同角度介绍了Bresenham算法思想,得出的误差判别式都是一样的。 二、直线Bresenham算法思想之一: 由于显示直线的象素点只能取整数值坐标,可以假设直线上第i个象素点坐标为(xi,yi),它是直线上点(xi,yi)的最佳近似,并且xi=xi(假设 m<1),如下图所示。那么,直线上下一个象素点的可能位置是(xi+1,yi)或(xi+1,yi+1)。
由图中可以知道,在x=xi+1处,直线上点的y值是y=m(xi+1)+b,该点离象素点(xi+1,yi)和象素点(xi+1,yi+1)的距离分别是d1和d2:
d1=y-yi=m(xi+1)+b-yi d2=(yi+1)-y=(yi+1)-m(xi+1)-b 这两个距离差是 d1-d2=2m(xi+1)-2yi+2b-1
(2-8) (2-9)
(2-10)
我们来分析公式(2-10): (1)当此值为正时,d1>d2,说明直线上理论点离(xi+1,yi+1)象素较近,下一个象素点应取(xi+1,yi+1)。 (2)当此值为负时,d1mhtml:file://C:\Documents and Settings\Administrator\桌面\Course Page.mht
2011-7-12

分析画线的方法

分析画线的方法 尽信书不如无书, 技术分析不能全信,但也应该懂个大概,与其浪费精力在网上消磨时间,还不如静下心来学点东西。,如果我们过分地相信消息之类的东西就彻底被别人牵着鼻子走路,而缺乏独立的思考,最终会更悲惨. 技术分析只是一个工具,基本的了解是有必要的. 以下这张图显示了大盘一直在两条线之间作三角形整理,目前已经接近末端,即将产生突破。下周将迎来突破后的暴涨或暴跌. 原则:靠近压力线的时候卖出,靠近支撑线的时候买进,直到突破之后再反向操作下面这张图是60分钟K线,连接2285和2306点的直线,今天下午2362点展开反弹从而确定了这条支撑线的有效性,在跌破这条线之后可以清仓。阻力线是连接7月28日的2924和8月7日2742点以及8月20日2523点,在这条线上的高点也有近10个,所以应该是很强的,所以下周在2450点附近要特别注意这条线(记住是60分钟K线哟)如果今天像1999年12月15日或者1995年2月22日以及1997年8月14日那样来个大阴线的话,短线趁反抽5日均线离场,几天后在更低一点的位置又买回来 8月22日添加我上午反抽5日均线的时候减仓至半仓是因为我目前的仓位太重而当时的风险较大; 下午准备在支撑线(连接2285和2306的直线)破了之后清仓的,但是在2362点的时候反弹了,就没卖. 我在博文里的第二张图片是60分钟K线.我希望通过这个例子教一些新手学会画支撑线 仓位重的,现在减也是有道理的.下周虽然有暴涨,但现在的形势和方向

并不明确 财神节是农历的7月22 中国古代以商朝比干为文财神,以三国关云长为武财神。每年正月初五专祭财神。祭祀时,红烛高烧,鞭炮齐鸣,用面做成元宝、圣虫,或用钱做成钱龙,吃水饺谓之“元宝”,意谓招财进宝。临清每年七月二十一日至二十三日为财神会,唱戏三天。 财神庙有对联云:“颇有几分钱,你也求,他也求,给谁是好?点上三柱香,朝也拜,夕也拜,叫我为难。” 财神节,中国汉族、土族等地民间祭祀财神的节日,一般是农历七月廿二日,传说此日是财帛星君生日,也是中国传统节日之一。 财神节到了,想想没什么送给你的,又不打算给你太多,只有给你五千万:千万要快乐!千万要健康!千万要平安!千万要知足!千万不要忘记我! 8月22日22:47 添加 今天在下降三角型的中线附近,上下皆有变数,下周一就能选择方向。如果向下跌破2284和2306以及2362点连接而成的支撑线,那么再用3天左右到达2245点附近遇到强支撑线(连接2990-2566-2284)展开强劲反弹;如果下周一上涨的话,在2566点遇到阻力线(就是我以前经常提到的那根连接12个高点的压力线)然后继续探底,那样下来的话点位就会低于2245点。 任何时候只要能突破并站稳那根连接12个高点的阻力线就确定大B浪

DDA算法 中点画线算法 Bresenham算法

实验1直接绘制实验 (提示:#表示Project的编号,##表示Project题目) 学号姓名上交时间 1.问题描述 如何利用OpenGL实现直线光栅化的DDA算法、中点画线算法和Bresenham算法2.算法描述 DDA算法:据直线公式y = kx + b来推导出来的,其关键之处在于如何设定单位步进,即一个方向的步进为单位步进,另一个方向的步进必然是小于1。 中点划线法:在画直线段的过程中,当前像素点为(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为下一个像素点。 Bresenham算法:过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线各垂直网格线的交点,然后确定该列像素中与此交点最近 的像素。 实验结果 成功运行三个算法,并且能转换出通用Bresenham算法。 3.分析与评论 (分析每个算法的运行时间,对你的本实验的工作进行评论,同时也可以对老师提出建议。) 附录: Source Code(in C)

#include //需要正确安装GLUT,安装方法如预备知识中所述void myDisplay(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glColor3f (1.0f, 1.0f, 1.0f); glRectf(-0.5f, -0.5f, 0.5f, 0.5f); glBegin (GL_TRIANGLES); glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (0.0f, 1.0f); glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.8f, -0.5f); glColor3f (0.0f, 0.0f, 1.0f); glVertex2f (-0.8f, -0.5f); glEnd (); glColor3f(1,0,0); glBegin(GL_LINE_LOOP); glVertex2f (0.0f, 0.5f); glVertex2f (0.4f, -0.25f); glVertex2f (-0.4f, -0.25f); glEnd (); glPointSize(3); glBegin (GL_POINTS); glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (-0.4f, -0.4f); glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.0f, 0.0f); glColor3f (0.0f, 0.0f, 1.0f); glVertex2f (0.4f, 0.4f); glEnd (); glFlush(); } int main(intargc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

400米实用标准田径场地新颖画线方法(二)之第四曲直段(起点)

400米标准田径场的最新画线方法(二) ——第四曲直段(起点) 今年检查了很多田径场,但能按国际田联《田径场地设施标准手册2008》中文版图2.2.1.6a(国际田联400米标准跑道画线图)画线,画对了的很少。这就给我们搞设计、建造和检查验收的人员提出了新的挑战。为了能更好的画对和画好线,我想尽我微薄之力,写一组最新画线的文章,以与想把线画对、画好的们共享。国际田联在1995年出版了《田径场地设施标准手册1995》。1997年11月由中国田径协会主持翻译出版,作为部发行。国际田联在1999年出版了《田径场地设施标准手册1999》。2002年3月由中国田径协会主持翻译,人民体育正式出版,公开发行。这也是在我国使用最为广泛的版本。国际田联在2003年出版了《田径场地设施标准手册2003》。2006年1月由国际田联地区发展中心·主持翻译,体育大学正式出版,公开发行。由于发行量少,价格偏高,普及率不高。但是,《田径场地设施标准手册2003》版对画线的改动特别大。如果,没有购买此书,或没有获得此版的画线图,是不可能把线画对的。这也是很多场地画线不对的重要原因。国际田联在2008年出版了《田径场地设施标准手册2008》(见图一)。2009年12月由中国田径协会主持翻译,人民体育正式出版,公开发行。这也是我们目前应使用的最新版本。另2010年9月,国际田联《田径竞赛规则2010-2011》(见图二)中文版也由中国田径协会主持翻译,人民体育正式出版,公开发行。本系列文章以这两本书为依据,将《田径场地设施标准手册2008》和《田径竞赛规则2010-2011》对画线的变动(包括《田径场地设施标准手册2003》对于前3版的变动),仅供参考。以引起们的关注。

计算机图形学 实验 数值微分(DDA)法、中点画线法、Bresenham算法

XXXXXXXX 大学(计算机图形学)实验报告 实验名称 数值微分(DDA )法、中点画线法、Bresenham 算法 实验时间 年 月 日 专 业 姓 名 学 号 预 习 操 作 座 位 号 教师签名 总 评 一、实验目的: 1.了解数值微分(DDA )法、中点画线法、Bresenham 算法的基本思想; 2.掌握数值微分(DDA )法、中点画线法、Bresenham 算法的基本步骤; 二、实验原理: 1.数值微分(DDA)法 已知过端点 的直线段L :y=kx+b,直线斜率为 从x 的左端点 开始,向x 右端点步进。步长=1(个象素),计算相应的y 坐标y=kx+b ;取象素点(x, round(y))作为当前点的坐标。 2.中点画线法 当前象素点为(x p , y p ) 。下一个象素点为P 1 或P 2 。 设M=(x p +1, y p +0.5),为p 1与p 2之中点,Q 为理想直线与x=x p +1垂线的交点。将Q 与 M 的y 坐标进行比较。 当M 在Q 的下方,则P 2 应为下一个象素点; 当M 在Q 的上方,应取P 1为下一点。 构造判别式:d=F(M)=F(x p +1,y p +0.5)=a(x p +1)+b(y p +0.5)+c ,其中a=y 0-y 1, b=x 1-x 0, c=x 0y 1-x 1y 0。 当d<0,M 在L(Q 点)下方,取右上方P 2为下一个象素; 当d>0,M 在L(Q 点)上方,取右方P 1为下一个象素; 当d=0,选P 1或P 2均可,约定取P 1为下一个象素; 但这样做,每一个象素的计算量是4个加法,两个乘法。 d 是x p , y p 的线性函数,因此可采用增量计算,提高运算效率。 若当前象素处于d ≥0情况,则取正右方象素P 1 (x p +1, y p), 要判下一个象素位置,应计算 d 1=F(x p +2, y p +0.5)=a(x p +2)+b(y p +0.5)=d+a ; 增量为a 。 若d<0时,则取右上方象素P 2 (x p +1, y p +1)。要判断再下一象素,则要计算 d 2= F(x p +2, y p +1.5)=a(x p +2)+b(y p +1.5)+c=d+a+b ;增量为a +b 。 3.Bresenham 算法 过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂 ),(),,(111000y x P y x P 0101x x y y k --=0x

办公区定置的八大画线方法

本画线方法适用于公司车间办公区域及场地

一、室外通行线标示 目的:1.为了保护行人,区分人与车辆的通行; 画法:通道宽度大于1.5m,在通道线中间划中心线,线宽150mm。油漆线宽:150mm; 颜色:道路中心线—白色或黄色;两旁划线—黄线; 两旁划线:距离边缘400mm的位置按直线划线,划线随边缘体一起凹凸,距离始终为400mm; · 400mm 150mm 室 外 通 道 边 缘 室 外 通 道 边 缘 用胶带进行固定油漆边线油漆干后,把胶带揭开。

二、室内通行线标示 1. 目的:为了保护墙面与设备,区分人与车辆的通行;在已设置的设备旁划线;在通道旁划线。 线宽:50mm ; 材料:油漆或地胶带; 颜色:黄色; 1、距离设备50mm 的位置按直线划线; 2、距离墙面120mm 的位置按直线划线,墙面若有凸出的墙柱,线也相应地离墙柱120mm 处划线; 3、 若通道宽度大于1.5m ,应在通道中间划中心线,线宽50mm 。 50mm

三、开门区域的定置 1、目的:通过标示门开时的旋转轨迹以保证门开闭顺畅。 2、对象:办公室、生产现场内的各办公室、仓库、各控制室等的门。 3、画法:油漆线或胶带幅宽:50mm或25mm;打开门的标示线只限于900; 4、线颜色:黄色 5、门的开关轨迹用虚线标示。 事例: 50mm

四、楼梯的标示方法 1、目的:使右侧通行习惯化,维持秩序并预防安全事故。 2、对象:楼梯、走廊、仓库、生产现场通道 3、画法: (1)在楼梯及走廊标示中央线(绿色50mm胶带、油漆) (2)标示中央线走廊的宽度超过1.8m时,楼梯的宽度超过1.5m时;(3)交叉路用虚线标示; (4)交叉路上附着方向引导标示板; (5)步行箭头:颜色:黄色;规格;长200mm×宽100mm。 事例:

bresenham画线算法详解

给定两个点起点P1(x1, y1), P2(x2, y2),如何画它们直连的直线呢,即是如何得到上图所示的蓝色的点。假设直线的斜率00,直线在第一象限,Bresenham算法的过程如下: 1.画起点(x1, y1). 2.准备画下一个点,X坐标加1,判断如果达到终点,则完成。否则找下一个点,由图可知要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点。 2.1.如果线段ax+by+c=0与x=x1+1的交点y坐标大于(y+*y+1))/2则选右上那个点 2.2.否则选右下那个点。 3.画点 4.跳回第2步 5.结束 具体的算法如下,原理就是比较目标直线与x+1直线交点的纵坐标,哪个离交点近就去哪个void Bresenhamline(int x0, int y0, int x1, int y1, int color) { int x, y, dx, dy; float k, e; dx = x1 - x0; dy = y1 - y0; k = dy / dx; e = -0.5; x = x0; y = y0; for (x= x0;x < x1; x++) { drawpixel(x, y, color);//这个是画点子函数

e = e + k; if (e > 0) { y++; e = e - 1; } } } 上述Bresenham算法在计算直线斜率与误差项时用到小数与除法。可以改用整数以避免除法。等式两边同时乘以2*dx,得到2*e*dx = 2*e*dx + 2dy, 2*e*dx = 2*e*dx - 2*dx.由于算法中只用到误差项的符号,因此可作如下替换:2*e*dx.改进的Bresenham画线算法程序:将e统一乘以2*dx即变成了整数的Bresenhan算法了,^_^ void InterBresenhamline (int x0, int y0, int x1, int y1, int color) { int dx = x1 - x0; int dy = y1 - y0; int dx2 = dx << 1;//乘2 int dy2 = dy<< 1;//乘2 int e = -dx; int x = x0; int y = y0; for (x = x0; x < x1; x++) { drawpixel (x, y, color); e=e + dy2; if (e > 0) { y++; e = e - dx2; } } }

常用的几种画线方法和收盘30分钟

常用的几种画线方法和收盘30分钟,第二天上涨股的要点[图片] 2011-06-19 10:22:28| 分类:默认分类|举报|字号订阅 作者:股票匆匆| 来自:股票匆匆 一、常用的几种画线方法 (一)结合均线的金叉点和死叉点画线 以金叉点或者死叉点为基准画水平线。 均线死叉点如果伴随较大的成交量,那么均线死叉点将成为重要压力位。今后股价第一次上升到此时会有阻力。此时应减仓观望。反之,均线金叉点如果伴随较大的成交量,那么均线金叉点将成为重要支撑位。今后股价第一次下跌到此时获得支撑的可能性较大,此时不宜再抛股票。股价向上突破均线死叉点,回落调整时,此均线死叉点位又转变成支撑位。可在死叉点和金叉点处画水平直线,以观察股价走势 (二)黄金分割法

一般软件画线工具中都有黄金分割画线工具,使用很简单,这里我不再多说。利用黄金分割画线的关键是找基准点,常用的是最高点和最低点。 (三)股价高点低点连线 (四)跳空缺口处水平线 (五)前期支撑位连线及压力位连线

A线是高点之间连线与地点之间连线的平行线。 B线是点1的水平线(支撑线),股价跌破B线后反弹到点2处受阻回落B线转变成压力线,在点3处突破(30分钟K线回调确认)又变成支撑线。 C线是下跳空缺口处的水平线。 D线是前期高点之间的连线。 E线(黄线)是点6的水平线(支撑线),股价跌破E线后反弹到点8处受阻回落B线转变成压力线。 F线是4,5,6的连线(支撑线),股价跌破F线后反弹到点8处受阻回落F 线转变成压力线。 (六)关键K线的黄金点处水平线

(2)头肩顶形态

头肩顶形态是有非常大杀伤力的头部形态之一。在实际操盘过程中宁可信其有不可信其无,股票卖了还能再买,套牢就只能做旁观者。研判头肩顶形态要和成交量结合起来。一般情况下,左肩量最大,头部量次之,右肩量最小。

计算机图形学划线实验报告

《计算机图形学》实验报告 实验一直线、圆(弧)生成算法 一、实验目的及要求 1. 了解光栅图形显示器的工作原理和特点; 2. 学习C/VC环境下的基本绘图方法; 3. 实践与巩固直线的基本生成算法。 4. 掌握直线扫描转换算法的原理及实现; 5. 学习圆(弧)的基本生成算法; 6. 实践圆(弧)的基本生成算法; 7. 掌握圆弧扫描转换算法的原理及实现; 二、理论基础 1、有关直线生成算法有 DDA(数值微分)、中点画线线算法、Bresenham生成算法数值微分法先算出直线的斜率,然后从起点开始,确定最佳逼近于直线的y坐标。假设起点的坐标为整数。让x递增1,y相应递增k。 中点划线算法中若直线在x方向增加一个单位,y的增量只能在0、1之间。假设当前像素点已经确定,下一像素点就只可能有两种情况,

将这两点的中点带入直线方程中,通过中点在直线的上、下方来判断下一点的坐标。 Bresenham算法是通过各行、各列像素中心构造一组虚拟网络格线,按直线从起点到中点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。 2、有关画圆的算法 圆的扫描转换(中点画圆法)、Bresenham画圆算法圆的扫描转换算法同中点画线类似,将圆分为8份,先讨论圆的第一象限上半部分,从(0,R)点顺时针确定最佳逼近于该圆弧的像素序列。之后通过对称画出全部圆。 Bresenham画圆算法考虑圆在第一象限上的点,每确定一像素,则下一像素有三种可能,通过判断右下方的像素与圆的位置关系再分为三种情况,之后通过这三个点与圆的距离远近确定最佳逼近像素。 三、算法设计与分析 1、数值微分法 int x0=0,y0=0,x1=800,y1=400; //数值微分法,|k|<=1 float dx,dy,k,x,y; dx=x1-x0; dy=y1-y0; k=dy/dx;

实验1:Bresenham算法

实验1:Bresenham算法 实验题目: Bresenham直线扫描算法的实现 实验内容及要求: 实现绘制各种情况直线的Bresenham算法,并将实现的算法应用于任意多边形的绘制,要求多边形的顶点由键盘输入或鼠标拾取,绘制的多边形顶点要准确,图形应该封闭。要求掌握Bresenham算法的基本原理和算法设计,画出算法实现的程序流程图,使用C或者VC++实现算法,并演示。 实验原理: 1、Bresenham基本算法: 过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列象素中与此交点最近的象素。 设直线方程为: 其中k=dy/dx。因为直线的起始点在象素中心,所以误差项d的初值d0=0。 X下标每增加1,d的值相应递增直线的斜率值k,即d=d+k。一旦d≥1, 就把它减去1,这样保证d在0、1之间。 当d≥0.5时,最接近于当前象素的右上方象素() 当d<0.5时,更接近于右方象素()。 为方便计算,令e=d-0.5,e的初值为-0.5,增量为k。 当e≥0时,取当前象素(x i,y i)的右上方象素(); 而当e<0时,更接近于右方象素()。 可以改用整数以避免除法。 d d d d k y x x k y y i i i i i + = - + = + + ) ( 1 1 1 1 , + +i i y x i i y x, 1+ 1 1 , + +i i y x i i y x, 1+

Bresenham算法代码如下: void Bresenhamline(int x1, int y1, int x2, int y2,CDC *pDC) { //对于所有直线均按照从左至右的方向绘制 int x,y,d,dx,dy,right,rightleft; if(x1>x2){ int tempx,tempy; tempx=x1;x1=x2;x2=tempx; tempy=y1;y1=y2;y2=tempy; } //根据斜率的情况不同而绘制 if(y1==y2){//斜率为0的情况 for(x=x1;x<=x2;x++) pDC->SetPixel(x,y1,2); } else if(x1==x2){//直线为垂直的情况 if(y1>y2){ //使直线按从下往上画 int tempy=y1; y1=y2;y2=tempy; } for(y=y1;y<=y2;y++) pDC->SetPixel(x1,y,2); } else{ dy=y2-y1; dx=x2-x1; if(abs(dy)==abs(dx)){////斜率为1或-1时 x=x1;y=y1; if(dy<0){//斜率为1 for(;y>=y2;y--){ x++; pDC->SetPixel(x,y,2); } }//斜率为1 else{//斜率为-1 for(;y<=y2;y++){ x++; pDC->SetPixel(x,y,2); } }//斜率为-1 } else if(abs(dy)0&&dx>0){//斜率为正时 right=-2*dy; rightleft=2*dx-2*dy; d=dx-2*dy; x=x1;y=y1; while(x<=x2){ pDC->SetPixel(x,y,2); x++; if(d<0){ y++; d=d+rightleft; }else{ d=d+right; } } }//斜率为正时 else {//斜率为负时 right=2*dy; rightleft=2*dy-2*dx; d=2*dy-dx; x=x1;y=y1; while(x<=x2){ pDC->SetPixel(x,y,2); x++; if(d<0){ y++;

相关主题
文本预览
相关文档 最新文档