⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 semantic.cpp

📁 简单绘图语言
💻 CPP
字号:
#include "semantic.h"
//#include <windows.h>
//#include <windowsx.h>
//#include <windef.h>
//#include <wingdi.h>

extern double
     Parameter,                  //参数T的存储空间
	 Origin_x,Origin_y,          // 横、纵平移距离
	 Scale_x,Scale_y,            //横纵比例因子
	 Rot_angle;                  //旋转角度

double GetExprValue(struct ExprNode* root);      //获得表达式的值
void DrawPixel(unsigned long x,unsigned long y);//绘制一个点
void DrawLoop(double Start,                     //绘制图形
			  double End,
			  double Step,
			  struct ExprNode* HorPtr,
              struct ExprNode* VerPtr);
void DelExprTree(struct ExprNode* root) ;        //删除一个语法树

//----------------出错处理
static void Errmsg(char *string){exit(1);}

//----------------计算被绘制点的坐标
static void CalcCoord(struct ExprNode* Hor_Exp,
					  struct ExprNode* Ver_Exp,
					  double &Hor_x,
					  double &Ver_y)
{
	double HorCord, VerCord, Hor_tmp;

	//计算表达式的值,得到点的原始坐标
	HorCord = GetExprValue(Hor_Exp);
	VerCord = GetExprValue(Ver_Exp);
	//进行比例变换
	HorCord *= Scale_x;
	VerCord *= Scale_y;
	//进行旋转变换
	Hor_tmp = HorCord*cos(Rot_angle)+VerCord*sin(Rot_angle);
	VerCord = VerCord*cos(Rot_angle)-HorCord*sin(Rot_angle);
	HorCord = Hor_tmp;
	//进行平移变换
	HorCord += Origin_x;
	VerCord += Origin_y;
	//返回变换后点的坐标
	Hor_x = HorCord;
	Ver_y = VerCord;
}

//-------------循环绘制点坐标
void DrawLoop(double Start,
			  double End,
			  double Step,
			  struct ExprNode* HorPtr,
			  struct ExprNode* VerPtr)
{
	extern double Parameter;
	double x,y;
	for(Parameter =Start;Parameter<=End;Parameter+=Step)
	{
		CalcCoord(HorPtr,VerPtr,x,y);
		DrawPixel((unsigned long)x,(unsigned long)y);
	}
}

//--------------计算表达式的值
double GetExprValue(struct ExprNode* root)
{
	if(root==NULL)return 0.0;
	switch(root->OpCode)
	{
	case PLUS:
		return GetExprValue(root->Content.CaseOperator.Left)+
			          GetExprValue(root->Content.CaseOperator.Right);
	case MINUS:
		return GetExprValue(root->Content.CaseOperator.Left)-
			          GetExprValue(root->Content.CaseOperator.Right);
	case MUL:
		return GetExprValue(root->Content.CaseOperator.Left)*
			          GetExprValue(root->Content.CaseOperator.Right);
	case DIV:
		return GetExprValue(root->Content.CaseOperator.Left)/
			          GetExprValue(root->Content.CaseOperator.Right);
	case POWER:
		return pow(GetExprValue(root->Content.CaseOperator.Left),
			          GetExprValue(root->Content.CaseOperator.Right));
	case FUNC:
		return (*root->Content.CaseFunc.MathFuncPtr)
			          (GetExprValue(root->Content.CaseFunc.Child));
	case CONST_ID:
		return root->Content.CaseConst;
	case T:
		return *(root->Content.CaseParmPtr);
	default:
		return 0.0;
	}
}

//---------------删除一棵语法树
void DelExprTree(struct ExprNode* root)
{
	if(root==NULL)return;
	switch(root->OpCode)
	{
	case PLUS:                                //两个孩子的内部节点
	case MINUS:
	case MUL:
	case DIV:
	case POWER:
		DelExprTree(root->Content.CaseOperator.Left);
		DelExprTree(root->Content.CaseOperator.Right);
		break;
	case FUNC:                                //一个孩子的内部节点
		DelExprTree(root->Content.CaseFunc.Child);
		break;
	default:                                  //叶子节点
		break;
	}
	delete(root);                             //删除节点
}

#ifdef _BC_COMPILER
int InGraphMode = 0;
int InitGraph(void)
{
	int gd = DETECT,gm;
	if(InGraphMode) return 0;
	registerbgdriver(EGAVGA_driver);
	initgraph(&gd,&gm,"");
	setcolor(-1);
	InGraphMode = 1;
	return 1;
}

void CloseGraph(void)
{
	if(!InGraphMode)return;
	getch();
	closegraph();
	InGraphMode = 0;
}
#endif

//------------------绘制一个点
void DrawPixel(unsigned long x,unsigned long y)
{
#ifdef _VC_COMPILER
   	SetPixel(hDC,x,y,black);
#endif;

#ifdef _BC_COMPILER
	Putpixel(x,y,white);
#endif
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -