目录

函数图像生成器
1.直角坐标系
2.极坐标系
3.参数方程
a.角度(圆锥曲线)
b.距离(直线)


  在学习编程过程中,我们可能会遇见十分复杂的函数,因此我们需要强大的工具来辅助分析。这篇文章我们来深入讨论如何生成各种函数以及曲线方程的图像。

  为了清晰简洁,我们采用头文件与源文件相结合的方式编译。

  且三类图像生成器,使用同一个头文件辅助生成图像。

  头文件:

#ifndef _SLX_H_
#define _SLX_H_
#include<stdio.h>
#include<math.h>
#include<graphics.h>
#include<stdlib.h>
extern double p;//引用源文件中的外部变量(放大倍数)
/*说明 我们需要将原函数等比例放缩呈现在电脑频幕上,经测试 50是一个适中的放缩倍数*/
void xian(void)
{
	/*平面直角坐标系*/
	line(500, 0, 500, 1000);//纵轴
	line(0, 500, 1000, 500);//横轴
	line(500, 0, 480, 20);//纵轴箭头
	line(500, 0, 520, 20);
	line(1000, 500, 980, 480);//横轴箭头
	line(1000, 500, 980, 520);
	outtextxy(970, 520, 'x');
	outtextxy(470, 20, 'y');
	int i = -100;
	double j;//中间变量
	/*以下代码用于显示数轴数字*/
	for (; i <= 100; i++)
	{
		 j = i * p;
		 char a[10];
		 sprintf_s(a, "%d", i);
		line(j + 500, 500, j + 500, 490);
		if (i == 0)
		{
			;
		}
		else
		{
			outtextxy(j + 500, 510, a);
		}
	}
	i = -100;
	for (; i <= 100; i++)
	{
		double j = i * p;
		char b[10];
		sprintf_s(b, "%d", i);
		line(500,500-j,510,500-j);
		if (i == 0)
		{
			;
		}
		else
		{
			outtextxy(510, 500 - j, b);
		}
	}
}
#endif

 1.直角坐标系

  以下操作均在直角坐标系下进行

  

#include<stdio.h>
#include<math.h>
#include<graphics.h>//画图函数头文件
#include<stdlib.h>
#include"slx.h"//自己的头文件
double p = 50;//图像放大倍数(50为宜)
int main(void)
{ 
	initgraph(1000, 1000);//画图窗口
	setcolor(GREEN);//线颜色
	xian();//显示平面直角坐标系
	double x, y;//正常坐标系下 x y
	double m, n;//定义域
	double a, b;//放大后的x y
	printf("请输入定义域的左右端点值:\n");
	scanf_s("%lf %lf", &m, &n);
	m = m * p;//定义域扩大
	n = n * p;
	if (m >= n)//防止错误输入
	{
		printf("ERROR");
		return 0;
	}
	float i = m;
	float e =exp(-6);//移位变量
	for (; i <= n; i=i+e)
	{
		x = i;
		a = x;//存贮x的值
		x = x / p;//放缩
		y =(exp(x)-exp(-x))/2; //函数 以双曲正弦为例
		b = y * p;//放缩
		setlinestyle(PS_SOLID,3);//设置画线样式 实线 宽度为三个像素
		line(500 + a, 500 - b, 500 + a, 500 - b);//化线打点
	}
	system("pause");
	closegraph();
	return 0;
}

若定义域出现错误,会出现如下结果。

cd8428524ed048029620ab1a461a5377.png

 若正确 以[-10,10] 为例

会正确显示函数图像,以下是双曲正弦图像,函数可以在代码中修改,我们输入定义域端点值。

f(x)=(exp(x)-exp(-x))/2 定义域[-10,10]

9ec3652034dc46608131f127c9abfcfe.png

 f(x)=(0.64 * sqrt(fabs(x)) - 0.8 + pow(1.2,fabs(x)) * cos(200 * x)) * sqrt(cos(x))

 定义域[-pi/2,pi/2]

af9833dd6ef44bc89c5d1c81d6b396d6.png

 2.极坐标系

我们更改头文件

#ifndef _SLX_H_
#define _SLX_H_
#include<stdio.h>
#include<math.h>
#include<graphics.h>
#include<stdlib.h>
extern double p;
void xian(void)
{
	/*极坐标系*/
	line(500, 500, 1000, 500);//横轴
	line(1000, 500, 980, 480);//横轴箭头
	line(1000, 500, 980, 520);
	outtextxy(970, 520, 'x');
	int i =0;
	double j;//中间变量
	/*以下代码用于显示数轴数字*/
	for (; i <= 100; i++)
	{
		 j = i * p;
		 char a[10];
		 sprintf_s(a, "%d", i);
		line(j + 500, 500, j + 500, 490);
			outtextxy(j + 500, 510, a);
	}
}
#endif

源文件

#include<stdio.h>
#include<math.h>
#include<graphics.h>//画图函数头文件
#include<stdlib.h>
#include"slx.h"//自己的头文件
double p = 50;//图像放大倍数(50为宜)
int main(void)
{
	initgraph(1000, 1000);//画图窗口
	setcolor(GREEN);//线颜色
	xian();//显示平面直角坐标系
	double rou, xite;
	double x, y;
	double k;
	printf("请输入[0,k*pi]中的k\n");
	scanf_s("%lf", &k);
	double m=0, n=k*3.1415926;
	float i = m;
	float e = exp(-6);//移位变量
	for (; i <= n; i = i + e)
	{
		xite = i;
		rou =0.1*xite;  //极坐标方程
		rou = rou * p;
		x = rou * cos(xite);
		y = rou * sin(xite);
		setlinestyle(PS_SOLID, 3);//设置画线样式 实线 宽度为三个像素
		line(500 + x, 500 - y, 500 + x, 500 - y);//化线打点
	}
	system("pause");
	closegraph();
	return 0;
}

 以螺旋线为例(函数可在代码中更改)

我们输入k为30

图像如下

f740790b25554606adaaf9e384ebf7ac.png

 3.参数方程(直角坐标系下)

我们改回原来的头文件

#ifndef _SLX_H_
#define _SLX_H_
#include<stdio.h>
#include<math.h>
#include<graphics.h>
#include<stdlib.h>
extern double p;
void xian(void)
{
	line(500, 0, 500, 1000);//平面直角坐标系
	line(0, 500, 1000, 500);
	line(500, 0, 480, 20);
	line(500, 0, 520, 20);
	line(1000, 500, 980, 480);
	line(1000, 500, 980, 520);
	outtextxy(480, 520, 'o');
	outtextxy(970, 520, 'x');
	outtextxy(470, 20, 'y');
	int i = -100;
	double j;
	for (; i <= 100; i++)
	{
		 j = i * p;
		 char a[10];
		 sprintf_s(a, "%d", i);
		line(j + 500, 500, j + 500, 490);
		if (i == 0)
		{
			;
		}
		else
		{
			outtextxy(j + 500, 510, a);
		}
	}
	i = -100;
	for (; i <= 100; i++)
	{
		double j = i * p;
		char b[10];
		sprintf_s(b, "%d", i);
		line(500,500-j,510,500-j);
		if (i == 0)
		{
			;
		}
		else
		{
			outtextxy(510, 500 - j, b);
		}
	}
}
#endif

a.角度

#include<stdio.h>
#include<math.h>
#include<graphics.h>//画图函数头文件
#include<stdlib.h>
#include"slx.h"//自己的头文件
double p = 50;//图像放大倍数(50为宜)
int main(void)
{
	initgraph(1000, 1000);//画图窗口
	setcolor(GREEN);//线颜色
	xian();//显示平面直角坐标系
	double x, y;
	double xite;
	double k;
	printf("请输入[0,k*pi]中的k\n");
	scanf_s("%lf", &k);
	double m = 0, n = k * 3.1415926;
	float i = m;
	float e = exp(-6);//移位变量
	for (; i <= n; i = i + e)
	{
		xite = i;
		x = 4*cos(xite);//参数方程
		y = 3*sin(xite);
		x = x * p;
		y = y * p;
		setlinestyle(PS_SOLID, 3);//设置画线样式 实线 宽度为三个像素
		line(500 + x, 500 - y, 500 + x, 500 - y);//化线打点
	}
	system("pause");
	closegraph();
	return 0;
}

以椭圆x*x/16+y*y/9=1为例

输入2 图形如下

2654b91571a549f3835262aefd6833b8.png

 函数可在代码中更改

b.距离 t

#include<stdio.h>
#include<math.h>
#include<graphics.h>//画图函数头文件
#include<stdlib.h>
#include"slx.h"//自己的头文件
double p = 50;//图像放大倍数(50为宜)
int main(void)
{
	initgraph(1000, 1000);//画图窗口
	setcolor(GREEN);//线颜色
	xian();//显示平面直角坐标系
	double x, y;
	double x1, y1;
	double xite;
	printf("请输入线过点以及偏转角k*pi中的k以及定义域的左右端点:\n");
	scanf_s("%lf %lf", &x1, &y1);
	scanf_s("%lf", &xite);
	double t;
	double m , n ;
	scanf_s("%lf %lf", &m, &n);
	float i = m;
	float e = exp(-6);//移位变量
	for (; i <= n; i = i + e)
	{
		t = i;
		x = x1+t*cos(xite*3.1415926);
		y = y1 + t*sin(xite*3.1415926);
		x = x * p;
		y = y * p;
		setlinestyle(PS_SOLID, 3);//设置画线样式 实线 宽度为三个像素
		line(500 + x, 500 - y, 500 + x, 500 - y);//化线打点
	}
	system("pause");
	closegraph();
	return 0;
}

例如 输入 2 1 0.25 -100 100

显示如下

b33323549ddc43a9b53841b833410963.png

   总结:以上就是函数图像生成器的简述,读者可以自由更改代码中的数据来达到自己的需求,希望以上的内容对你的生活和学习有所帮助。

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐