📄 semantic.cpp
字号:
//----------------------------semantic.cpp------------------------------
#include "semantics.h"
extern double
Parameter,
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);
static void CalcCoord(struct ExprNode * Hor_Exp,
struct ExprNode * Ver_Exp,
double & Hor_x,
double & Ver_y);
//------------------出错处理
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);
}
void DrawPixel(unsigned long x,unsigned long y)
{
#ifdef _VC_COMPILER
SetPixel(hDC,x,y,red);
#endif;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -