Новичок
Профиль
Группа: Участник
Сообщений: 2
Регистрация: 8.3.2006
Репутация: нет Всего: нет
|
Помогите пожалуйста!В прилагаемом файле MFCView.cpp в функции display() есть код некоего графического объекта,напоминающего элипс и имееющего профильный вид.Нужно расположить "камеру" для просмотра объекта в изометрии.Заранее благодарен Добавлено @ 15:39 | Код | #include "stdafx.h" #include "MFC.h" #include <iostream.h>
#include "MFCDoc.h" #include "MFCView.h"
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif
///////////////////////////////////////////////////////////////////////////// // CMFCView
IMPLEMENT_DYNCREATE(CMFCView, CView)
BEGIN_MESSAGE_MAP(CMFCView, CView) //{{AFX_MSG_MAP(CMFCView) ON_WM_CREATE() ON_WM_DESTROY() ON_WM_SIZE() ON_WM_KEYDOWN() ON_WM_MOUSEMOVE() ON_WM_MOUSEWHEEL() ON_WM_HSCROLL() //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////// // CMFCView construction/destruction
CMFCView::CMFCView() { // TODO: add construction code here
}
CMFCView::~CMFCView() { }
BOOL CMFCView::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); }
#define dx 1 #define M_PI 3.14159265358979323846 #define dQ 10*M_PI/180
///////////////////////////////////////////////////////////////////////////// // CMFCView drawing
int width=800; int height=100;
void CMFCView::display() {
glPushMatrix();
glClearColor(0.3,0.3,1,0); glMatrixMode( GL_MODELVIEW);
glViewport(40,100,width,height); glMatrixMode( GL_PROJECTION); glOrtho(-5,110, -5,5, -5,5); gluLookAt( 0,0,1, 0,0,0, 0,1,0 );
static double t=0; double x, Q; double Rn=1; //Зададим коэффициент к: double K=1.095; //Зададим коэффициент сопротивления: double Cx0=0.82; //Зададим число кавитации: double SIG= 0.04; //Определим коэффициенты: double Rk=Rn*sqrt(Cx0*(1+SIG)/(K*SIG)); double LAM=Rn/Rk; //Посчитаем длинну каверны: double Lk=Rn*(1.92-3*SIG)/SIG; //Посчитаем конечное значение по оси Х: double xn=2*Lk; ///////////////////////////////////////// glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
/////////////////////////////// ОСИ КООРДИНАТ: ////X glPushMatrix(); glPointSize(7); glBegin(GL_POINTS); for(int i=0;i<xn;i=i+10) glVertex3d(i,0,0); glEnd();
glLineWidth(5); glBegin(GL_LINE_STRIP); glVertex3d(0,0,0); glVertex3d(xn,0,0); glEnd();
/////Y
glPointSize(7); glBegin(GL_POINTS); for(int j=0;j<5;j=j+1) glVertex3d(0,j,0); glEnd();
glLineWidth(5); glBegin(GL_LINE_STRIP); glVertex3d(0,0,0); glVertex3d(0,5,0); glEnd(); /////Z
glPointSize(7); glBegin(GL_POINTS); for(int k=0;k<5;k=k+1) glVertex3d(0,0,k); glEnd();
glLineWidth(5); glBegin(GL_LINE_STRIP); glVertex3d(0,0,0); glVertex3d(0,0,5); glEnd();
for(x=0;x<xn;x+=dx) for(Q=0;Q<180/M_PI;Q+=dQ) {
double Xotn1=x/Lk; double Xotn2=(x+dx)/Lk; double R1=Rk*sqrt(1-(1-LAM*LAM)*(1-Xotn1)*(1-Xotn1)); double R2=Rk*sqrt(1-(1-LAM*LAM)*(1-Xotn2)*(1-Xotn2));
double z1 = R1*sin(Q+t); double y1 = R1*cos(Q+t); double x1 = x;
double z2 = R1*sin(Q+dQ+t); double y2 = R1*cos(Q+t); double x2 = x;
double z3 = R2*sin(Q+t); double y3 = R2*cos(Q+t); double x3 = x+dx;
double z4 = R2*sin(Q+dQ+t); double y4 = R2*cos(Q+dQ+t); double x4 = x+dx; glLineWidth(1); glBegin(GL_LINE_STRIP);
glVertex3d(x1,y1,z1); glVertex3d(x2,y2,z2); glVertex3d(x3,y3,z3); glVertex3d(x4,y4,z4);
glEnd();
} glPopMatrix(); //t+=0.01; glLoadIdentity(); glPopMatrix(); SwapBuffers(wglGetCurrentDC());
}
void CMFCView::OnDraw(CDC* pDC) { display();
}
///////////////////////////////////////////////////////////////////////////// // CMFCView printing
BOOL CMFCView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); }
void CMFCView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing }
void CMFCView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing }
///////////////////////////////////////////////////////////////////////////// // CMFCView diagnostics
#ifdef _DEBUG void CMFCView::AssertValid() const { CView::AssertValid(); }
void CMFCView::Dump(CDumpContext& dc) const { CView::Dump(dc); }
CMFCDoc* CMFCView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCDoc))); return (CMFCDoc*)m_pDocument; } #endif //_DEBUG
///////////////////////////////////////////////////////////////////////////// // CMFCView message handlers
int CMFCView::SetWindowPixelFormat(HDC hDC) { int m_GLPixelIndex; PIXELFORMATDESCRIPTOR pfd;
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 32; pfd.cRedBits = 8; pfd.cRedShift = 16; pfd.cGreenBits = 8; pfd.cGreenShift = 8; pfd.cBlueBits = 8; pfd.cBlueShift = 0; pfd.cAlphaBits = 0; pfd.cAlphaShift = 0; pfd.cAccumBits = 64; pfd.cAccumRedBits = 16; pfd.cAccumGreenBits = 16; pfd.cAccumBlueBits = 16; pfd.cAccumAlphaBits = 0; pfd.cDepthBits = 32; pfd.cStencilBits = 8; pfd.cAuxBuffers = 0; pfd.iLayerType = PFD_MAIN_PLANE; pfd.bReserved = 0; pfd.dwLayerMask = 0; pfd.dwVisibleMask = 0; pfd.dwDamageMask = 0;
m_GLPixelIndex = ChoosePixelFormat( hDC, &pfd); if(m_GLPixelIndex==0) // Let's choose a default index. { m_GLPixelIndex = 1; if(DescribePixelFormat(hDC,m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pfd)==0) return 0; }
if (SetPixelFormat( hDC, m_GLPixelIndex, &pfd)==FALSE) return 0;
return 1; }
int CMFCView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; pdc = new CClientDC(this);
if(SetWindowPixelFormat(pdc->m_hDC)==FALSE) return -1;
hGLRC = wglCreateContext(pdc->m_hDC); if(hGLRC == NULL) return -1;
if(wglMakeCurrent(pdc->m_hDC, hGLRC)==FALSE) return -1;
glEnable(GL_ALPHA_TEST); glEnable(GL_DEPTH_TEST); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
float pos[4] = {3,3,3,1}; float dir[3] = {-1,-1,-1}; glLightfv(GL_LIGHT0, GL_POSITION, pos); glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);
return 0; }
void CMFCView::OnDestroy() { if(wglGetCurrentContext()!=NULL) wglMakeCurrent(NULL, NULL) ;
if(hGLRC!=NULL) { wglDeleteContext(hGLRC); hGLRC = NULL; }
delete pdc;
CView::OnDestroy(); }
void CMFCView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy);
}
void CMFCView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CMFCView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default
CView::OnMouseMove(nFlags, point);
}
BOOL CMFCView::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 CMFCView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default CView::OnHScroll(nSBCode, nPos, pScrollBar); }
BOOL CMFCView::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll) { // TODO: Add your specialized code here and/or call the base class return CView::OnScroll(nScrollCode, nPos, bDoScroll); }
|
|