📄 demowindow1.cpp
字号:
// demowindow.cpp : implementation file
#include "stdafx.h"
#include "demowindow.h"
#include "dlldef.h"
#include "resource.h"
#include <math.h>
#include "string.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define ROTATE_LEFT_RIGHT 1
#define ROTATE_UP_DOWN 2
extern int S_ViewMode;
extern int S_demoID;
extern bool S_IsDemo;
float V,X,P_omega,P_size,m_sita;
/////////////////////////////////////////////////////////////////////////////
// demowindow
demowindow::demowindow()
{
S_ViewMode=VIEWMODE1;
P_direction=1;
S_special_function1_pressed=0;
S_special_function2_pressed=0;
//m_sita=0;
//P_size=20;
}
demowindow::~demowindow()
{
DeInitWnd(0);
}
BEGIN_MESSAGE_MAP(demowindow, CStatic)
//{{AFX_MSG_MAP(demowindow)
ON_WM_PAINT()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// demowindow message handlers
void demowindow::S_Begin()
{
S_Step=0;
S_InitGraph();
}
void demowindow::OnPaint()
{
static int IsInit=0;
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
if(IsInit==0)
{
CRect rect;
GetClientRect(&rect);
InitGLWnd(dc.m_hDC,S_ViewMode,rect.Width(),rect.Height(),30,0);
BeginGL(dc.m_hDC,0);
S_Step=0;
S_switchpic();
EndGL(dc.m_hDC);
IsInit=1;
}
else
{
BeginGL(dc.m_hDC,0);
S_switchpic();
EndGL(dc.m_hDC);
}
// Do not call CStatic::OnPaint() for painting messages
}
void demowindow::S_InitGraph()
{
/* switch(S_demoID) // 为不同演示的时间初值
{
case 1:
break;
case 2:
break;
case 3:
break;
} */
Invalidate(false);
}
void demowindow::S_Demo()
{
S_Step++;
/* if(S_Step>2000)S_Step-=20000;
if(S_Step<0)S_Step+=20000;*/
m_sita-=10;
if(m_sita>360)m_sita-=360;
if(m_sita<0)m_sita+=360;
Invalidate(false);
}
void demowindow::S_SetParameter(float parameter1,float parameter2,float parameter3,float parameter4,float parameter5)
{
P_radius =parameter1;
P_omega=parameter2;
V=parameter3;
X=parameter4;
P_size=parameter5;
}
void demowindow::S_ChangeParameter(int parameterID, int value)
{
switch(S_demoID)
{
case 1:
switch(parameterID)
{
case IDC_PARAMETER1:
P_radius=value;
break;
case IDC_PARAMETER2:
P_omega=value;
break;
case IDC_PARAMETER3:
V=value;
break;
case IDC_PARAMETER4:
X=value;
break;
case IDC_PARAMETER5:
P_size=value;
break;
}
break;
case 2:
switch(parameterID)
{
case IDC_PARAMETER1:
P_radius=value;
break;
case IDC_PARAMETER2:
P_omega=value;
break;
case IDC_PARAMETER3:
V=value;
break;
case IDC_PARAMETER4:
X=value;
break;
case IDC_PARAMETER5:
break;
}
break;
}
}
void demowindow::S_GetParameter(float *parameter1, float *parameter2, float *parameter3, float *parameter4, float *parameter5)
{
switch(S_demoID)
{
case 1:
*parameter1=P_radius;
*parameter2=P_omega;
*parameter3=V;
*parameter4=X;
break;
case 2:
*parameter1=P_radius;
*parameter2=P_omega;
*parameter3=V;
*parameter4=X;
break;
}
}
void demowindow::S_switchpic()
{
switch(S_demoID)
{
case 1:S_Picture1();break;
case 2:S_Picture2();break;
case 3:S_Picture3();break;
}
}
CString demowindow::S_OnSpecialFunction1(int inittext,int *pressed)
{
CString str;
str.Format("");
if(S_special_function1_pressed)S_special_function1_pressed=0;
else S_special_function1_pressed=1;
if(inittext)S_special_function1_pressed=0;
switch(S_demoID)
{
case 1:
str.Format("留影");
break;
}
*pressed=S_special_function1_pressed;
return str;
}
CString demowindow::S_OnSpecialFunction2(int inittext,int *pressed)
{
CString str;
str.Format("");
if(S_special_function2_pressed)S_special_function2_pressed=0;
else S_special_function2_pressed=1;
if(inittext)S_special_function2_pressed=0;
switch(S_demoID)
{
case 1:
str.Format("轨迹");
break;
case 2:
// if(S_special_function2_pressed)str.Format("显示角\n动量合成");
// else str.Format("关闭角\n动量合成");
break;
}
*pressed=S_special_function2_pressed;
return str;
}
CString demowindow::S_OnSpecialFunction3(int inittext,int *pressed)
{
CString str;
str.Format("");
if(S_special_function3_pressed)S_special_function3_pressed=0;
else S_special_function3_pressed=1;
if(inittext)S_special_function3_pressed=0;
switch(S_demoID)
{
case 1:
str.Format("位置矢");
break;
case 2:
// if(S_special_function3_pressed)str.Format("显示角\n动量合成");
// else str.Format("关闭角\n动量合成");
break;
}
*pressed=S_special_function3_pressed;
return str;
}
CString demowindow::S_OnSpecialFunction4(int inittext,int *pressed)
{
CString str;
str.Format("");
if(S_special_function4_pressed)S_special_function4_pressed=0;
else S_special_function4_pressed=1;
if(inittext)S_special_function4_pressed=0;
switch(S_demoID)
{
case 1:
// if(S_special_function4_pressed)str.Format("显示\n重力矩");
// else str.Format("关闭\n重力矩");
break;
case 2:
// if(S_special_function4_pressed)str.Format("显示角\n动量合成");
// else str.Format("关闭角\n动量合成");
break;
}
*pressed=S_special_function4_pressed;
return str;
}
void demowindow::m_setpoint(POINT3F *p, float x, float y, float z)
{
p[0].x=x;
p[0].y=y;
p[0].z=z;
}
void demowindow::m_setcolor(RGB *color, float r, float g, float b)
{
color[0].r=r;
color[0].g=g;
color[0].b=b;
}
void demowindow::S_Picture1()
{
//变量定义与赋值
POINT3F p,p1;
RGB color;
DIRECT direction,direction1,direction2;
SetLineWidth(1);
m_setpoint(&p1,0,0,0);
m_setcolor(&color,0,0,0);
direction.alpha =0;
direction.beta=0;
direction1.alpha =90;
direction1.beta=0;
direction2.alpha =90;
direction2.beta=90;
//结果输出
PDrawArrow1(p1,direction1,2.5*40,10.,2.,color);
PDrawArrow1(p1,direction,1.5*40,10,2.,color);
PDrawArrow1(p1,direction2,2.5*40,10,2.,color);
m_setpoint(&p,0.1*S_Step,0,0);
m_setcolor(&color,255,0,0);
if(S_special_function1_pressed)
CDrawBall(p,direction,S_Step,P_radius,color,255,55,50,GLU_FILL,false);
else
CDrawBall(p,direction,S_Step,P_radius,color,255,20,20,GLU_LINE,false);
}
void demowindow::S_Picture2()
{
RGB color,colorg,colorb,colory;
DIRECT direction;
int al,aa1;
int j,m;
float omg,sita,wavelength,velocity;
m_setcolor(&color,0,0,0);
m_setcolor(&colory,100,0,200);
float t;
SetLineWidth(2.0);
POINT3F p1,p2,p3,p4;
m_setpoint(&p1,-120,0,0);
m_setpoint(&p2,125,0,0);
m_setpoint(&p3,-120,-70,0);
m_setpoint(&p4,-120,70,0);
PDrawArrow(p1,p2,5,2,color);
PDrawArrow(p3,p4,5,2,color);//坐标轴
POINT3F p[241],pp[41],pe[41];
m=40;
t=S_Step/20;
omg=P_radius/2;
aa1=P_omega*4;
sita=-3.14159/2;
velocity=V*31;
wavelength=2*3.14159*velocity/omg;
m_setcolor(&colorb,0,120,255);
m_setcolor(&colorg,155,150,180);
EnableLight();
SetLineWidth(3.0);
int i;
for(i=0;i<=240;i++)
{
j=i/6;
p[i].x=-120+i; p[i].y=0; p[i].z=0;
pp[j].x=6*j-120; pp[j].y=0; pp[j].z=0;
pe[j].x=6*j-120; pe[j].y=0; pe[j].z=0;
if (i<=velocity*t)
{p[i].y=aa1*cos(t*omg-2*3.14159*i/wavelength+sita);
pp[j].y=aa1*cos(t*omg-2*3.14159*6*j/wavelength+sita);
pe[j].y=pp[j].y-aa1*omg*sin(t*omg-2*3.14159*6*j/wavelength+sita)/3;
}
CDrawBalls(&pp[j],1, 2, colorb);
PDrawArrow(pp[j],pe[j],5, 1, colorg);
}
DisableLight();
CDrawCurve(&p[0],241,colorg);
}
void demowindow::S_Picture3()
{
}
void demowindow::S_RefreshPic()
{
Invalidate(false);
}
void demowindow::OnSize(UINT nType, int cx, int cy)
{
CStatic::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
DeInitWnd(0);
HWND hwnd=GetSafeHwnd();
HDC hdc=::GetDC(hwnd);
InitGLWnd(hdc,S_ViewMode,cx,cy,10,0);
Invalidate(false);
}
int demowindow::S_OpenFile(FILE *fp)
{
char temp[255];
fscanf(fp,"%s\n",temp); // 注释行
fscanf(fp,"%s\n",temp); // 参数提示行
fscanf(fp,"%f\n",&P_radius); // 参数1的数值
fscanf(fp,"%s\n",temp); // 参数提示行
fscanf(fp,"%d\n",&P_direction); // 参数2的数值
fscanf(fp,"%s\n",temp); // 参数提示行
fscanf(fp,"%d",&P_omega); // 参数2的数值
fclose(fp);
return 1;
}
void demowindow::S_SaveFile(FILE *fp)
{
fprintf(fp,"%%对称性演示参数文件%%\n");
fprintf(fp,"半径\n%f\n", P_radius);
fprintf(fp,"转动方向\n%d\n",P_direction); // 辅助物理参数----转动方向
fprintf(fp,"转速\n%d", P_omega); // 辅助物理参数----转速
fclose(fp);
}
void demowindow::S_ButtonDown()
{
}
void demowindow::S_ButtonUp()
{
}
void demowindow::S_ButtonLeft()
{
P_direction=-1;
}
void demowindow::S_ButtonRight()
{
P_direction=1;
}
void demowindow::S_ButtonResume()
{
}
void demowindow::m_drawspeed(float time)
{
RGB color;
DIRECT direction;
POINT3F pos;
float v_x,v_y,v,angle_x;
float r_x,r_y;
float angle0;
angle0=3.1415926*P_radius/180.;
v_x=P_omega*cos(angle0);
v_y=P_omega*sin(angle0)-9.8*time;
v=sqrt(pow(v_x,2)+pow(v_y,2));
float angle_v=acos(v_x/v); // 速度与x轴夹角
if(v_y<0)angle_v=-angle_v;
r_x=V+P_omega*cos(angle0)*time;
r_y=X+P_omega*sin(angle0)*time-4.9*time*time;
m_setpoint(&pos,r_x,r_y,1);
m_setcolor(&color,255,0,0);
direction.alpha=90;
direction.beta=180.*angle_v/3.1415926;
PDrawArrow1(pos,direction,v,5,2.5,color); // 画速度矢量
}
void demowindow::m_drawdisplacement(float time)
{
POINT3F p1,p2;
float angle0=3.1415926*P_radius/180.;
RGB color;
m_setpoint(&p1,0,0,1);
m_setpoint(&p2,V+P_omega*cos(angle0)*time,X+P_omega*sin(angle0)*time-4.9*time*time,1);
m_setpoint(&p1,0,0,1);
m_setcolor(&color,0,128,255);
PDrawArrow(p1,p2,5,2.5,color); // 画位矢
}
void demowindow::m_drawaxes()
{
POINT3F p1,p2;
RGB color;
m_setcolor(&color,0,0,255);
m_setpoint(&p1,0,0,1);
m_setpoint(&p2,90,0,1);
PDrawArrow(p1,p2,5,2.5,color);
m_setpoint(&p2,0,90,1);
PDrawArrow(p1,p2,5,2.5,color);
}
void demowindow::S_ResumePic()
{
S_Step=0;
m_sita=0;
Invalidate(false);
}
CString demowindow::S_RateOfParameter1(float *rate)
{
CString type="整数"; // 或 "小数"
*rate=1;
return type;
}
CString demowindow::S_RateOfParameter2(float *rate)
{
CString type="整数";
*rate=1;
return type;
}
CString demowindow::S_RateOfParameter3(float *rate)
{
CString type="整数";
*rate=1;
return type;
}
CString demowindow::S_RateOfParameter4(float *rate)
{
CString type="小数";
*rate=1;
return type;
}
CString demowindow::S_RateOfParameter5(float *rate)
{
CString type="整数";
*rate=1;
return type;
}
void demowindow::S_ModifyParameter()
{
}
void demowindow::S_SaveData(char *DataFilePath)
{
}
void demowindow::S_backward()
{
}
void demowindow::S_forward()
{
}
void demowindow::S_LeftButtonDown(CPoint point)
{
}
void demowindow::S_LeftButtonUp(CPoint point)
{
}
void demowindow::S_LeftButtonDblClk(CPoint point)
{
}
void demowindow::S_RightButtonDown(CPoint point)
{
}
void demowindow::S_RightButtonUp(CPoint point)
{
}
void demowindow::S_RightButtonDblClk(CPoint point)
{
}
void demowindow::S_MouseMove(CPoint point)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -