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

📄 demowindow1.cpp

📁 大学物理创新平台
💻 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 + -