基于Bp神经网络的股票预测_第1页
基于Bp神经网络的股票预测_第2页
基于Bp神经网络的股票预测_第3页
基于Bp神经网络的股票预测_第4页
基于Bp神经网络的股票预测_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于神经网络的股票预测【摘要】: 股票分析和预测是一个复杂的研究领域,本论文将股票技术分析理论与人工神经网络相结合,针对股票市场这一非线性系统,运用BP神经网络,研究基于历史数据分析的股票预测模型,同时,对单只股票短期收盘价格的预测进行深入的理论分析和实证研究。本文探讨了BP神经网络的模型与结构、BP算法的学习规则、权值和阈值等,构建了基于BP神经网络的股票短期预测模型,研究了神经网络的模式、泛化能力等问题。并且,利用搭建起的BP神经网络预测模型,采用多输入单输出、单隐含层的系统,用前五天的价格来预测第六天的价格。对于网络的训练,选用学习率可变的动量BP算法,同时,对网络结构进行了隐含层节点的

2、优化,多次尝试,确定最为合理、可行的隐含层节点数,从而有效地解决了神经网络隐含层节点的选取问题。【abstract Stock analysis and forecasting is a complex field of study. The paper will make research on stock prediction model based on the analysis of historical data, using BP neural network and technical analysis theory. At the same time, making in-de

3、pth theoretical analysis and empirical studies on the short-term closing price forecasts of single stock. Secondly, making research on the model and structure of BP neural network, learning rules, weights of BP algorithm and so on, building a stock short-term forecasting model based on the BP neural

4、 network, related with the model of neural network and the ability of generalization. Moreover, using system of multiple-input single-output and single hidden layer, to forecast the sixth day price by BP neural network forecasting model structured. The network of training is chosen BP algorithm of t

5、raingdx, while making optimization on the node numbers of the hidden layer by several attempts. Thereby resolve effectively the problem of it.【关键词】BP神经网络 股票预测分析1引言股票市场是一个不稳定的非线性动态变化的复杂系统,股价的变动受众多因素的影响。影响股价的因素可简单地分为两类,一类是公司基本面的因素,另一类是股票技术面的因素,虽然股票的价值是公司未来现金流的折现,由公司的基本面所决定,但是由于公司基本面的数据更新时间慢,且很多时候并不能客观

6、反映公司的实际状况,采用适当数学模型就能在一定程度上实现对股价的预测。BP神经网络是一种模拟人脑神经网络结构从而具有一定的预测功能的数学模型,由于其具有很强的自学习能力自适应能力以及容错能力等优点,使它成为一种比较适合股票预测的方法。本文就采用此方法对股价趋势进行了分析。MATLAB所搭配的NeuralcNetwork Toolbox,将神经网络领域研究的成果完整地覆盖,它以人工神经网络理论为基础,用MATLAB语言构造出典型神经网络的激活函数。另外,根据各种典型的修正网络权值的规则,加上网络的训练过程,用MATLAB编写出网络设计与训练的子程序,网络的设计者则可以根据需要去调用工具箱中有关神

7、经网络的设计训练程序,使自己能够从繁琐的编程中解脱出来,集中精力去思考问题和解决问题,从而提高解题效率。BP神经网络算法、特点2.1 BP神经网络算法 BP网络的产生归功于BP算法的获得。BP算法属于算法,是一种有监督式的学习算法。其主要思想为:对于q个输入学习样本P1,P2Pq,已知与其对应的输出样本为:T1,T2Tq。学习的目的是用网络的实际输出A1,A2Aq与目标矢量T1,T2Tq之间的误差来修改其权值,使Ai (i=1,2q )与期望的T尽可能地接近,即使网络输出层的误差平方和达到最小。它是通过连续不断地在相对于误差函数斜率下降的方向上,计算网络权值和偏差的变化而逐渐逼近目标的。每一次

8、权值和偏差的变化都与网络误差的影响成正比,并以反向传播的方式传递到每一层的。BP算法由两部分组成,分别为信息的正向传递与误差的反向传播。在正向传播过程中,输入信息从输入经隐含层逐层计算传向输出层,每一层神经元的状态只影响下一层神经元的状态,如果在输出层没有得到期望的输出,则计算输出层的误差变化值,然后转向反向传播;通过网络将误差信号沿原来的连接通路反传回来,修改各层神经元的权值,直至达到期望目标,误差信号趋向最小。其具体的实现步骤如图所示。2.2 BP神经网络在预测中的适用性基于神经网络本身的特点与优越性,本文选择BP神经网络用于股票预测应用研究。第一,具有自学习功能。自学习功能对于模型预测有

9、特别重要的意义。未来的人工神经网络计算机将提供经济预测、市场预测、信用预测,其应用前途是很远大的。第二,容错能力强。网络中少量单元的局部缺损不会造成网络的瘫痪,也不会影响全局,它反映了神经网络的鲁棒性。神经网络带有高度并行处理信息的机制且具有高速的自学习、自适应能力,内部所包含的大量可调参数使得系统的灵活性更强。因此,神经网络很好的鲁棒性可以提高股票预测模型的适应性与通用性。第三,具有高速寻找优化解的能力。寻找一个复杂问题的优化解,往往需要很大的计算量,一个针对某问题而设计的神经网络,可以发挥计算机的高速运算能力,能很快找到优化解。这对提高模型的运算效率很有帮助。第四,可以充分逼近任意复杂的非

10、线性关系。股票分析中的各个指标之间的关系并不十分明确,大多为非线性的。而神经网络能够逼近任意复杂的非线性关系,这就决定了神经网络的预测精度比其他的预测方法要高。而对股票预测来讲,预测精度无疑是非常重要的问题。第五,具有在新环境下的泛化能力,能不断接受新样本、新经验并不断调整模型,自适应能力强,具有动态特性。由于股票分析具有分行业、分阶段的特点,其评估结果的不确定性非常大。这就意味着需要针对不同的股票设立相应的预测模型,神经网络的这一特性正好满足这样的需求。然而BP神经网络也不是没有缺点。一是其工作的随机性较强,即使是同样的训练样本,相同的网络参数,多次运行生成的神经网络模型预测结果也有差别。因

11、此要得到一个较好的神经网络结构,需要人为地去调试,非常耗费人力与时间,因此应用受到了限制。二是BP算法本身存在一定的缺陷。2.3 BP神经网络模型构建的方法建立BP神经网络模型的具体步骤:首先要分析问题的性质及核心,然后有针对性地建立网络模型,最后通过网络预测分析,调整参数,优化网络模型。具体过程如图所示:股票预测BP网络模型的建立3.1 数据的采集和预处理本文选择了中国银行(601988)2013/11/1-2014/5/15的收盘价和中国汽研(601965)2013/4/1-2014/5/12的收盘价作数据采集。根据模型建立的需要,BP神经网络要求样本集合理区间为0,1或-1,1,所以要对

12、样本集进行归一化处理。归一化公式为: Matlab中归一化处理数据可以采用premnmx , postmnmx , tramnmx 这3个函数。本文用了premnmx归一化函数和postmnmx反归一化函数。premnmx语法:pn,minp,maxp,tn,mint,maxt = premnmx(p,t)参数:pn: p矩阵按行归一化后的矩阵minp,maxp:p矩阵每一行的最小值,最大值tn:t矩阵按行归一化后的矩阵mint,maxt:t矩阵每一行的最小值,最大值作用:将矩阵p,t归一化到-1,1 ,主要用于归一化处理训练数据集。postmnmx语法: p,t = postmnmx(pn,

13、minp,maxp,tn,mint,maxt)参数:minp,maxp:premnmx函数计算的p矩阵每行的最小、最大值mint,maxt:premnmx函数计算的t矩阵每行的最小值,最大值作用:将矩阵pn,tn映射回归一化处理前的范围。postmnmx函数主要用于将神经网络的输出结果映射回归一化前的数据范围。3.2 训练网络的设计在有合理的结构和恰当的权值条件下,三层前馈网络可以逼近任意的连续函数,这样,就提供了一个设计BP神经网络的基本原则。较少的隐含层,可以实现样本空间的超平面划分,选择两层BP网络就可以实现有效的预测了。本文将采用单隐含层的网络设计,分为单隐含层和输出层两个网络层次,如

14、图所示。本文将连续五天的价格作为一组输入,将第六天的价格作为输出目标。既用前五天的价格来预测第六天的价格。所以输入层神经元数目是5。输出层的节点数取决于两个方面:输出数据类型和表示该类型所需的数据大小;同时,根据经典的道氏理论,股票价量分析中最重要的指标就是收盘价。本文所建的股票预测模型,就是针对单只股票的走势进行预测,所以,将股票的收盘价作为该预测模型的唯一输出向量,这样,网络输出层的神经元数目即为1。 BP网络隐含层节点数的多少和BP网络预测精度之间有很大相关性,节点数太少,神经网络的训练能力就会变弱,无法完成精确预测。节点数太多,神经网络训练时间变长且网络可能出现过度拟合现象。所以选择合

15、适的节点数才能使BP网络的性能得到最大发挥,但目前还没有统一的标准来确定隐含层的节点数,所以本文经过多次试验多次比较最终确定了隐含层节点数为12。 传递函数是BP网络的重要组成部分,必须是连续可微的;BP网络通常采用S型的对数或正切函数。本预测模型采集到的原始数据,经过归一化处理后输入、输出向量均在区间-1,1范围内,符合S型的对数或正切函数的取值区间。因此,隐含层传递函数选择tansig,输出层传递函数选择purelin,训练函数采用traingdm。训练参数设为:net_1.trainParam.show = 50; 限时训练迭代过程net_1.trainParam.lr = 0.05;

16、学习率net_1.trainParam.mc = 0.9; 附加动量因子net_1.trainParam.epochs = 20000; 最大训练次数net_1.trainParam.goal = 1e-3; 训练要求精度训练过程如图:关于性能函数的设计,本文采用典型的前项反馈网络误差性能函数为均方误差函数mse:股票预测分析4.1中国银行预测分析在MATLABr2014a 中用函数xlsread 导入已经下载好的中国银行(601988)2013/11/1-2014/5/15的收盘价作为输入样本,进行BP网络训练。网络结构:BP神经网络的仿真结果:图中红色线为预测曲线,蓝色线为实际曲线,可以看

17、出模拟出的曲线大致上与实际曲线相同,但有些地方明显误差偏大,很可能是由于训练样本的数目过少和训练次数不够而导致。此图为实际值与预测值的误差曲线,可以明显看出误差确实比较大,所以此图预测结果不尽人意。误差训练情况:梯度:回归曲线:股票分析:方法一:移动平均线与BP曲线相结合 从上图可以看出,五日平均线从上而下穿过下降趋势的十日线,二十日线和六十日线,表明标号1这个点在这个时候支撑线被向下突破,此时为死亡交叉点,表示股价短期将继续下落,十日线向下突破二十日线,说明中期内也将继续下跌,二十日线也向下突破六十日线,长期内也将下降,行情看跌,死亡交叉预示着空头市场来临,而实际曲线也验证了预测结果。 标号

18、二为上升中的五日线由下而上穿过上升的十日线,形成黄金交叉,这个时候压力线被向上突破,表示股价短期内将继续上涨,行情看好,而实际曲线也验证了预测,同时十日线向上突破上升趋势的二十日线,说明中期内该股将会呈上升趋势。 标号三为下降趋势的五日线向下跌破十日线,说明短期内该股会下降,而旁边下降趋势十日线也向下跌破了二十日线,说明中期内该股呈下降趋势。 标号四为上升趋势的五日线向上突破十日线,表明短期内该股会上升,上升趋势的十日线也向上突破二十日线,说明该股中期内也将呈上升趋势,向上趋势的二十日线也向上突破六十日线,形成黄金交叉,表明长期内该股呈上升趋势,结合BP曲线对下一日的预测,可以提高投资决策的准

19、确性。 标号五为下降趋势的五日线突破了十日线,表明短期内该股会有下降趋势。 标号六为上升趋势的五日线向上突破十日线,说明短期内该股将呈上升趋势。方法二:指数平滑异同平均线(MACD)分析法:MACD称为指数平滑异同平均线,是从双移动平均线发展而来的,由快的移动平均线减去慢的移动平均线,MACD的意义和双移动平均线基本相同,但阅读起来更方便。当MACD从负数转向正数,是买的信号。当MACD从正数转向负数,是卖的信号。当MACD以大角度变化,表示快的移动平均线和慢的移动平均线的差距非常迅速的拉开,代表了一个市场大趋势的转变。MACD线从正数转向负数时,股票即将有下降趋势,是卖出的信号,从负数转向正

20、数的时候,股票有即将有上升的趋势,是买入的信号。综合所述,本次股票预测还算是成功,预测结果往往令人满意。MATLAB程序:clc;clear;close all;P=xlsread(中国银行2);T=xlsread(中国银行T2);Hn=xlsread(中国银行H2n);K=xlsread(中国银行五日线);L=xlsread(中国银行十日线);M=xlsread(中国银行二十日线);N=xlsread(中国银行六十日线);Pn,minp,maxp,Tn,mint,maxt=premnmx(P,T) net_1=newff(minmax(Pn),12,1,tansig,purelin,trai

21、ngdm) % 当前输入层权值和阈值inputWeights=net_1.IW1,1inputbias=net_1.b1% 当前网络层权值和阈值layerWeights=net_1.LW2,1layerbias=net_1.b2 % 设置训练参数net_1.trainParam.show = 50;net_1.trainParam.lr = 0.05;net_1.trainParam.mc = 0.9;net_1.trainParam.epochs = 100000;net_1.trainParam.goal = 1e-3; % 调用 TRAINGDM 算法训练 BP 网络net_1,tr=t

22、rain(net_1,Pn,Tn); % 对 BP 网络进行仿真A = sim(net_1,Hn);% 计算仿真误差 E = Tn - A;MSE=mse(E); A1,T1 = postmnmx(A,min(min(P),max(max(P),Tn,mint,maxt) x=1:129;x1=1:131plot(x,A1,r);hold on plot(x,T1,b);hold on plot(x1,K,w);hold on plot(x1,L,y);hold on plot(x1,M,m);hold on plot(x1,N,c);title(中国银行2013/11/1-2014/5/15

23、);legend(预测,实际,五日线,十日线,二十日线,六十日线,1);figure(2)plot(x,E,r)4.2中国汽研预测分析;在MATLABr2014a 中用函数xlsread 导入已经下载好的中国汽研(601965)2013/4/1-2014/5/12的收盘价作为输入样本,进行BP网络训练。网络结构:BP神经网络的仿真结果:图中红色曲线为预测曲线,蓝色曲线为实际曲线,从图可以看出,BP曲线近似的模拟出真实曲线,较之前中国银行的预测效果要好,主要原因是中国汽研的训练样本数目提升到256组,并且训练了十万次,误差到了0.006。误差训练情况:梯度:回归曲线:股票分析:方法一:移动平均线

24、与BP曲线相结合 从标号一可以看出,下降趋势的五日线突破了下降趋势的十日线,说明短期内该股票将下跌,下降趋势的十日线也同样突破下降趋势的二十日线,表明该股中期内也将下降,投资者此时应谨慎。标号一和标号二之间连续出现几个死亡交叉点,并且BP曲线出现波动,此时投资者应该慎重考虑,切勿急功近利。 标号二表明上升趋势的五日线向上突破十日线,表明短期内该股将上涨,同时上升趋势的十日线也向上突破上升趋势的二十日线,表明中期内该股也呈上升趋势。 标号三可以看出,上升趋势的五日线向上穿过上升趋势的十日线,所以该股短期内将会上升,同样的上升趋势的十日线向上穿过上升趋势的二十日线,说明该股在中期内也将会上升。 标

25、号四可以看出,下降趋势的五日线向下穿过下降趋势的十日线,表明短期内该股将会上升,但是标号四与标号五之间连续出现几个死亡交叉点,并且BP曲线出现波动,此时投资者应该慎重考虑,切勿急功近利。 标号五为下降趋势的五日线,二十日线,分别向下穿过下降趋势的十日线,六十日线,表明该股短期内,长期内将会下降,实际与预测的结果大致相同。方法二:指数平滑异同平均线(MACD)分析法:MACD称为指数平滑异同平均线,是从双移动平均线发展而来的,由快的移动平均线减去慢的移动平均线,MACD的意义和双移动平均线基本相同,但阅读起来更方便。当MACD从负数转向正数,是买的信号。当MACD从正数转向负数,是卖的信号。当M

26、ACD以大角度变化,表示快的移动平均线和慢的移动平均线的差距非常迅速的拉开,代表了一个市场大趋势的转变。MACD线从正数转向负数时,股票即将有下降趋势,是卖出的信号,从负数转向正数的时候,股票有即将有上升的趋势,是买入的信号。综合所述,本次股票预测还算是成功,预测结果往往令人满意。MATLAB 程序:clc;clear;close all;P=xlsread(6);T=xlsread(7);H=xlsread(8);H1=xlsread(H1);K=xlsread(中国汽研五日线);L=xlsread(中国汽研十日线);M=xlsread(中国汽研二十日线);N=xlsread(中国汽研六十日

27、线);Pn,minp,maxp,Tn,mint,maxt=premnmx(P,T) net_1=newff(minmax(Pn),12,1,tansig,purelin,traingdm) % 当前输入层权值和阈值inputWeights=net_1.IW1,1inputbias=net_1.b1% 当前网络层权值和阈值layerWeights=net_1.LW2,1layerbias=net_1.b2 % 设置训练参数net_1.trainParam.show = 50;net_1.trainParam.lr = 0.05;net_1.trainParam.mc = 0.9;net_1.tr

28、ainParam.epochs = 100000;net_1.trainParam.goal = 1e-3; % 调用 TRAINGDM 算法训练 BP 网络net_1,tr=train(net_1,Pn,Tn); % 对 BP 网络进行仿真A = sim(net_1,H);E = Tn - A;MSE=mse(E); A1,T1 = postmnmx(A,min(minp),max(maxp),Tn,mint,maxt) x=1:256;plot(x,A1,r);hold on plot(x,T1,b)hold on plot(x,K,w);hold on plot(x,L,y);hold

29、on plot(x,M,m);hold on plot(x,N,c);title(中国汽研2013/4/1-2014/5/12);legend(预测,实际,五日线,十日线,二十日线,六十日线,1)figure(2)plot(x,E,r);5.结论和前景股票市场自诞生以来,一直吸引着众多投资者和学者的目光,对股票价格走势的预测也始终是他们探寻的目标。然而影响股票价格的因素非常多,这样,使得股票的预测成为一项异常困难的工作。尽管如此,这种准确预测从而获得超额收益的机会依然吸引着一代又一代的学者和投资者进行研究和实践。本文经过对两支股票数据资料的统计分析,建立了一个股票预测模型。由于现有研究条件的制

30、约,该预测模型还有许多不足之处,还需要在实践中不断地改进和完善。 首先,模型输入节点数目需进一步完善。由于数据资料的局限性,本文只选择了5个向量作为输入节点。但是,一个完善的预测模型需要多方面的考虑与设计,精准对度要比较高,这就需要更加完善的输入向量设计。 其次,隐含层节点数的设计需进一步完善。由于神经网络运行的时间和效率受到计算机硬件的影响,本文只在有限的条件下进行了隐含层节点数的选择和优化。要进一步完善隐含层节点数的设计,就需要更加先进的计算机硬件支持,来实现精准的预测。最后,模型算法仍待改进。6. 结束语 本文使用的BP神经网络算法有一点的优越性,但同时也具备一些固有的缺陷,而且预测精度

31、也没有达到更好的效果。因此,可以尝试使用RBF和遗传算法等其他方式建立组合模型,提高模型预测的准确性和普遍适应性。【参考文献】1刘琳 基于BP神经网络的股票短期预测应用研究 对外经济贸易大学。2 许兴军 颜钢锋 基于BP神经网络的股价趋势分析 浙江大学电气自动化研究所3陈东 BP神经网络在证券指数预测中的的研究与应用。4 钟珞、饶文碧、邹承明,人工神经网络及其融合应用技术,科学出版社5 丛爽,面向MATLAB工具箱的神经网络理论与应用,合肥:中国科学技术大学出版社,2009.46张德丰,MATLAB神经网络应用设计,北京:机械工业出版社,2009.1附录资料:不需要的可以自行删除 C语言图形模

32、式速成第一节 图形模式的初始化Turbo C 提供了非常丰富的图形函数,所有图形函数的原型均在graphics. h 中,本节主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。另外,使用图形函数时要确保有显示器图形驱动程序*.BGI,同时将集成开发环境options/Linker中的Graphics lib选为on,只有这样才能保证正确使用图形函数。 不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器,在不同模式下也有不同分辨率。因此,在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默

33、认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。设置屏幕为图形模式,可用下列图形初始化函数:void far initgraph(int far *gdriver, int far *gmode,char *path);其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。有关图形驱动器、图形模式的符号常数及对应的分辨率见graphics. h。图形驱动程序由Turbo C出版商提供,文件扩展名为.BGI。 根据不同的图形适配器有不同的图形驱动程序。例如对于EGA、 VGA 图形适配器就调用驱动程序EGAVGA.BGI。#inc

34、lude stdio.h#include graphics.hint main()int gdriver, gmode;gdriver=VGA;gmode=VGAHI;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(100, 100, 300, 250, 50, 1); /*画一长方体*/getch();closegraph();return 0;有时编程者并不知道所用的图形显示器适配器种类,或者需要将编写的程序用于不同图形驱动器,Turbo C 提供了一个自动检测显示器硬件的函数,其调用格式为:void far detectgraph(int *g

35、driver, *gmode);其中gdriver和gmode的意义与上面相同。 自动进行硬件测试后进行图形初始化:#include stdio.h#include graphics.hint main()int gdriver, gmode;detectgraph(&gdriver, &gmode); /*自动测试硬件*/printf(the graphics driver is %d, mode is %dn,gdriver,gmode); /*输出测试结果*/getch();initgraph(&gdriver, &gmode, C:TC2.0BGI);/* 根据测试结果初始化图形*/b

36、ar3d(100, 100, 300, 250, 50, 1); /*画一长方体*/getch();closegraph();return 0;上例程序中先对图形显示器自动检测,然后再用图形初始化函数进行初始化设置,但Turbo C提供了一种更简单的方法, 即用gdriver=DETECT 语句后再跟initgraph()函数就行了。采用这种方法后,上例可改为:#include stdio.h#include graphics.hint main()int gdriver=DETECT, gmode;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(5

37、0, 50, 150, 30, 50, 1);getch();closegraph();return 0;另外,Turbo C 提供了退出图形状态的函数closegraph(),其调用格式为:void far closegraph(void);第二节 屏幕颜色的设置和清屏函数对于图形模式的屏幕颜色设置,同样分为背景色的设置和前景色的设置。在Turbo C中分别用下面两个函数: 设置背景色: void far setbkcolor(int color);设置作图色: void far setcolor(int color);其中color 为图形方式下颜色的规定数值,对EGA,VGA显示器适配器

38、,有关颜色的符号常数及数值见graphics.h。清除图形屏幕内容但不清除图形背景使用清屏函数,其调用格式如下: voide far cleardevice(void);#include stdio.h#include graphics.hint main()int gdriver, gmode, i,aa;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI); /*图形初始化*/setbkcolor(0); /*设置图形背景*/cleardevice();for(i=0; i=15; i+)setcolor(i); /*设置不同作图色*

39、/circle(320, 240, 20+i*10); /*画半径不同的圆*/getch();for(i=0; i=15; i+)setbkcolor(i); /*设置不同背景色*/cleardevice();circle(320, 240, 20+i*10);getch();aa=getmaxcolor();printf(maxcolor=%d,aa);getch();closegraph();return 0;另外,TURBO C也提供了几个获得现行颜色设置情况的函数。 int far getbkcolor(void); 返回现行背景颜色值。int far getcolor(void);

40、返回现行作图颜色值。int far getmaxcolor(void); 返回最高可用的颜色值。第三节 基本画图函数基本图形函数包括画点,线以及其它一些基本图形的函数。本节对这些函数作一全面的介绍。 、画点. 画点函数 void far putpixel(int x, int y, int color); 该函数表示有指定的象元画一个按color 所确定颜色的点。对于颜色color的值可从表3中获得而对x, y是指图形象元的坐标。在图形模式下,是按象元来定义坐标的。对VGA适配器,它的最高分辨率为640 x480,其中640为整个屏幕从左到右所有象元的个数,480为整个屏幕从上到下所有象元的个

41、数。屏幕的左上角坐标为(0,0),右下角坐标为(639, 479),水平方向从左到右为x 轴正向,垂直方向从上到下为y轴正向。TURBO C的图形函数都是相对于图形屏幕坐标,即象元来说的。关于点的另外一个函数是: int far getpixel(int x, int y); 它获得当前点(x, y)的颜色值。 II、有关坐标位置的函数 int far getmaxx(void);返回x轴的最大值。int far getmaxy(void);返回y轴的最大值。int far getx(void); 返回游标在x轴的位置。void far gety(void); 返回游标有y轴的位置。void

42、far moveto(int x, int y); 移动游标到(x, y)点,不是画点,在移动过程中亦画点。void far moverel(int dx, int dy); 移动游标从现行位置(x, y)移动到(x+dx, y+dy)的位置,移动过程中不画点。、画线I. 画线函数TURBO C提供了一系列画线函数: void far line(int x0, int y0, int x1, int y1); 画一条从点(x0, y0)到(x1, y1)的直线。void far lineto(int x, int y); 画一作从现行游标到点(x, y)的直线。void far linerel

43、(int dx, int dy); 画一条从现行游标(x,y)到按相对增量确定的点(x+dx, y+dy)的直线。void far circle(int x, int y, int radius); 以(x, y)为圆心,radius为半径,画一个圆。void far arc(int x, int y, int stangle, int endangle,int radius); 以(x,y)为圆心,radius为半径,从stangle开始到endangle结束(用度表示)画一段圆弧线。在TURBO C中规定x轴正向为0 度,逆时针方向旋转一周, 依次为90,180, 270和360度(其它有

44、关函数也按此规定,不再重述)。 void ellipse(int x, int y, int stangle, int endangle,int xradius,int yradius);以(x, y)为中心,xradius,yradius为x轴和y轴半径,从角stangle 开始到endangle结束画一段椭圆线,当stangle=0,endangle=360时, 画出一个完整的椭圆。void far rectangle(int x1, int y1, int x2, inty2); 以(x1, y1)为左上角,(x2, y2)为右下角画一个矩形框。 void far drawpoly(in

45、t numpoints, int far *polypoints); 画一个顶点数为numpoints,各顶点坐标由polypoints给出的多边形。polypoints整型数组必须至少有2 倍顶点数个无素。每一个顶点的坐标都定义为x,y,并且x在前。值得注意的是当画一个封闭的多边形时,numpoints 的值取实际多边形的顶点数加一,并且数组polypoints中第一个和最后一个点的坐标相同。下面举一个用drawpoly()函数画箭头的例子。#include stdio.h#include graphics.hint main()int gdriver, gmode, i;int arw16

46、=200,102,300,102,300,107,330,100,300,93,300,98,200,98,200,102;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(12); /*设置作图颜色*/drawpoly(8, arw); /*画一箭头*/getch();closegraph();return 0;II、设定线型函数在没有对线的特性进行设定之前,TURBO C 用其默认值,即一点宽的实线,但TURBO C 也提供了可以改变线型的函数。线型包

47、括:宽度和形状。其中宽度只有两种选择:一点宽和三点宽。而线的形状则有五种。下面介绍有关线型的设置函数。void far setlinestyle(int linestyle,unsigned upattern,int thickness);该函数用来设置线的有关信息,其中linestyle是线形状的规定,见graphics.h。对于upattern,只有linestyle选USERBIT_LINE 时才有意义 (选其它线型,uppattern取0即可)。此时uppattern的16位二进制数的每一位代表一个象元,如果那位为1,则该象元打开,否则该象元关闭。 void far getlinese

48、ttings(struct linesettingstypefar *lineinfo);该函数将有关线的信息存放到由lineinfo 指向的结构中,表中linesettingstype的结构如下:struct linesettingstypeint linestyle;unsigned upattern;int thickness;例如下面两句程序可以读出当前线的特性 struct linesettingstype *info;getlinesettings(info);void far setwritemode(int mode);该函数规定画线的方式。如果mode=0,则表示画线时将所画

49、位置的原来信息覆盖了(这是TURBO C的默认方式)。如果mode=1, 则表示画线时用现在特性的线与所画之处原有的线进行异或(XOR)操作,实际上画出的线是原有线与现在规定的线进行异或后的结果。因此,当线的特性不变,进行两次画线操作相当于没有画线。有关线型设定和画线函数的例子如下所示。#include stdio.h#include graphics.hint main()int gdriver, gmode, i;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();set

50、color(GREEN);circle(320, 240, 98);setlinestyle(0, 0, 3); /*设置三点宽实线*/setcolor(2);rectangle(220, 140, 420, 340);setcolor(WHITE);setlinestyle(4, 0 xaaaa, 1);/*设置一点宽用户定义线*/line(220, 240, 420, 240);line(320, 140, 320, 340);getch();closegraph();return 0;第四节 基本图形的填充填充就是用规定的颜色和图模填满一个封闭图形。 一般是先画轮廓再填充。TURBO C

51、提供了一些先画出基本图形轮廓, 再按规定图模和颜色填充整个封闭图形的函数。在没有改变填充方式时,TURBO C 以默认方式填充。 void far bar(int x1, int y1, int x2, int y2);确定一个以(x1,y1)为左上角,(x2,y2)为右下角的矩形窗口,再按规定图模和颜色填充。说明:此函数不画出边框,所以填充色为边框。void far bar3d(int x1, int y1, int x2, int y2,int depth,int topflag);当topflag为非0时, 画出一个三维的长方体。当topflag为0时,三维图形不封顶,实际上很少这样使用

52、。说明: bar3d()函数中,长方体第三维的方向不随任何参数而变,即始终为45度的方向。void far pieslice(int x,int y,int stangle,int endangle,int radius);画一个以(x, y)为圆心,radius为半径,stangle为起始角度,endangle 为终止角度的扇形,再按规定方式填充。当stangle=0,endangle=360 时变成一个实心圆,并在圆内从圆点沿X轴正向画一条半径。void far sector(int x, int y,int stanle,intendangle,int xradius, int yrad

53、ius);画一个以(x, y)为圆心分别以xradius, yradius为x轴和y轴半径,stangle 为起始角,endangle为终止角的椭圆扇形,再按规定方式填充。第五节 设定填充方式TURBO C有四个与填充方式有关的函数。下面分别介绍: void far setfillstyle(int pattern, int color); color的值是当前屏幕图形模式时颜色的有效值。pattern的值及与其等价的符号常数见graphics.h。除USER_FILL(用户定义填充式样)以外,其它填充式样均可由setfillstyle() 函数设置。当选用USER_FILL时,该函数对填充图

54、模和颜色不作任何改变。 之所以定义USER_FILL主要因为在获得有关填充信息时用到此项。void far setfillpattern(char * upattern,int color); 设置用户定义的填充图模的颜色以供对封闭图形填充。其中upattern是一个指向8个字节的指针。这8个字节定义了8x8点阵的图形。每个字节的8位二进制数表示水平8点,8个字节表示8行,然后以此为模型向个封闭区域填充。void far getfillpattern(char * upattern); 该函数将用户定义的填充图模存入upattern指针指向的内存区域。void far getfillsetin

55、gs(struct fillsettingstypefar * fillinfo); 获得现行图模的颜色并将存入结构指针变量fillinfo中。其中fillsettingstype结构定义如下:struct fillsettingstypeint pattern; /* 现行填充模式 * /int color; /* 现行填充模式 * /; 有关图形填充图模的颜色的选择,请看下面例程。#include stdio.h#include graphics.hmain()char str8=10,20,30,40,50,60,70,80; /*用户定义图模*/int gdriver,gmode,i;

56、struct fillsettingstype save;/*定义一个用来存储填充信息的结构变量*/gdriver=DETECT;initgraph(&gdriver,&gmode,C:TC2.0BGI);setbkcolor(BLUE);cleardevice();for(i=0;i13;i+)setcolor(i+3);setfillstyle(i,2+i); /* 设置填充类型 */bar(100,150,200,50); /*画矩形并填充*/bar3d(300,100,500,200,70,1); /* 画长方体并填充*/pieslice(200, 300, 90, 180, 90);

57、/*画扇形并填充*/sector(500,300,180,270,200,100);/*画椭圆扇形并填充*/getch();cleardevice();setcolor(14);setfillpattern(str, RED);bar(100,150,200,50);bar3d(300,100,500,200,70,0);pieslice(200,300,0,360,90);sector(500,300,0,360,100,50);getch();getfillsettings(&save);/*获得用户定义的填充模式信息*/closegraph();clrscr();printf(The p

58、attern is %d, The color of filling is %d,save.pattern, save.color);/*输出目前填充图模和颜色值*/getch();第六节 任意封闭图形的填充截止目前为止,我们只能对一些特定形状的封闭图形进行填充,但还不能对任意封闭图形进行填充。为此,TURBO C 提供了一个可对任意封闭图形填充的函数,其调用格式如下: void far floodfill(int x, int y, int border); 其中:x, y为封闭图形内的任意一点,border为边界的颜色,也就是封闭图形轮廓的颜色。调用了该函数后,将用由函数setfillst

59、yle()规定的颜色和模式填满整个封闭图形。注意:a. 如果x或y取在边界上,则不进行填充。b. 如果不是封闭图形则填充会从没有封闭的地方溢出去,填满其它地方。c. 如果x或y在图形外面,则填充封闭图形外的屏幕区域。d. 由border指定的颜色值必须与图形轮廓的颜色值相同, 但填充色可选任意颜色。下例是有关floodfill()函数的用法,该程序填充了bar3d()所画长方体中其它两个未填充的面。#include stdio.h#include graphics.hmain()int gdriver, gmode;struct fillsettingstype save;gdriver=DE

60、TECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(LIGHTRED);setlinestyle(0,0,3);setfillstyle(1,14); /*设置填充方式*/bar3d(100,200,400,350,200,1); /*画长方体并填充*/floodfill(450,300,LIGHTRED);/*填充长方体另外两个面*/floodfill(250,150, LIGHTRED);rectangle(450,400,500,450); /*画一矩形*/floodfi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论