?? delaunayview.cpp
字號:
// DelaunayView.cpp : implementation of the CDelaunayView class
//
#include "stdafx.h"
#include "Delaunay.h"
#include "mainfrm.h"
#include "pointpos.h"
#include "triangle.h"
#include "DelaunayDoc.h"
#include "DelaunayView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDelaunayView
IMPLEMENT_DYNCREATE(CDelaunayView, CView)
BEGIN_MESSAGE_MAP(CDelaunayView, CView)
//{{AFX_MSG_MAP(CDelaunayView)
ON_WM_SIZE()
ON_WM_CREATE()
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_DESTROY()
ON_WM_KEYDOWN()
ON_COMMAND(IDM_CORLOR, OnCorlorMaterial)
ON_UPDATE_COMMAND_UI(IDM_CORLOR, OnUpdateCorlorMaterial)
ON_UPDATE_COMMAND_UI(IDM_LIGHT, OnUpdateLight)
ON_COMMAND(IDM_LIGHT, OnLight)
ON_COMMAND(ID_BUTTON_TWO, OnButtonTwo)
ON_UPDATE_COMMAND_UI(ID_BUTTON_TWO, OnUpdateButtonTwo)
ON_COMMAND(ID_BUTTON_THREE, OnButtonThree)
ON_UPDATE_COMMAND_UI(ID_BUTTON_THREE, OnUpdateButtonThree)
ON_COMMAND(ID_BUTTON_HCT, OnButtonHct)
ON_UPDATE_COMMAND_UI(ID_BUTTON_HCT, OnUpdateButtonHct)
ON_COMMAND(ID_BUTTON_FILL, OnButtonFill)
ON_UPDATE_COMMAND_UI(ID_BUTTON_FILL, OnUpdateButtonFill)
ON_COMMAND(ID_BUTTON_LINE, OnButtonLine)
ON_UPDATE_COMMAND_UI(ID_BUTTON_LINE, OnUpdateButtonLine)
ON_COMMAND(ID_BUTTON_WNAG, OnButtonWnag)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDelaunayView construction/destruction
CDelaunayView::CDelaunayView()
{
// TODO: add construction code here
}
CDelaunayView::~CDelaunayView()
{
}
BOOL CDelaunayView::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);
}
/////////////////////////////////////////////////////////////////////////////
// CDelaunayView drawing
void CDelaunayView::OnDraw(CDC* pDC)
{
CDelaunayDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
DrawScene();
SwapBuffers(pDC->m_hDC);
}
/////////////////////////////////////////////////////////////////////////////
// CDelaunayView diagnostics
#ifdef _DEBUG
void CDelaunayView::AssertValid() const
{
CView::AssertValid();
}
void CDelaunayView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CDelaunayDoc* CDelaunayView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDelaunayDoc)));
return (CDelaunayDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDelaunayView message handlers
void CDelaunayView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
if(cy>0)
{
m_oldRect.right=cx;
m_oldRect.bottom=cy;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-2.0,2.0,-2.0,2.0,0.0,20.0);
glLoadIdentity();//不能不要,事關顯示
//gluPerspective(40.0f,(GLdouble)cx/cy,1.0f,50.0f);
glMatrixMode(GL_MODELVIEW);
glViewport(0,0,cx,cy);
}
}
int CDelaunayView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
InitOpenGl();
m_pDoc=this->GetDocument();
m_ox=50;m_oy=50;m_len=400;
m_Dimension=DO_DRAW2;
//m_HCT=DO_NO_HCT;
m_Draw_what=DO_LINE;
//OpenGl/////////////////////////////
m_translate_x=-1.0;
m_translate_y=-1.0;
m_translate_z=0;
m_rotate_angle=0;
m_gl_x=1.0;m_gl_y=1.0;m_gl_z=0.0;
eye.x=4.0;eye.y=5.0;eye.z=6.0;
m_colorRed=float(0.2);m_colorGreen=float(0.5);m_colorBlue=float(0.8);
m_bMaskRed=FALSE;m_bMaskGreen=FALSE;m_bMaskBlue=FALSE;
m_materialAmb[0]=0.2;m_materialAmb[1]=0.2;m_materialAmb[2]=0.2;m_materialAmb[3]=1.0;
m_materialDif[0]=0.8;m_materialDif[1]=0.8;m_materialDif[2]=0.8;m_materialDif[3]=1.0;
m_materialSpe[0]=0.0;m_materialSpe[1]=0.0;m_materialSpe[2]=0.0;m_materialSpe[3]=1.0;
m_materialEmi[0]=0.0;m_materialEmi[1]=0.0;m_materialEmi[2]=0.0;m_materialEmi[3]=1.0;
m_matshininess=0.0f;
m_lightAmb[0]=0.2;m_lightAmb[1]=0.2;m_lightAmb[2]=0.2;m_lightAmb[3]=1.0;
m_lightDif[0]=1.0;m_lightDif[1]=1.0;m_lightDif[2]=0.3;m_lightDif[3]=1.0;
m_lightSpe[0]=1.0;m_lightSpe[1]=1.0;m_lightSpe[2]=1.0;m_lightSpe[3]=1.0;
m_lightPos[0]=1.0;m_lightPos[1]=1.0;m_lightPos[2]=1.0;m_lightPos[3]=0.0;
//OpenGl/////////////////////////////
return 0;
}
void CDelaunayView::OnLButtonDown(UINT nFlags, CPoint point)//剛開始時的插入點的處理MY WORK
{////////////////////////////////////////////
ASSERT(m_pDoc!=NULL);
CPoint pos=point;
int m_plen;//當前節點個數
double s;
if(m_pDoc->m_DoWhat==DO_ADD)
{
double x,y;
x=double(pos.x)/double(m_oldRect.right);//對X和Y進行歸一化處理
y=double((m_oldRect.bottom-pos.y))/double(m_oldRect.bottom);
m_plen=m_pDoc->m_point.GetSize();
switch(m_plen)
{
case 0 :
m_pDoc->AddPoint(x,y);
m_pDoc->m_con.SetAtGrow(0,0);
break;
case 1 :
if(m_pDoc->m_point[0]->m_x==x &&
m_pDoc->m_point[0]->m_y==y)
{
AfxMessageBox("The two point not suitable");
break;
//please 輸入節點,跳出
}
m_pDoc->AddPoint(x,y);
m_pDoc->m_con.SetAtGrow(1,1);
break;
case 2 ://確保凸包頂點逆時針存儲
m_pDoc->AddPoint(x,y);
s=m_pDoc->S(0,1,2);
if(s==0)
{
AfxMessageBox("please 輸入節點 again,因三點共線,跳出");
m_pDoc->m_point.RemoveAt(2,1);
// m_pDoc->m_n.RemoveAt(2,1);
}
m_plen=m_pDoc->m_point.GetSize();
m_pDoc->m_con.SetAtGrow(m_plen-1,m_plen-1);
if(s<0)
{
m_pDoc->m_con[0]=1;
m_pDoc->m_con[1]=0;
}
CTriangle* pTriangle;
pTriangle=new CTriangle(m_pDoc->m_con[0],
m_pDoc->m_con[1],m_pDoc->m_con[2]);
m_pDoc->Center(pTriangle);
m_pDoc->BaryCenter(pTriangle);
m_pDoc->m_tri.AddHead(pTriangle);
break;
default :
m_pDoc->AddPoint(x,y);
m_plen=m_pDoc->m_point.GetSize();
int i=DelTriList(x,y,m_plen-1);
if(i==POS_ERROR){
int k=m_pDoc->m_point.GetSize();
m_pDoc->m_point.RemoveAt(k-1,1);
}
break;
}
Invalidate();
}
////////////////////////////////////////////
CView::OnLButtonDown(nFlags, point);
}
void CDelaunayView::OnMouseMove(UINT nFlags, CPoint point) //鼠標移動函數
{
double x,y;
double a,b;
a=double(point.x);
b=double(m_oldRect.right);
x=a/b;
y=double((m_oldRect.bottom-point.y))/double(m_oldRect.bottom);
CString str1;
str1.Empty();
int i=m_pDoc->m_DoWhat;
str1.Format("%f;%f",x,y);//;%d;%d;%d;%d,i,m_Dimension,m_HCT,m_Draw_what
CMainFrame *pFram=(CMainFrame *)(AfxGetApp()->GetMainWnd());
pFram->m_wndStatusBar.SetPaneText(0,str1);
CView::OnMouseMove(nFlags, point);
}
array CDelaunayView::Wher(CPointPos *pos)//定點處理MY WORK
{
array a;
int max=m_pDoc->m_con.GetSize();
int z=max/2;
CPointPos *p1=new CPointPos(m_pDoc->m_point[m_pDoc->m_con[0]]->m_x,
m_pDoc->m_point[m_pDoc->m_con[0]]->m_y);
CPointPos *p2=new CPointPos(m_pDoc->m_point[m_pDoc->m_con[z]]->m_x,
m_pDoc->m_point[m_pDoc->m_con[z]]->m_y);
CPointPos *p3=new CPointPos(m_pDoc->m_point[m_pDoc->m_con[max-1]]->m_x,
m_pDoc->m_point[m_pDoc->m_con[max-1]]->m_y);
CPointPos *p=new CPointPos((p1->m_x+p2->m_x+p3->m_x)/3,
(p1->m_y+p2->m_y+p3->m_y)/3);
p3->m_x=double(pos->m_x);
p3->m_y=double(pos->m_y);
//遍尋Convexity
double s1,s2,s;
for(int i=0;i<max-1;i++)
{
int ii,jj;
ii=m_pDoc->m_con[i];
jj=m_pDoc->m_con[i+1];
p1->m_x=m_pDoc->m_point[ii]->m_x;
p1->m_y=m_pDoc->m_point[ii]->m_y;
p2->m_x=m_pDoc->m_point[jj]->m_x;
p2->m_y=m_pDoc->m_point[jj]->m_y;
s1=m_pDoc->S(p3,p,p1);
s2=m_pDoc->S(p3,p,p2);
if(s1>0 && s2<0)//the point in the 扇形 con[i],con[i+1] and p formed
{
a.b=i;
a.c=i+1;
s=m_pDoc->S(p1,p2,p3);
if(s>0)
{
a.a=1;//POS_IN
}
if(s==0)
{
a.a=2;//POS_ON
}
if(s<0)
{
a.a=0;//POS_OUT
}
return a;
}
}
int iii,jjj;
iii=m_pDoc->m_con[i];
jjj=m_pDoc->m_con[0];
p1->m_x=m_pDoc->m_point[iii]->m_x;
p1->m_y=m_pDoc->m_point[iii]->m_y;
p2->m_x=m_pDoc->m_point[jjj]->m_x;
p2->m_y=m_pDoc->m_point[jjj]->m_y;
s1=m_pDoc->S(p3,p,p1);
s2=m_pDoc->S(p3,p,p2);
if(s1>0 && s2<0)
{
a.b=i;
a.c=0;
s=m_pDoc->S(p1,p2,p3);
if(s>0)
{
a.a=1;//POS_IN
}
if(s==0)
{
a.a=2;//POS_ON
}
if(s<0)
{
a.a=0;//POS_OUT
}
return a;
}
}
void CDelaunayView::DrawTri(CTriangle *tri)//畫2維還是3維
{
int i;
//POI normal;
int p1,p2,p3;
p1=tri->m_p1;
p2=tri->m_p2;
p3=tri->m_p3;
GLfloat fLineWidth[2];
glGetFloatv(GL_LINE_WIDTH_RANGE,fLineWidth);
if(m_Dimension==DO_DRAW2 && m_HCT!=DO_HCT)
{
glColor4d(0.0,0.0,1.0,0.5);
glBegin(GL_TRIANGLES);
glVertex3d(m_pDoc->m_point[p1]->m_x,m_pDoc->m_point[p1]->m_y,0.0);
glVertex3d(m_pDoc->m_point[p2]->m_x,m_pDoc->m_point[p2]->m_y,0.0);
glVertex3d(m_pDoc->m_point[p3]->m_x,m_pDoc->m_point[p3]->m_y,0.0);
glEnd();
}
if(m_Dimension==DO_DRAW3 && m_HCT!=DO_HCT)
{
glPushMatrix();
//glScaled(2,2,1.5);
glColor3f(1.0f,0.0f,0.0f);
glBegin(GL_TRIANGLES);
glVertex3d(m_pDoc->m_point[p1]->m_x,m_pDoc->m_point[p1]->m_y,m_pDoc->m_point[p1]->m_z);
glVertex3d(m_pDoc->m_point[p2]->m_x,m_pDoc->m_point[p2]->m_y,m_pDoc->m_point[p2]->m_z);
glVertex3d(m_pDoc->m_point[p3]->m_x,m_pDoc->m_point[p3]->m_y,m_pDoc->m_point[p3]->m_z);
glEnd();
glPopMatrix();
}
if(m_Dimension==DO_DRAW3 && m_HCT==DO_HCT)
{
m_pDoc->DrawTri(tri->m_p1,tri->m_p2,tri);
m_pDoc->DrawTri(tri->m_p2,tri->m_p3,tri);
m_pDoc->DrawTri(tri->m_p3,tri->m_p1,tri);
/*for(i=1;i<=3;i++)
{
HCT(tri,i);
glColor4d(0.0,1.0,0.0,0.5);
if(i==2)
{
glBegin(GL_TRIANGLES);//anticlock
normal=GetTriNormal(m_hct[0],m_hct[1],m_hct[2]);
glNormal3d(normal.x,normal.y,normal.z);
glVertex3d(m_hct[0].x,m_hct[0].y,m_hct[0].z);
glVertex3d(m_hct[1].x,m_hct[1].y,m_hct[1].z);
glVertex3d(m_hct[2].x,m_hct[2].y,m_hct[2].z);
normal=GetTriNormal(m_hct[1],m_hct[3],m_hct[2]);
glNormal3d(normal.x,normal.y,normal.z);
glVertex3d(m_hct[1].x,m_hct[1].y,m_hct[1].z);
glVertex3d(m_hct[3].x,m_hct[3].y,m_hct[3].z);
glVertex3d(m_hct[2].x,m_hct[2].y,m_hct[2].z);
normal=GetTriNormal(m_hct[3],m_hct[1],m_hct[4]);
glNormal3d(normal.x,normal.y,normal.z);
glVertex3d(m_hct[3].x,m_hct[3].y,m_hct[3].z);
glVertex3d(m_hct[1].x,m_hct[1].y,m_hct[1].z);
glVertex3d(m_hct[4].x,m_hct[4].y,m_hct[4].z);
normal=GetTriNormal(m_hct[3],m_hct[4],m_hct[5]);
glNormal3d(normal.x,normal.y,normal.z);
glVertex3d(m_hct[3].x,m_hct[3].y,m_hct[3].z);
glVertex3d(m_hct[4].x,m_hct[4].y,m_hct[4].z);
glVertex3d(m_hct[5].x,m_hct[5].y,m_hct[5].z);
normal=GetTriNormal(m_hct[4],m_hct[6],m_hct[5]);
glNormal3d(normal.x,normal.y,normal.z);
glVertex3d(m_hct[4].x,m_hct[4].y,m_hct[4].z);
glVertex3d(m_hct[6].x,m_hct[6].y,m_hct[6].z);
glVertex3d(m_hct[5].x,m_hct[5].y,m_hct[5].z);
normal=GetTriNormal(m_hct[8],m_hct[7],m_hct[9]);
glNormal3d(normal.x,normal.y,normal.z);
glVertex3d(m_hct[8].x,m_hct[8].y,m_hct[8].z);
glVertex3d(m_hct[7].x,m_hct[7].y,m_hct[7].z);
glVertex3d(m_hct[9].x,m_hct[9].y,m_hct[9].z);
normal=GetTriNormal(m_hct[8],m_hct[3],m_hct[7]);
glNormal3d(normal.x,normal.y,normal.z);
glVertex3d(m_hct[8].x,m_hct[8].y,m_hct[8].z);
glVertex3d(m_hct[3].x,m_hct[3].y,m_hct[3].z);
glVertex3d(m_hct[7].x,m_hct[7].y,m_hct[7].z);
normal=GetTriNormal(m_hct[3],m_hct[5],m_hct[7]);
glNormal3d(normal.x,normal.y,normal.z);
glVertex3d(m_hct[3].x,m_hct[3].y,m_hct[3].z);
glVertex3d(m_hct[5].x,m_hct[5].y,m_hct[5].z);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -