用C++实现数学函数图形绘制(含源文件)
用C语言编程绘制函数的图像源程序
#include<stdio.h>#include<graphics.h>#include<conio.h>float a,b,c,xmin,xmax,max; /*定义全局变量*/void menu(){printf("\n************************************WELCOME************************ *************\n");printf("\n 1.输入参数");printf("\n 2.输入x的范围");printf("\n 3.画函数图像");printf("\n 4.退出");printf("\n*********************************************************************** *********\n");}fun1(){printf("输入a,b,c\n");scanf("%f,%f,%f",&a,&b,&c); /*输入系数a,b,c*/}fun2() /*输入x范围*/{printf("输入xmin,xmax\n");scanf("%f,%f",&xmin,&xmax);}funmax() /*求出x轴最大范围*/{float m,n;if(xmin<0)m=-xmin;elsem=xmin;if(xmax<0)n=-xmax;elsen=xmax;if(m>=n)max=m;elsemax=n;}float funx(float max_x) /*求出x轴对应系数*/{return(max_x/2/max);}float funy(float max_y) /*求出y轴对应系数*/{float d;d=max_y/2/(a*max*max+b*max+c);if(d>0.6)d=0.6;if(d<0.0026)d=0.0026;return(d);}fun3(){int max_x,max_y;int graphdriver=DETECT,graphmode;float x1,y1,x2,y2,x,coe_x,coe_y;initgraph(&graphdriver,&graphmode,""); /*图形初始化*/cleardevice(); /*清屏*/max_x=getmaxx(); /*求出屏幕最大横坐标*/max_y=getmaxy(); /*求出屏幕最大横坐标*/funmax();coe_x=funx(max_x);coe_y=funy(max_y);line(0,240,640,240); /*画直线*/line(320,0,320,480);line(640,240,635,235);line(640,240,635,245);line(320,0,315,5);line(320,0,325,5);outtextxy(320,240,"(0,0)"); /*在固定点输出字符串*/outtextxy(620,240,"x");outtextxy(320,10,"y");x1=max_x/2+xmin*coe_x,y1=max_y/2-(a*xmin*coe_x*xmin*coe_x+b*xmin*coe_x+c)*coe_y; moveto((int)x1,(int)y1);for(x=xmin*coe_x;x<=xmax*coe_x;x++){x2=max_x/2+x,y2=max_y/2-(a*x*x+b*x+c)*coe_y;lineto((int)x2,(int)y2);}getch();closegraph(); /*关闭图形函数*/}main(){int n;menu();while(1){scanf("%d",&n);switch(n){ case 1:fun1();break;case 2:fun2();break;case 3:fun3();break;case 4:exit(0);default:printf("\n error \n");}}}。
利用C语言图形函数绘图共10页
计算机图形学课程实验 报 告实验题目班 级 姓 名 学 号 指导教师 日 期西安理工大学理学院应用数学系二零一二年春季学期信息与计算科学专业基础课Computer Graphics Report Of course experiment实验说明试验目的: 掌握TurboC 语言图形函数的使用和学会绘制一般图形。
试验地点: 教九楼401 数学系机房实验要求(Direction ):1. 每个学生单独完成;2.开发语言为TurboC 或C++,也可使用其它语言;3.请在自己的实验报告上写明姓名、学号、班级;4.每次交的实验报告内容包括:题目、试验目的和意义、程序制作步骤、主程序、运行结果图以及参考文件;5. 自己保留一份可执行程序,考试前统一检查和上交。
实验内容实验题一1.1实验题目用如下图1所示,图中最大正n 边形的外接圆半径为R ,旋转该正n 边形,每次旋转θ角度,旋转后的的n 边形顶点落在前一个正六边形的边上,共旋转N 次,请上机编程绘制N+1个外接圆半径逐渐缩小且旋转的正n 边形。
要求:(1) n 、R 、N 、θ要求可以人为自由控制输入;(2)N+1个正六边形的中心(即外接圆的圆心)在显示屏幕中心。
利用C 语言图形函数绘图实验11.2实验目的和意义1. 了解如何利用C语言和图形函数进行绘图;2. 熟悉并掌握C语言的图形模式控制函数,图形屏幕操作函数,以及基本图形函数;3. 通过对Turbo C进行图形程序设计的基本方法的学习,能绘制出简单的图形;4. 通过绘制N+1个正n边形,了解图形系统初始化、图形系统关闭和图形模式的控制,并熟练运用图形坐标的设置,包括定点、读取光标、读取x和y轴的最大值以及图形颜色的设置。
1.3程序制作步骤(包括算法思想、算法流程图等)算法思想:1.自动搜索显示器类型和显示模式,初始化图形系统,通过printf、scanf语句控制半径r、边数n、多边形的个数k、边的每次旋转角度d,的自由输入;2.给定一内接圆半径r,由圆内接多边形的算法公式:x[i]=r*cos((i+1) *2.0*pi/n)+320.0y[i]=240.0-r*sin(2.0*pi/n *(i+1))确定出多边形N的各个顶点坐标,然后利用划线函数line(),连接相邻两点,即形成一个正多边形。
动态函数图像演示-C语言课程设计实验报告(含源码)
C语言课程设计实验报告题目:动态函数图像演示学院:软件学院指导老师:学号:姓名:2012年9月3号—9月17日一、实验题目及要求画出函数y=a*x^2+b*x+c 的曲线图形(1)设置对话框确定函数参数(2)设置对话框确定曲线的粗细(3)设置对话框确定曲线的颜色(4)画出一个小人沿着曲线轨迹移动,并画出曲线图形(5)将画出的图形保存为jpg格式,并要求可以用其他看图软件打开二、程序主要流程(1)建立首界面(即为进入或退出画图软件)(2)设定对话框依次确定函数参数,曲线粗细,曲线颜色(3)初始化画图系统画出坐标系与曲线(4)建立动态画图函数(5)建立保存与打开图形的函数三、在程序中遇到的困难及解决方案在构建首界面时运用了通过读取键盘值来控制光标的移动达到进入或退出看图软件。
在使用键盘值时,由老师给出的资料可以得知<bios.h>,<dos.h>为键盘头文件,bioskey(1)==0为读取键盘值,并且得到了key_up 72 key_esc 1 Key_enter 28 key_down 80为获取到的键盘值。
例:int get_key() /*设定键盘控制*/{union REGS rg;rg.h.ah=0;int86(0x16,&rg,&rg);return rg.h.ah;getchar();}在设置第一个对话框时,从TC-2.0函数软件查询中搜查到了 window为建立字符模式下的矩形字符窗口, textbackground为设置字符模式下的背景颜色,textcolor为设置字符模式下的字符颜色,由此解决了在字符模式下对话框背景及字符的颜色设置,gotoxy为将当前字符屏幕的光标位置移动到x,y坐标位置, gettext为保存矩形屏幕上的字符,puttext为将gettext函数保存的字符恢复到屏幕上,由此解决了在合适的位置上输入字符的问题。
上述函数名均在<conio.h>头文件中。
函数绘图
VC下绘图程序Demo一.启动VC6.0二.创建工程选择"MFC App Wizard(exe)"三.编辑菜单资源 (在ResourceView标签中,选择Menu项)菜单标题菜单项标题标示符ID直线 DDA算法生成直线 ID_DDALINE四.添加消息处理函数利用ClassWizard 添加与菜单项相关的消息处理函数,在ClassName栏中选择xxxView,建立消息处理函数菜单项ID 消息消息处理函数ID_DDALINE COMMAND OnDdaline五.程序在xxxView.cpp文件中相应位置添加如下代码:void xxxView::OnDdaline(){CDC* pDC=GetDC(); //获得设备指针int c=RGB(255,0,0);for(int i=0; i<100; i++)pDC->SetPixel(100+i, 100+i, c); //画象素点ReleaseDC(pDC); //释放设备指针}把x、y的值与象素联系起来就行了网友:hahucdc pdc=getdc();pdc-> (x,y,color);这样每个点画出来网友:crybird关键是函数的表示,而不是画图。
给出每点坐标的算法,用for循环画点。
画图的办法就是“密点成线”。
我不是在绘图消息里面画图,而是先读入一个txt文件,然后提取里面的坐标数据进行绘图。
我的做法是响应一个“图形显示”按钮的消息以后,进行文件的数据提取并绘制线段,void CMyDataBaseView::OnButtonTrackmapShow(){char buf[100];CClientDC dc(this);CPen pen(PS_SOLID,1,RGB(255,0,0));dc.SelectObject(&pen);//临时保存读取出来的文件内容while(!infile.eof()){memset(buf,0,sizeof(buf));CString str=buf;CPoint a,b;a.x=atoi(split(str,1));a.y=atoi(split(str,2));dc.MoveTo(a);b.x=atoi(split(str,3));b.y=atoi(split(str,4));dc.LineTo(b);}}但是运行时点击按钮以后一点反应也没有,反而发现程序开始变慢,大家帮我看看问题在哪里。
C语言画图函数
C语言画图函数与图形有关的函数GRAPHICS.H 库文件bar【功能】画出一条栏目。
【原型】void far bar(int left,int top,int right,int bottom)【位置】graphics.hgraphics.h【参见】bar3d,setfillstyle,rectanglebar3d【功能】画出一条3-D栏目。
【原型】void far bar3d(int left,int top,int right,int bottom,int depth,int topflag) 【位置】graphics.h【参见】barcircle【功能】以(x,y)为圆心按照指定的半径画出一个圆。
【原型】void far circle(int x,int y,int radius)【位置】graphics.h【参见】arccleardevice【功能】清除图形画面。
【原型】void far cleardevice(void)【位置】graphics.h【参见】clearviewportclearviewport【功能】清除当前可视区域。
【原型】clearviewport(void)【位置】graphics.h【参见】setviewport,cleardeviceclosegraph【功能】关闭图形系统。
【原型】void far closegraph(void)【位置】graphics.h【参见】initgraphdetecgraph【功能】通过检查硬件确定使用的图形驱动程序和模式。
【原型】void far detectgraph(int far *graphdriver,int far *graphmode)【位置】graphics.h【参见】initgraph,graphresultdrawpoly【功能】画出一个多边形的轮廓。
【原型】void far drawpoly(int numpoints,int far polypoints[])【位置】graphics.h【说明】polypoints中包括一共numpoints对数值。
项目3使用C语言图形函数画图
项目3使用C语言图形函数画图实践任务3课程名称c语言程序设计实践任务使用C图形函数画图实践地点指导教师班级学生姓名学号教师评分日期实践任务3搭建VC++6.0集成开发环境3.1任务目的(1)掌握函数概念(2)掌握C图形函数的使用方法(3)掌握smartdraw的安装和使用3.2知识要点3.2.1屏幕坐标系屏幕显示模式就是数据在屏幕上的显示方式。
C语言把屏幕显示模式分为文本模式和图形模式两种。
图形模式中,为了便于指定屏幕上位置,我们取屏幕左上角为坐标原点,第一行所在位置为x轴,第一列所在位置为y轴,建立如图3-1所示的屏幕直角坐标系。
图3-4屏幕坐标示意图建立屏幕直角坐标系后,就可以用有序数对(x,y)表示屏幕上点的位置。
在点的坐标(x,y)中,x指定点的列坐标,y指定点的行坐标#显示器屏幕上象素的数目由分辨率决定,如果分辨率是640×480,即屏幕每行有640个象素,每列有480个象素。
3.2.1基本图形(1)画圆函数:voidcricle(intx,inty,intr);如图3-2所示图3-2画圆函数说明图示关键字void表示函数无返回值,circle是函数名,后面的括号里面是参数列表,参数之间用“,”号隔开,参数前面的关键字是参数的数据类型,xy为坐标,r为圆半径。
(2)画矩形函数:voidrectangle(intleft,inttop,intright,intbottom)(left,top)表示的是矩形左上角点坐标,(right,botom)表示的是矩形右下角点坐标,(3)设置画笔的颜色函数:voidsetcolor(intcolor);EasyX图形库使用24bit真彩色,通常使用预定义的字符常量来代表颜色字符常量在这里代表的是整形数,为了便于记忆,免除了人们记忆枯燥的数字,如setcolor(0x0000AA)和setcolor(RED)都是用来设置画笔颜色为红色,显然setcolor(RED)用起来很简单,还要说明的是表中整数值是16进制数。
用C++实现数学函数图形绘制
利用C语言画图例子
利用C语言画图例子利用C语言画图例子1)/*#include // 就是需要引用这个图形库 #includevoid main()#include#includevoid main(){initgraph(640, 480); // 这里和 TC 略有区别circle(200, 200, 100); // 画圆,圆心(200, 200),半径100 getch(); // 按任意键继续closegraph(); // 关闭图形界面printf("***\n");}*/2)/*#include#include#includevoid main(){// 设置随机函数种子srand((unsigned) time(NULL));// 初始化图形模式initgraph(640, 480);int x, y;char c;setfont(16, 8, "Courier"); // 设置字体while(!kbhit()){for (int i=0; i<479; i++){setcolor(GREEN);for (int j=0; j<3; j++){x = (rand() % 80) * 8;y = (rand() % 20) * 24;c = (rand() % 26) + 65; outtextxy(x, y, c);}setcolor(0);line(0,i,639,i);Sleep(10);if (kbhit()) break;}}// 关闭图形模式closegraph();}*/3)/*#include#include#include#define MAXSTAR 200 // 星星总数struct STARdouble x;int y;double step;int color;};STAR star[MAXSTAR];// 初始化星星void InitStar(int i){star[i].x = 0;star[i].y = rand() % 480;star[i].step = (rand() % 5000) / 1000.0 + 1; star[i].color = (int)(star[i].step * 255 / 6.0 + 0.5); // 速度越快,颜色越亮star[i].color = RGB(star[i].color, star[i].color, star[i].color);}// 移动星星void MoveStar(int i){// 擦掉原来的星星putpixel((int)star[i].x, star[i].y, 0);// 计算新位置star[i].x += star[i].step;if (star[i].x > 640) InitStar(i);// 画新星星putpixel((int)star[i].x, star[i].y, star[i].color); }// 主函数void main()srand((unsigned)time(NULL)); // 随机种子initgraph(640, 480); // 打开图形窗口// 初始化所有星星for(int i=0; i<="" p="">{InitStar(i);star[i].x = rand() % 640;}// 绘制星空,按任意键退出while(!kbhit()){for(int i=0; i<="" p="">MoveStar(i);Sleep(20);}closegraph(); // 关闭图形窗口}*/4)/*#include#includevoid main(){float H, S, L;initgraph(640, 480);// 画渐变的天空(通过亮度逐渐增加)H = 190; // 色相S = 1; // 饱和度L = 0.7f; // 亮度for(int y = 0; y < 480; y++){L += 0.0005f;setcolor( HSLtoRGB(H, S, L) );line(0, y, 639, y);}// 画彩虹(通过色相逐渐增加)H = 0;S = 1;L = 0.5f;setlinestyle(PS_SOLID, NULL, 2); // 设置线宽为 2 for(int r = 400; r > 344; r--){H += 5;setcolor( HSLtoRGB(H, S, L) );circle(500, 480, r);}getch();closegraph();}*/5)#include#includevoid main(){// 初始化图形窗口initgraph(640, 480);MOUSEMSG m; // 定义鼠标消息while(true){// 获取一条鼠标消息m = GetMouseMsg();switch(m.uMsg){case WM_MOUSEMOVE:// 鼠标移动的时候画红色的小点putpixel(m.x, m.y, RED);break;case WM_LBUTTONDOWN:// 如果点左键的同时按下了 Ctrl 键if (m.mkCtrl)// 画一个大方块rectangle(m.x-10, m.y-10, m.x+10, m.y+10); else// 画一个小方块rectangle(m.x-5, m.y-5, m.x+5, m.y+5); break;case WM_RBUTTONUP:return; // 按鼠标右键退出程序}}// 关闭图形窗口closegraph();}。
用C++实现数学函数图形绘制
用VC++实现数学函数图形绘制Use the VC++ to realize drawing figures of mathematic functions指导教师:付勇制作人:刘海,卢文娟Tutor: Fu yongProducer:Liu hai 、Lu wenjuan摘要Visual C++(以下简称VC++)是面向对象与可视化软件开发工具中比较成熟的一类。
MFC是VC++中直接由Microsoft提供的类库,它集成了大量已定义好的类,我们可以根据需要,调用相应类,或根据需要自定义类。
正是基于MFC 的这种特性,我们试图设计出具有封装性、独立性的功能模块------函数数据生成模块,函数曲线输出模块,模块之间的桥梁是由模板类CArray派生的CPoint 类数组充当的。
函数数据生成模块用来实现对函数的设置并获得采样点,数组得到采样点数据并将其传递到输出模块中。
从整体来看,实现了各程序模块的独立性,使得在函数模块中可任意添加、删除函数,可使用不同的DC和GDI,可实现不同的输出方式,整个工程在函数绘图功能上是无限扩展的。
经过反复的调试和检验,我们实现了预期目标。
我们的主要目的是尝试VC++在数学函数绘图方面的功能和应用。
这是对VC++的探索,也是对数学函数绘图多样化的尝试。
关键字数学函数图形绘制模板数组三次样条【Abstract】Visual C++ is one of the object oriented and visual software developer ,which is more mature than others . MFC is a class warehouse which is supplied by Microsoft ,and it contains a great deal of defined classes .we can transfer the corresponded class if necessary ,or give a fresh definition according our needs . Exactly based on MFC this kind of character, we try to design out the function mold which have the function to pack the class and be independent ------Mold for creating Function data, Mold for outputting the function curve, mold piece of born mold piece be sent by Cpoint Array rared by template CArray.The first mold is to make out sets for the function and get data we need which will be sent to the defined array,so now the array have the data that is to be got by the second mold.From whole project,we can see the independence of each mold,and exactly we may increase and decrease functions if necessary,we even can use different DC and GDI to realize the customed exportation method by which we can have a new view of the function curve. So, the function of the project can be extended freely.after repeatedly debugging and examining,we achieve our purpose.The most important thing we are trying is to find a way to connect the VC++ and the figures of mathmetic functions.This is not only a exploration to VC++,but also a attempt for realizing diversifing the mathmetic functions.【Key words】Mathematic functions drawingfigures template array tripline目录用VC++实现数学函数图形绘制 (1)Use the VC++ to realize drawing figures of mathematic functions (1)摘要 (1)关键字 (1)一、引言 (4)二、设计思路 (5)2.1总体结构的设计 (5)2.2基本结构的设计 (6)2.3面临的问题 (6)2.4解决问题的方法 (6)三、实现三次样条函数绘图 (10)3.1函数定义 (10)3.2边界条件 (10)3.3函数表达式 (11)3.4算法 (12)3.5程序实现 (12)3.6效果 (14)四、结论 (16)参考文献 (18)附录 (20)一、引言从事科技研究的人员常常需要解决一些复杂的数学问题,而这些数学问题的解答往往可以从它的函数图形上很直观、明了的表现出来,这时快捷方便的绘制出该数学函数的图形就显得尤为重要。
C语言绘制直角坐标系及余弦函数的详细程序[原创]
C语言绘制直角坐标系及余弦函数的详细程序[原创] //目标:在屏幕上用"*"绘制余弦函数cos(x)曲线#include <math.h>#include <stdio.h>#define PI 3.1415#define X_RADIAN(degree) PI*degree/180 //角度转弧度公式#define STEP_Y 0.1 //窗口中y轴方向步长#define STEP_X 10 //窗口中x轴方向步长#define PIXEL_X 70 //直角坐标系中x轴点数#define PIXEL_Y 24 //直角坐标系中y轴点数#define O_X PIXEL_X/2 //直角坐标系中原点(O_X,O_Y)#define O_Y PIXEL_Y/2#define O_X_IN_WIN 0 //窗口中原点(O_X_IN_WIN,O_Y_IN_WIN)#define O_Y_IN_WIN 0#define BOUNDARY_X_L 20 //窗口中x轴负半轴点数#define BOUNDARY_X_R 30 //窗口中x轴正半轴点数#define BOUNDARY_Y_U 10 //窗口中y轴正半轴点数Created by QXY#define BOUNDARY_Y_N 10 //窗口中y轴负半轴点数char check_window_legality(void) //检查窗口的合法性,若窗口比坐标系还大,则error{char rt = 0;if((BOUNDARY_X_L > O_X) || (BOUNDARY_X_R > O_X) || (BOUNDARY_Y_N > O_Y) || (BOUNDARY_Y_U > O_Y)) { printf("error! This window is too big .\n");} else{printf("This window is legal:\n");rt = 1;}return rt;}char dot_in_window(int x,int y) /*判断该打印点是否在画图窗口内*/{char rt = 0;if((x >= O_X - BOUNDARY_X_L)&&(x <= O_X + BOUNDARY_X_R))if((y >= O_Y - BOUNDARY_Y_N)&&(y <= O_Y + BOUNDARY_Y_U))rt = 1;Created by QXYreturn rt;}void main(){unsigned int line,column; /*此为打印页面上的行和列(line,column) <=> (x,y)*/int x_column_in_win, /*图像窗口中的x,y坐标*/y_line_in_win;float x_degree_in_win, //窗口中x轴方向每点代表的角度。
画圆弧的函数 c
画圆弧的函数 c
在C语言中,可以使用标准库函数`<>`中的`sin()`和`cos()`函数来计算角度的三角函数值,然后使用这些值来计算圆弧的坐标。
下面是一个简单的示例代码,演示如何使用C语言绘制一个圆弧:
<>
include <>
define PI
int main() {
int radius = 50; // 半径为50
int start_angle = 0; // 起始角度为0
int end_angle = 180; // 结束角度为180
int step = 10; // 步长为10
for (int i = start_angle; i <= end_angle; i += step) {
double x = radius cos(i PI / 180); // 计算x坐标
double y = radius sin(i PI / 180); // 计算y坐标
printf("(%f, %f)\n", x, y); // 输出坐标
}
return 0;
}
起始角度为0,结束角度为180,步长为10。
然后使用一个循环来计算每个角度的x和y坐标,并输出这些坐标。
需要注意的是,上面的代码只是一个简单的示例,实际上绘制圆弧还需要考虑更多的因素,例如圆的中心、起始点和结束点的位置、颜色等等。
如果需要绘制更复杂的图形,建议使用专门的图形库或绘图软件。
[正弦余弦函数图象视频]C语言实现正余弦函数图像的输出!(源码)
[正弦余弦函数图象视频]C语言实现正余弦函数图像的输出!(源码)篇一: C语言实现正余弦函数图像的输出!C语言实现源码,供参考!余弦函数:#include#includevoid main{double y;int x,m;for /*y为列方向,值从1到-1,步长为0.1*/{m=acos*10; /*计算出y对应的弧度m,乘以10为图形放大倍数*/ for printf;printf; /*控制打印左侧的 * 号*/forprintf;printf; /*控制打印同一行中对称的右侧*号*/}}正弦函数:#include#includemain{double y;int x,m,i;printf [0 施杨出品!扩展:c语言余弦函数/ c语言反余弦函数/ 余弦函数图像篇二: 《正弦函数、余弦函数的图象》教学案例《正弦函数、余弦函数的图象》教学案例数学科组金莹在接到“青年教师教学优质课比赛”的任务没多久,我又被级组赋予另一项艰巨而伟大的使命“优质班会课评比”。
当2个“优质课”碰撞时,也许就只能成全1个“优质”了!刚从班会优质课的赛场退下来,还没来得及喘口气,便又匆忙的投入几天后即将举行的教学优质课。
虽然我早已不是一位新手,我的年纪也正在踩线,青年教师的青春头衔将不再属于我,可是,面对教研处浓重组织的这场教学比赛,我还是心惊胆战!一是对手实在太强大;二是已有好几年没有教高一;三是《三角函数》是个公认不好讲、不易出彩的内容;四是我的准备不充足,留给我的时间太少了。
面对这么多的不利因素,我只能勇往直前,不怕失败!首先,确定主题。
怎样跳出三角函数那些枯燥的公式,平淡的性质,以学生为主体,新授课上出探究味呢?经过思考、对比,唯有“图象”,能当此重任。
它有“形”的直观,有多媒体的动态,更有学生参与画图的空间。
于是,我将主题定为“正弦函数、余弦函数的图象”。
这是1个承前启后的章节,它的推导要利用前面讲过的三角函数线,它的出现又将为后面研究性质铺路。
C语言绘制三角函数曲线
C语⾔绘制三⾓函数曲线本⽂实例为⼤家分享了Android九宫格图⽚展⽰的具体代码,供⼤家参考,具体内容如下题⽬:在屏幕上⽤“*”显⽰0°~360°的余弦函数cos(x)曲线。
#include <stdio.h>#include <math.h>int main(){int x;double y;int m;int i;for (y = 1; y >= -1; y = y - 0.1){x = acos(y) * 10;m = 62 - x;for (i = 0; i < x; i++){printf(" ");}printf("*");for (i = x; i < m; i++){printf(" ");}printf("*\n");}return 0;}题⽬:在屏幕上⽤“*”显⽰0°~360°的正弦函数sin(x)曲线。
//⽤“*”显⽰0~360的sin(x)的曲线#include <stdio.h>#include <math.h>int main(){int x;int m;int i;double y;for (y = 1; y >= 0.1; y = y - 0.1){x = asin(y) * 10;m = 31 - x;for (i = 0; i < x; i++){printf(" ");}printf("*");for ( ; i < m; i++){printf(" ");}printf("*\n");}printf("*");for (i = 0; i < 31; i++){printf(" ");}printf("*");for (i = 31; i < 62; i++){printf(" ");}printf("*\n");for (y = -0.1; y >= -1; y = y - 0.1){x = - asin(y) * 10;m = 31 - x;for (i = 0; i < x + 32; i++){printf(" ");}printf("*");for (i = x; i < m; i++){printf(" ");}printf("*\n");}return 0;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
c语言的绘图程序报源代码
c语言的绘图程序报源代码预览说明:预览图片所展示的格式为文档的源格式展示,下载源文件没有水印,内容可编辑和复制#include#define MAXX 640#define MAXY 480static float asp_ratio=1;static void selectpage(int page) /*换页函数*/ {union REGS r;r.x.ax=0x4f05;r.x.bx=0;r.x.dx=page;int86(0x10,&r,&r);}void init256(void){union REGS r;r.x.ax=0x4f02;r.x.bx=0x101;int86(0x10,&r,&r);}void exit256(void){union REGS r;r.h.ah=0;r.h.al=3;int86(0x10,&r,&r);}void putpixel(int x,int y,int color) { long i;static int t=0;int tt=0;char far *p=0xa0000000;i=y;i*=MAXX;i+=x;tt=i>>16;i&=0xffff;if(t!=tt) selectpage(tt);*(p+i)=(char)color;t=tt;}int getpixel(int x,int y){long i;static int t=0;int tt=0;char far *p=0xa0000000;i=y;i*=MAXX;i+=x;tt=i<<16;i&=0xffff;if(t!=tt) selectpage(tt);t=tt;return((int)*(p+i));}register int t,distance;int x=0,y=0,delta_x,delta_y;int incx,incy;delta_x=endx-startx;delta_y=endy-starty;if(delta_x>0) incx=1;else if(delta_x==0) incx=0;else incx=-1;if(delta_y>0) incy=1;else if(delta_y==0) incy=0;else incy=-1;if(delta_x<0) delta_x=-delta_x;if(delta_y<0) delta_y=-delta_y;if(delta_x>delta_y) distance=delta_x; else distance=delta_y;for(t=0;t<=distance+1;t++){ putpixel(startx,starty,color);x+=delta_x;y+=delta_y;if(x>distance){x-=distance;startx+=incx;}if(y>distance){y-=distance;starty+=incy;}}}{int i;for(i=startx+1;i<endx;i++){< bdsfid="159" p=""></endx;i++){<>putpixel(i,starty,color);putpixel(i,endy,color);}for(i=starty;i<=endy;i++){putpixel(startx,i,color);putpixel(endx,i,color);}}void fillbox(int startx,int starty,int endx,int endy,int color){int i,j;for(j=starty;j<=endy;j++)for(i=startx;i<=endx;i++)putpixel(i,j,color);}static void plot_circle(int x,int y,int x_center,int y_center,int color) {int startx,endx,x1,starty,endy,y1;starty=y*asp_ratio;endy=(y+1)*asp_ratio;startx=x*asp_ratio;endx=(x+1)*asp_ratio;for(x1=startx;x1<endx;++x1){< bdsfid="182" p=""></endx;++x1){<>putpixel(x1+x_center,y+y_center,color);putpixel(x1+x_center,y_center-y,color);putpixel(x_center-x1,y_center-y,color);putpixel(x_center-x1,y+y_center,color);}for(y1=starty;y1<endy;++y1){< bdsfid="189" p=""></endy;++y1){<>putpixel(y1+x_center,x+y_center,color);putpixel(y1+x_center,y_center-x,color);putpixel(x_center-y1,y_center-x,color);putpixel(x_center-y1,x+y_center,color);}}void circle(int x_center,int y_center,int radius,int color){ register int x,y,delta;y=radius;delta=3-2*radius;for(x=0;x<y;){< bdsfid="201" p=""></y;){<>plot_circle(x,y,x_center,y_center,color);if(delta<0) delta+=6+(x<<2);else{delta+=10+((x-y)<<2);y--;}x++;}x=y;if(y) plot_circle(x,y,x_center,y_center,color); }main(){int x=100,y=100,color=35; init256();box(x,y,x+100,y+100,color); circle(x+200,y+150,200,color); fillbox(200,200,350,350,color); getch();exit256();}。
c语言circle画圆函数
C语言circle画圆函数介绍在C语言中,我们可以使用数学库函数和循环结构来实现画圆的功能。
本文将详细介绍如何使用C语言编写一个画圆的函数,并提供代码示例和详细解释。
基本原理画圆的基本原理是通过计算圆上每个点的坐标,并将其绘制在屏幕上。
在C语言中,我们可以使用数学库函数来计算圆上的点的坐标,然后使用循环结构将这些点绘制出来。
代码示例下面是一个简单的C语言程序,用于实现画圆的函数:#include <stdio.h>#include <math.h>void drawCircle(int centerX, int centerY, int radius) {int x, y;for (x = centerX - radius; x <= centerX + radius; x++) {y = centerY + sqrt(radius * radius - (x - centerX) * (x - centerX));printf("(%d, %d)\n", x, y);}}函数解析该程序中的drawCircle函数接受三个参数:圆心的x坐标、圆心的y坐标和半径。
函数内部使用一个循环结构来计算圆上的点的坐标,并将其打印出来。
循环结构的起始点为圆心的x坐标减去半径,终止点为圆心的x坐标加上半径。
在每次循环中,我们使用数学库函数sqrt来计算圆上相应x坐标的y坐标。
这里使用了圆的方程y = sqrt(radius * radius - (x - centerX) * (x - centerX))。
下面是一个调用drawCircle函数的示例:int main() {int centerX = 0;int centerY = 0;int radius = 5;drawCircle(centerX, centerY, radius);return 0;}参数说明•centerX:圆心的x坐标。
CG实验1-利用C语言图形函数绘图
实验1 利用C 语言图形函数绘图1实验目的:熟悉C 语言图形功能,为今后实验打基础。
2实验要求:在CodeBlocks 环境下编写程序 3实验内容例1 利用line()函数画圆在计算机绘图中,任何曲线均可以利用line()函数绘制。
下面通过绘制一个圆说明利用line()函数绘制曲线的方法。
在圆上任取一点P(X,Y),以C 点为圆心的圆的参数方程为⎩⎨⎧==SINstR Y COSstR X ** 在计算机绘图中,屏幕左上角为坐标原点,X 坐标方向水平向右,Y 坐标方向垂直向下。
在该坐标下,设圆心C 的坐标为(X0,Y0),则圆的参数方程变为:⎩⎨⎧-=+=SINst R Y Y COSstR X X *0*0 根据圆的参数方程,利用c 语言编程绘制圆。
程序1-1.cpp 实现利用line()函数画圆。
/*1-1.cpp*/#include<graphics.h> #include<math.h> main() {int i,j,r,xx[21],yy[21],x0,y0; float st=360/20*3.14/180; x0=300;y0=250;r=200; initgraph(800,600);setbkcolor(BLUE);setcolor(YELLOW); for(i=0;i<21;i++){ xx[i]=x0+r*cos(i*st);yy[i]=y0-r*sin(i*st); } for(i=0;i<20;i++)line(xx[i],yy[i],xx[i+1],yy[i+1]); getch();closegraph(); }例2 画一个金刚石图案程序1-2.cpp绘制图1-1所示的金刚石图案。
#include<graphics.h>#include<math.h>main(){int i,j,r,xx[20],yy[20],x0,y0;float st=360/20*3.14/180;x0=300;y0=250;r=200;initgraph(800,600);setbkcolor(BLUE);setcolor(YELLOW);for(i=0;i<20;i++){ xx[i]=x0+r*cos(i*st);yy[i]=y0-r*sin(i*st); } for(i=0;i<20;i++){for(j=0;j<20;j++)line(xx[i],yy[i],xx[j],yy[j]);}getch();closegraph();}图1-1金刚石图案具体实验要求:(1)修改1-2.cpp的代码,将绘图窗口尺寸置为1024*768,背景色为黄色,前景色为红色,在实验报告中给出完整的代码和对应的运行结果截图#include<graphics.h>#include<math.h>main(){int i,j,r,xx[20],yy[20],x0,y0;float st=360/20*3.14/180;x0=300;y0=250;r=200;initgraph(1024,768);setbkcolor(YELLOW);setcolor(RED);for(i=0;i<20;i++){ xx[i]=x0+r*cos(i*st);yy[i]=y0-r*sin(i*st); }for(i=0;i<20;i++){for(j=0;j<20;j++)line(xx[i],yy[i],xx[j],yy[j]);}getch();closegraph();}(2)修改1-1.cpp的代码,改变顶点个数,使得得到的图形更逼近于正圆,在实验报告中给出完整的代码和对应的运行结果截图#include<graphics.h>#include<math.h>main(){int i,j,r,xx[51],yy[51],x0,y0;float st=360.0/50*3.14/180;x0=300;y0=250;r=200;initgraph(800,600);setbkcolor(BLUE);setcolor(YELLOW);for(i=0;i<51;i++){ xx[i]=x0+r*cos(i*st);yy[i]=y0-r*sin(i*st); }for(i=0;i<50;i++)line(xx[i],yy[i],xx[i+1],yy[i+1]);getch();closegraph();}点向各分点绘直线。
用C语言实现画图程序
一、选题背景:画图程序,通过画图中的功能绘制出美丽的图案。
二、设计思想:利用数学三角函数制作山峰和花朵出一条曲线、用画圆函数绘制太阳的形状、再进行颜色填充用绘制直线的函数来绘制比较粗的光线、用矩形函数画出矩形的边框、再画地球、直线画赤道、弧线画南北极和钟表的刻度盘。
三、流程图:四、程序清单:#include"graphics.h" /*调用图形库函数*/#include"math.h" /*调用数学函数*/#include"stdio.h" /*调用标准I/O函数*/#define PI 3.141596 /*宏定义PI字符串*/main() /*主函数*/{float i,x,y; /*定义单精度浮点型变量i,x,y*/int gdriver=DETECT,gmode,a=1; /*定义整型变量gdriver,gmode*/initgraph(&gdriver,&gmode,"d:\\tc"); /*定义变量后,初始化图形系统*/cleardevice();setbkcolor(a); /*背景颜色*/printf("\n");printf("\n"); /*C 语言图形函数*/printf("\n");printf(" the following math functions were used in the main function.\n");printf(" setbkcolor(int color);\n"); /* 背景颜色*/printf(" setcolor(int color);\n"); /* 画笔颜色*/printf(" putpexel(x,y,color);\n"); /* 画像素点*/printf(" line(x1,y1,x2,y2)\n"); /* 直线函数*/printf(" rectangle(xl,yt,xr,yb)\n");; /* 矩形函数*/printf(" arc(x,y,as,ae,r)\n"); /* 圆弧函数*/printf(" circle(x,y,r)\n"); /*圆形函数*/printf(" ellipse(x,y,as,ae,rx,ry)\n"); /* 椭圆函数*/printf("\n"); /* 按任意键开始演示*/setcolor(2);setlinestyle(0,0,3);rectangle(4,4,635,475); /*绘制矩形框*/getch();cleardevice();printf("\n"); /* 模拟手工画图*/printf("\n"); /* 函数曲线图形*/setcolor(3);setlinestyle(3,3,3);rectangle(4,4,635,475); /*绘制图纸边框*/for (i=0;i<=2*PI;i+=PI/99999){putpixel(40*i,170-21*i*sin(1.6*i),2);putpixel(40.3*i,170-22*i*sin(1.6*i),3);putpixel(40.6*i,170-23*i*sin(1.6*i),10);}for (i=0;i<=2*PI;i+=PI/99999) /*绘制花朵*/{putpixel(118-15*cos(4*i)*cos(i),160-15*cos(4*i)*sin(i),14);putpixel(118-25*cos(4*i)*cos(i),160-25*cos(4*i)*sin(i),13);putpixel(118-35*cos(4*i)*cos(i),160-35*cos(4*i)*sin(i),10);}for (i=0;i<=PI;i+=PI/99999){putpixel(320-315*cos(i),360-95*sin(i),11); /*绘制拱桥*/ putpixel(320-315*cos(i),360-96*sin(i),11); /*绘制拱桥*/ putpixel(320-315*cos(i),360-97*sin(i),11); /*绘制拱桥*/ }for (a=70;a<=570;a+=50)for (i=0;i<=PI;i+=PI/9999){putpixel(a-25*cos(i),360-40*sin(i),11); /*绘制桥*/}}for (x=0;x<=640;x+=0.001){putpixel(8*x,380-8*sin(x),9); /*绘制曲线水流*/}for (x=0;x<=600;x+=0.001){putpixel(10*x,405-10*sin(x),9); /*绘制曲线水流*/}for (x=0;x<=560;x+=0.001){putpixel(12*x,430-12*sin(x),9); /*绘制曲线水流*/}for(x=60;x<=80;x+=0.01){ellipse(270,360,180 ,0,160-x,25);}for (x=0;x<=520;x+=0.001){putpixel(8*x,455-8*sin(x),9); /*绘制曲线水流*/}setlinestyle(0,0,1);setfillstyle(1,12);fillellipse(320,60,25,25); /*绘制太阳*/for (x=280;x>=250;x-=0.0001)putpixel(x,60,12); /*绘制阳光线*/}for (x=360;x>=390;x+=0.0001){putpixel(x,60,12); /*绘制阳光线*/}for (y=24;y>=12;y-=0.0001){putpixel(320,y,12); /*绘制阳光线*/}for (y=96;y<=108;y+=0.0001){putpixel(320,y,12); /*绘制阳光线*/}setlinestyle(3,0,1);setcolor(12);for (i=0;i<=2*PI;i+=PI/12) /*绘制阳光线*/{line(320+40*cos(i),60-36*sin(i),320+70*cos(i),60-48*sin(i)); for (x=0;x<=55555;x+=0.1){y=y+x; /*延时控制*/}}setcolor(13);setlinestyle(0,0,1);rectangle(460,100,620,200); /*绘制地图框(矩形)*/ setcolor(11);setlinestyle(0,0,3);ellipse(540,150,0,360,77,48); /*绘制地球(椭圆)*/circle(540,150,46); /*绘制经线(圆形)*/ellipse(540,100,210,330,45,16); /*绘制北极圈(椭圆弧)*/ellipse(540,200,30,150,45,16); /*绘制南极圈(椭圆弧)*/setcolor(14);setlinestyle(3,0,1);line(460,150,620,150); /*绘制赤道(水平线)*/line(540,100,540,200); /*绘制经线(垂直线)*/setcolor(11); setlinestyle(0,0,1);for (i=0;i<=2*PI;i+=PI/300){putpixel(590-35*cos(i),50-35*sin(i),11); /*绘制0.1秒刻度*/}setcolor(14);setlinestyle(0,0,1);circle(590,50,2); /*绘制中心轴*/setcolor(13);setlinestyle(0,0,3);for (i=0;i<=2*PI;i+=PI/6){line(590+25*sin(i),50-25*cos(i),590+30*sin(i),50-30*cos(i));/*绘制小时*/for (x=0;x<=5555;x+=0.001){y=y+x; /*延时控制*/}getch();closegraph(); }五、主要解决问题的方法及技术关键1、主要问题及解决方法✓抛物线的画法用插补法画抛物线。
真正实现C语言绘制数学函数图像
用C语言画函数图像横纵坐标单位长度比校正(3:5)真正的余弦函数#include<math.h>#include<stdio.h>int sishewuru(float a);void main(){int n = 450;float a[500], b[500];int i,j;a[0] = b[0] = 0;for (i = 1; i < n; i++)a[i] = a[i - 1] + 0.01;b[i] = cos(a[i]);}int A[500],B[500];for (i = 0; i < n; i++){//printf("sin(%f)=%f\n", a[i], b[i]);a[i] = 100 * a[i];b[i] = 55 * b[i];A[i] = sishewuru(a[i]);B[i] = sishewuru(b[i])+60;//printf("sin(%d)=%d\n", A[i], B[i]);}for ( i = 100; i >=0; i--){for ( j = 0; j < n; j++){if (i==B[j]){printf("*");}else{printf(" ");}}printf("\n");}}int sishewuru(float a){int m;if (a-floor(a)<0.5){m = a;return m;}else{m = a + 1;return m;}}1.调节输出框大小,字符显示大小2.确定函数的定义域3.确定定义域上的步长4.计算函数值5.确定函数值放大系数6.确定定义域恰好落在显示的区间内7.确定坐标的单位长度与字符实际长度之间的换算关系8.确定打点的顺序与坐标的关系定义域在),(ππ-的正弦函数图像定义域在),(ππ-的正切函数图像定义域在),(ππ22-的倒正切函数图像#include <math.h>#include <stdio.h>int sishewuru(float a);void main() {float minx = -2*3.14,maxx = 2*3.14,dx,x[500],y[500],k;//确定定义区间int lx = 500, i,j, Y[500]; dx = (maxx - minx) / 450; x[0] = minx; y[0] = 0.1 / sin(x[1]);for (i = 1; i <lx; i++) {x[i] = x[i - 1] + dx;y[i] =0.1/sin(x[i]);}k = 0.6/ dx;//扩大系数for (i = 0; i < lx; i++) {Y[i] = sishewuru(k*y[i]);//printf("%d\n", Y[i]);}for (i = 0; i <130; i++){for (j = 0; j < lx; j++) {if (i == -Y[j]+65) { printf("*"); }else{printf(" ");}}printf("\n");} } int sishewuru(float a ) {int m;if (a -floor(a )<0.5){m = a ;return m;}else{m = a + 1;return m;} }定义域在),(ππ22-半径为π的圆#include<math.h>#include<stdio.h>int sishewuru(float a);void main(){float minx = -2*3.14,maxx = 2*3.14,dx,x[500],y[2*500],k,r=0.5*maxx;//确定定义区间int lx = 500, i,j, Y[2*500];dx = (maxx - minx) / 450;x[0] = minx;y[0] = 0.1 / sin(x[1]);for (i = 1; i <lx; i++){x[i] = x[i - 1] + dx;y[i] =sqrt(r*r-x[i]*x[i]);//确定函数表达式y[lx + i] = -1*y[i];}k = 0.6/ dx;//扩大系数for (i = 0; i < 2*lx; i++){Y[i] = sishewuru(k*y[i]);//printf("%d\n", Y[i]);}for (i = 0; i <136; i++){for (j = 0; j < lx; j++){if (i == -Y[j] + 68 || i == -Y[j+lx] + 68){printf("*");}else{printf(" ");}}printf("\n");}}int sishewuru(float a){int m;if (a-floor(a)<0.5){m = a;return m;}else{m = a + 1;return m;}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用VC++实现数学函数图形绘制Use the VC++ to realize drawing figures of mathematic functions 摘要Visual C++(以下简称VC++)是面向对象与可视化软件开发工具中比较成熟的一类。
MFC是VC++中直接由Microsoft提供的类库,它集成了大量已定义好的类,我们可以根据需要,调用相应类,或根据需要自定义类。
正是基于MFC 的这种特性,我们试图设计出具有封装性、独立性的功能模块------函数数据生成模块,函数曲线输出模块,模块之间的桥梁是由模板类CArray派生的CPoint 类数组充当的。
函数数据生成模块用来实现对函数的设置并获得采样点,数组得到采样点数据并将其传递到输出模块中。
从整体来看,实现了各程序模块的独立性,使得在函数模块中可任意添加、删除函数,可使用不同的DC和GDI,可实现不同的输出方式,整个工程在函数绘图功能上是无限扩展的。
经过反复的调试和检验,我们实现了预期目标。
我们的主要目的是尝试VC++在数学函数绘图方面的功能和应用。
这是对VC++的探索,也是对数学函数绘图多样化的尝试。
关键字数学函数图形绘制模板数组三次样条【Abstract】Visual C++ is one of the object oriented and visual software developer ,which is more mature than others . MFC is a class warehouse which is supplied by Microsoft ,and it contains a great deal of defined classes .we can transfer the corresponded class if necessary ,or give a fresh definition according our needs . Exactly based on MFC this kind of character, we try to design out the function mold which have the function to pack the class and be independent ------Mold for creating Function data, Mold for outputting the function curve, mold piece of born mold piece be sent by Cpoint Array rared by template CArray.The first mold is to make out sets for the function and get data we need which will be sent to the defined array,so now the array have the data that is to be got by the second mold.From whole project,we can see the independence of each mold,and exactly we may increase and decrease functions if necessary,we even can use different DC and GDI to realize the customed exportation method by which we can have a new view of the function curve. So, the function of the project can be extended freely.after repeatedly debugging and examining,we achieve our purpose.The most important thing we are trying is to find a way to connect the VC++ and the figures of mathmetic functions.This is not only a exploration to VC++,but also a attempt for realizing diversifing the mathmetic functions.【Key words】Mathematic functions drawingfigures template array tripline目录用VC++实现数学函数图形绘制 (1)Use the VC++ to realize drawing figures of mathematic functions (1)摘要 (1)关键字 (1)一、引言 (4)二、设计思路 (5)2.1总体结构的设计 (5)2.2基本结构的设计 (6)2.3面临的问题 (6)2.4解决问题的方法 (6)三、实现三次样条函数绘图 (10)3.1函数定义 (10)3.2边界条件 (10)3.3函数表达式 (11)3.4算法 (12)3.5程序实现 (12)3.6效果 (14)四、结论 (16)参考文献 (18)附录 (20)一、引言从事科技研究的人员常常需要解决一些复杂的数学问题,而这些数学问题的解答往往可以从它的函数图形上很直观、明了的表现出来,这时快捷方便的绘制出该数学函数的图形就显得尤为重要。
用Matlab等数学软件就可以做到这一点,但是当我们需要在我们自己的软件产品中快速简洁的绘制出众多自定义的数学函数图形时,用Matlab等数学软件就有些麻烦。
所以我们选择了用VC++来实现数学函数图形的绘制。
随着软件工程技术的不断发展,应用面向对象的编程技术已经成为当今软件开发的重要手段之一,尤其是VC++的出现,大大推进了面向对象与可视化编程技术的应用与发展。
VC++主要使用了两种方法:1.用Windows提供的Windows API函数。
2.直接使用Microsoft提供的MFC类库。
我们选用的是MFC Appwizard(exe)工程。
MFC类库是VC++中直接由Microsoft提供的一种编程资源,是对程序设计的高度抽象,它集成了大量已定义好的类,我们可以根据需要,调用相应类,或根据需要自定义有关类,使得程序员的主要精力不用放在程序设计的细节实现上,而放在程序的功能拓展上。
它允许在编程过程中自定义和扩展运用程序中的类,同时还允许对Windows API 函数进行存取,从而使运用程序能以最小的规模实现最丰富的功能,而且能提供高效率的运行代码。
更重要的是,MFC可以封装不同的类,将类封装后,形成一个功能模块。
也就是说,允许为实现功能模块而将不同的类封装。
我们选择了用Visual C++来实现数学函数图形的绘制。
还有以下几种考虑:1、VC++的良好特性促使我们去了解,熟悉和开发;2、四年来计算数学的学习让我们产生了对一些数学算法进行深一步的实践探索;3、用VC++来实现函数的绘图功能是很有优势的。
VC++的绘图过程直接引用Windows系统本身资源,绘图速度很快,不同的映像模式还可以确保图形的准确;其可视化的界面设置简单明了;4、对图形的绘制和算法的研究是无止境的,很多时候需要更具体、更详尽和易懂的算法设计,这需要选取一种好的语言自己编写。
VC++基于C++语言,易懂且容易掌握。
MFC类库的特性无限扩展了VC++的功能,用它来实现复杂多变的数学算法无疑是一个好的选择。
VC++运用对象、类、消息传递、封装等概念来构造系统,要实现各种各样图形的绘制,我们可以将函数看作对象,将各种函数封装起来,形成不同的类,组成函数模块。
将处理数据和输出图形定义在不同的模块中,而模块之间的接口则是通过用VC++的类数组模块定义的CPoint类数组实现的。
二、设计思路2.1总体结构的设计正是以上了解使我们得出了这样一条编程思路:函数数据生成模块,函数曲线输出模块,中间媒介由CPoint类数组构成。
函数数据生成模块是实现对函数的设置:包括参数设置,自变量设置,数据输入,并从算法中得到采样点,再将采样点传给CPoint类数组。
函数曲线输出模块则要从CPoint类数组中得到采样点,在已定义好的输出环境中以描点连线的方式绘制图形。
(如图1.1)(图1.1)这样的设计既体现了模块间的独立性,也体现了数组在两个模块间的桥梁关系。
由于对函数的设置也是独立的,选择不同的函数会出现与之相适应的设置,绘出相应的函数图形,所以各函数间也是互相独立的,对整个工程的其他部分是没有影响的。
我们以sin,cos作为开始的尝试,主要为熟悉VC++的开发环境,构造出良好的绘图环境,再以三次样条函数为重点实现对算法的分析,充分利用MFC的优势,达到目的。
2.2基本结构的设计1.将所要表达的对象封装。
对函数的属性主要是参数设置-----一般用对话框来实现;对函数的服务即函数算法用具体函数来表达,再将具体的函数一个个的封装到为他们创建的函数模块中,使它们完全独立开来;2.我们用函数数据生成模块得到了数据-----采样点,为实现合理的函数绘图形式,对采样点要做必要的处理后,放入到类数组中;3.函数曲线输出模块专门负责营造输出氛围:用画笔还是画刷,用多文档输出还是单文档,用那一种映像模式,界面看起来是否美观。
当然,最终是获得数组中的数据,将它们放到适合的坐标轴上,随即连线成图。
看似独立的三个部分实际上是相互牵制和彼此照顾的,采样点受到模板数组的影响,通常不同函数得到采样点在放入模板数组前所作的处理也不同。
2.3面临的问题我们面临的问题有技术方面的和对每个函数的具体设置,有如下几个方面:1.函数参数设置,自变量的范围,函数的具体算法;2.输出设置:绘图方式,坐标的建立、设置,图形的缩放;3.对数组模板类的引用;4.对误差的控制。
2.4解决问题的方法1、函数数据生成模块方面,我们利用对话框来完成对自变量范围、各种参数的设置,这使得对函数特性控制更明了和简单。
(如图1.2)(图1.2)函数参数设置对话框所要关注的是采样点。
采样点通过算法得到后,需要符合类数组对数据的要求,考虑到屏幕坐标是整型值,因此,所定义的类中的分量类型也应是整型,而采样点的数据类型是多样的,所以输入前,需要对它们进行必要的处理,而又由于受输出模块中映像模式的影响,输出时也有必要对从数组中得到的数据进行处理。