📄 fastrbfview.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 + -