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

📄 fastrbfview.cpp

📁 快速fft变换的c实现
💻 CPP
字号:
// FastRBFView.cpp : implementation of the CFastRBFView class
//

#include "stdafx.h"
#include "FastRBF.h"

#include "FastRBFDoc.h"
#include "FastRBFView.h"
#include "Mainfrm.h"
#include <math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CFastRBFView

IMPLEMENT_DYNCREATE(CFastRBFView, CView)

BEGIN_MESSAGE_MAP(CFastRBFView, CView)
	//{{AFX_MSG_MAP(CFastRBFView)
	ON_WM_CREATE()
	ON_WM_KEYDOWN()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_WM_MOUSEWHEEL()
	ON_WM_RBUTTONDOWN()
	ON_WM_RBUTTONUP()
	ON_WM_SIZE()
	ON_WM_PAINT()
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFastRBFView construction/destruction

CFastRBFView::CFastRBFView()
{
	// TODO: add construction code here
	m_dViewPort[0] = 26;
	m_dViewPort[1] = -48;
	m_dViewPort[2] = 40;

	m_dCenter[0] = 0.0;
	m_dCenter[1] = 0.0;
	m_dCenter[2] = 0.0;

	m_fRotateX = 0;
	m_fRotateY = -3; //-157; //60; //-33; //76;
	m_fRotateZ = 122; //116; //29; //242; //23;

	m_fViewAngle = 22.5;

	m_bLButtonDown = FALSE;
	m_bRButtonDown = FALSE;

	m_fShiftX = 0;
	m_fShiftY = 0;
	m_fShiftZ = 0;
}

CFastRBFView::~CFastRBFView()
{
}

BOOL CFastRBFView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	cs.style |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CFastRBFView drawing

void CFastRBFView::OnDraw(CDC* pDC)
{
	CFastRBFDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CFastRBFView diagnostics

#ifdef _DEBUG
void CFastRBFView::AssertValid() const
{
	CView::AssertValid();
}

void CFastRBFView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CFastRBFDoc* CFastRBFView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFastRBFDoc)));
	return (CFastRBFDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CFastRBFView message handlers

int CFastRBFView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	PIXELFORMATDESCRIPTOR pfd =
	{
		sizeof(PIXELFORMATDESCRIPTOR),
		1,
		PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
		PFD_TYPE_RGBA,
		16,
		0,0,0,0,0,0,
		0,0,0,0,0,0,0,
		32,
		0,0,
		PFD_MAIN_PLANE,
		0,
		0,0,0
	};

	HWND hWnd = GetSafeHwnd();
	HDC  hDC = ::GetDC(hWnd);
//	m_hRC = wglCreateContext(hDC);
//	CClientDC  clientDC(this);

	int pixelFormat = ChoosePixelFormat(hDC, &pfd);
	if(!SetPixelFormat(hDC, pixelFormat, &pfd))
		return -1;

	m_hRC = wglCreateContext(hDC);

	wglMakeCurrent(hDC,m_hRC);
	InitOpenGL();
	wglMakeCurrent(hDC,NULL);

	return 0;
}

void CFastRBFView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	if(nChar==VK_ESCAPE) 
	{//如果按的键为Esc键
		//获取主框架窗口的指针
		CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
		//调用主窗口类的自定义函数 EndFullScreen, 便可退出全屏显示状态
		pFrame->EndFullScreen();
	}

	switch(nChar)
	{
	case VK_UP:
		m_fShiftZ += 5;
		break;
	case VK_DOWN:
		m_fShiftZ -= 5;
		break;
	case VK_RIGHT:
		m_fShiftX += 5;
		break;
	case VK_LEFT:
		m_fShiftX -= 5;
		break;
	case 190:
		m_fShiftY += 5;
		break;
	case 188:
		m_fShiftY -= 5;
		break;
	}
	OnPaint();
	
	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CFastRBFView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_iOldX = point.x;
	m_iOldY = point.y;
	m_bLButtonDown = TRUE;
	CView::OnLButtonDown(nFlags, point);
}

void CFastRBFView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_bLButtonDown = FALSE;
	CView::OnLButtonUp(nFlags, point);
}

void CFastRBFView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_bLButtonDown)
	{
		int nx = point.x;
		int ny = point.y;
		
		m_fRotateZ += (nx - m_iOldX)/3;
		m_fRotateY += (ny - m_iOldY)/3;
		m_iOldX = nx;
		m_iOldY = ny;
		OnPaint();
	}
	else if(m_bRButtonDown)
	{
		int nx = point.x;
		int ny = point.y;

		m_fViewAngle += (ny - m_iOldY)/20.0f;
		m_iOldX = nx;
		m_iOldY = ny;

		RECT rect;
		GetClientRect(&rect);
		OnSize(SIZE_RESTORED, rect.right, rect.bottom);
		OnPaint();
	}
	CView::OnMouseMove(nFlags, point);
}

BOOL CFastRBFView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
{
	// TODO: Add your message handler code here and/or call default
	
	return CView::OnMouseWheel(nFlags, zDelta, pt);
}

void CFastRBFView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_iOldX = point.x;
	m_iOldY = point.y;
	m_bRButtonDown = TRUE;
	CView::OnRButtonDown(nFlags, point);
}

void CFastRBFView::OnRButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_bRButtonDown = FALSE;
	CView::OnRButtonUp(nFlags, point);
}

void CFastRBFView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	int i;
	GLdouble up[3];
	GLdouble vector[3];
	GLdouble norm;

	HWND hWnd = GetSafeHwnd();
	HDC  hDC = ::GetDC(hWnd);

	wglMakeCurrent(hDC, m_hRC);

	glViewport(0, 0, cx, cy);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	//gluPerspective(3, (GLfloat)cx/(GLfloat)cy, 10.0, 4000.0);
	gluPerspective(m_fViewAngle, (GLfloat)cx/(GLfloat)cy, 10.0, 4000.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	for(i=0; i<3; i++)
		vector[i] = m_dCenter[i] - m_dViewPort[i];

	up[0] =  vector[0] * vector[2];
	up[1] =  vector[1] * vector[2];
	up[2] =  vector[0] * vector[0] + vector[1] * vector[1];

	norm = up[0] * up[0] + up[1] * up[1] + up[2] * up[2];
	norm = sqrt(norm);
	for(i=0; i<3; i++)
		up[i] = up[i] / norm;
	
	gluLookAt(m_dViewPort[0], m_dViewPort[1], m_dViewPort[2], m_dCenter[0], m_dCenter[1], 
		m_dCenter[2], up[0], up[1], up[2]);

	wglMakeCurrent(hDC, NULL);
}

void CFastRBFView::InitOpenGL()
{
	GLfloat light_position1[4] = {-52, -16, -50, 0};
	GLfloat light_position2[4] = {-26, -48, -50, 0};
	GLfloat light_position3[4] = { 16, -52, -50, 0};

	GLfloat direction1[3] = {52,16,50};
	GLfloat direction2[3] = {26,48,50};
	GLfloat direction3[3] = {-16,52,50};

	GLfloat light_position4[4] = {52, 16, 50, 0};
	GLfloat light_position5[4] = {26, 48, 50, 0};
	GLfloat light_position6[4] = {-16, 52, 50, 0};

	GLfloat direction4[3] = {-52,-16,-50};
	GLfloat direction5[3] = {-26,-48,-50};
	GLfloat direction6[3] = {16,-52,-50};

	GLfloat color1[4] = {1,0,0,1};
	GLfloat color2[4] = {0,1,0,1};
	GLfloat color3[4] = {0,0,1,1};

	GLfloat color4[4] = {1,0,0,1};
	GLfloat color5[4] = {0,1,0,1};
	GLfloat color6[4] = {0,0,1,1};
	
	/*
	GLfloat color1[4] = {0.7,0.7,0.7,0.7};
	GLfloat color2[4] = {0.7,0.7,0.7,0.7};
	GLfloat color3[4] = {0.7,0.7,0.7,0.7};

	GLfloat color4[4] = {0.7,0.7,0.7,0.7};
	GLfloat color5[4] = {0.7,0.7,0.7,0.7};
	GLfloat color6[4] = {0.7,0.7,0.7,0.7};
	*/
	
	
	
	GLfloat ambient[4] = {0.3f,0.3f,0.3f,0.5f};

	GLfloat material_color[4] = {1,1,1,0.3f};
	GLfloat material_specular[4] = {0.5,0.5,0.5,0.5};
	GLfloat material_ambient[4] = {0.0,0.0,0.0,0.0};

	glClearColor(1,1,1,0);
	//glClearColor(0,0,0,0);

/*	glLightfv(GL_LIGHT0, GL_POSITION, light_position1);
	glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, direction1);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, color1);
	glLightfv(GL_LIGHT0, GL_SPECULAR, color1);

	glLightfv(GL_LIGHT1, GL_POSITION, light_position2);
	glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, direction2);
	glLightfv(GL_LIGHT1, GL_DIFFUSE, color2);
	glLightfv(GL_LIGHT1, GL_SPECULAR, color2);

	glLightfv(GL_LIGHT2, GL_POSITION, light_position3);
	glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, direction3);
	glLightfv(GL_LIGHT2, GL_DIFFUSE, color3);
	glLightfv(GL_LIGHT2, GL_SPECULAR, color3);*/

	glLightfv(GL_LIGHT3, GL_POSITION, light_position4);
	glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, direction4);
	glLightfv(GL_LIGHT3, GL_DIFFUSE, color4);
	glLightfv(GL_LIGHT3, GL_SPECULAR, color4);

	glLightfv(GL_LIGHT4, GL_POSITION, light_position5);
	glLightfv(GL_LIGHT4, GL_SPOT_DIRECTION, direction5);
	glLightfv(GL_LIGHT4, GL_DIFFUSE, color5);
	glLightfv(GL_LIGHT4, GL_SPECULAR, color5);

	glLightfv(GL_LIGHT5, GL_POSITION, light_position6);
	glLightfv(GL_LIGHT5, GL_SPOT_DIRECTION, direction6);
	glLightfv(GL_LIGHT5, GL_DIFFUSE, color6);
	glLightfv(GL_LIGHT5, GL_SPECULAR, color6);

	glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);

	glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular);
	glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_color);
	glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material_ambient);
	glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 128);

	glEnable(GL_LIGHTING);

	/*
	glEnable(GL_LIGHT0);
	glEnable(GL_LIGHT1);
	glEnable(GL_LIGHT2);
	*/
	
	glEnable(GL_LIGHT3);
	glEnable(GL_LIGHT4);
	glEnable(GL_LIGHT5);
	
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LESS);

//	glEnable(GL_POINT_SMOOTH);
//	glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);


//	glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);

//	glLineWidth(0.5);
	glPointSize(4.0);
}

void CFastRBFView::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	CFastRBFDoc *pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	GLfloat vx[3], vy[3], vz[3];
	vx[0] = 0;
	vx[1] = 0;
	vx[2] = 1;

	vy[0] = -(float)(m_dViewPort[1]/sqrt(m_dViewPort[0]*m_dViewPort[0]+m_dViewPort[1]*m_dViewPort[1]));
	vy[1] = (float)(m_dViewPort[0]/sqrt(m_dViewPort[0]*m_dViewPort[0]+m_dViewPort[1]*m_dViewPort[1]));
	vy[2] = 0;

	vz[0] = -vy[1];
	vz[1] = vy[0];
	vz[2] = 0;

	HWND hWnd = GetSafeHwnd();
	HDC hDC = ::GetDC(hWnd);
	wglMakeCurrent(hDC,m_hRC);
//	wglMakeCurrent(dc.m_hDC, m_hRC);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	TRACE("%f, %f\n", m_fRotateY, m_fRotateZ);

	glPushMatrix();
	glTranslatef(m_fShiftX, m_fShiftY, m_fShiftZ);
	glRotatef(m_fRotateX, vz[0], vz[1], vz[2]);
	glRotatef(m_fRotateY, vy[0], vy[1], vy[2]);
	glRotatef(m_fRotateZ, vx[0], vx[1], vx[2]);
	pDoc->DrawObjects();
	glPopMatrix();
	glFlush();

	SwapBuffers(wglGetCurrentDC());
	wglMakeCurrent(dc.m_hDC, NULL);
	// Do not call CView::OnPaint() for painting messages
}

void CFastRBFView::OnDestroy() 
{
	CView::OnDestroy();
	
	// TODO: Add your message handler code here
//	wglDeleteContext(m_hRC);
	if(wglGetCurrentContext() != NULL)
		wglMakeCurrent(NULL,NULL);
	
	if(m_hRC != NULL)
	{
		wglDeleteContext(m_hRC);
		m_hRC = NULL;
	}
}


void CFastRBFView::AdjustWindowSize(int cx, int cy)
{
	OnSize(SIZE_MAXSHOW, cx, cy);
}

⌨️ 快捷键说明

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