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

📄 patternview.cpp

📁 本人的模式识别课程VC源程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// PatternView.cpp : implementation of the CPatternView class
//

#include "stdafx.h"
#include "Pattern.h"
///////////////////////////////////////////////////////
#include "MainFrm.h"
#include "math.h"
#include "Dlgmobancanshu.h"
#include "DlgIsodata.h"
//#include "time.h"
////////////////////////////////////////////////////
#include "PatternDoc.h"
#include "PatternView.h"

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

IMPLEMENT_DYNCREATE(CPatternView, CScrollView)

BEGIN_MESSAGE_MAP(CPatternView, CScrollView)
	//{{AFX_MSG_MAP(CPatternView)
	ON_COMMAND(ID_MoBanSet, OnMoBanSet)
	ON_COMMAND(ID_Threshold, OnThreshold)
	ON_COMMAND(ID_MaxiMin, OnMaxiMin)
	ON_COMMAND(ID_KMeans, OnKMeans)
	ON_COMMAND(ID_Isodata, OnIsodata)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPatternView construction/destruction

CPatternView::CPatternView()
{
	
   bMoBanSet = false; 
	bshowcen = false;	
	// TODO: add construction code here

}

CPatternView::~CPatternView()
{
}

BOOL CPatternView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CPatternView drawing

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

int i,j;
	if(bMoBanSet)
	{
          //刷屏且背景为白色
	      BrushScreen(pDC,RGB(255,255,255));
          for(i=0;i<iShuMu;i++)
		  {	 
			  for(j=0;j<iDianShu;j++)//显示每一类的点(一次打五个点:上、下、左、右)
			  {////SampleDot samplenum[1500];点数(iDianShu):0-150,类数(iShuMu):1-10
				  pDC->SetPixel((int)samplenum[i*iDianShu+j].cx,(int)samplenum[i*iDianShu+j].cy,samplenum[i*iDianShu+j].colorvalue);
		          pDC->SetPixel((int)samplenum[i*iDianShu+j].cx-1,(int)samplenum[i*iDianShu+j].cy,samplenum[i*iDianShu+j].colorvalue);
			      pDC->SetPixel((int)samplenum[i*iDianShu+j].cx+1,(int)samplenum[i*iDianShu+j].cy,samplenum[i*iDianShu+j].colorvalue);
			      pDC->SetPixel((int)samplenum[i*iDianShu+j].cx,(int)samplenum[i*iDianShu+j].cy-1,samplenum[i*iDianShu+j].colorvalue);
			      pDC->SetPixel((int)samplenum[i*iDianShu+j].cx,(int)samplenum[i*iDianShu+j].cy+1,samplenum[i*iDianShu+j].colorvalue);

//pDC->SetPixel(j,height-i,RGB(R,G,B))为打点
			  }        
			  if(bshowcen && samplecen[i].fseek)//显示每一类的中心点(以十字架“+”表示:横为红色,竖为黑色)
			  {    

				  pDC->SetPixel((int)samplecen[i].cx,(int)samplecen[i].cy,RGB(255,0,0));
                  pDC->SetPixel((int)samplecen[i].cx-1,(int)samplecen[i].cy,RGB(255,0,0));
                  pDC->SetPixel((int)samplecen[i].cx+1,(int)samplecen[i].cy,RGB(255,0,0));
                  pDC->SetPixel((int)samplecen[i].cx,(int)samplecen[i].cy-1,RGB(255,0,0));
                  pDC->SetPixel((int)samplecen[i].cx,(int)samplecen[i].cy+1,RGB(255,0,0));

                  pDC->SetPixel((int)samplecen[i].cx-2,(int)samplecen[i].cy,RGB(255,0,0));
			      pDC->SetPixel((int)samplecen[i].cx+2,(int)samplecen[i].cy,RGB(255,0,0));
		          pDC->SetPixel((int)samplecen[i].cx,(int)samplecen[i].cy-2,RGB(255,0,0));
		          pDC->SetPixel((int)samplecen[i].cx,(int)samplecen[i].cy+2,RGB(255,0,0));

				  pDC->SetPixel((int)samplecen[i].cx-3,(int)samplecen[i].cy,RGB(255,0,0));
                  pDC->SetPixel((int)samplecen[i].cx+3,(int)samplecen[i].cy,RGB(255,0,0));
                  pDC->SetPixel((int)samplecen[i].cx,(int)samplecen[i].cy-3,RGB(255,0,0));
                  pDC->SetPixel((int)samplecen[i].cx,(int)samplecen[i].cy+3,RGB(255,0,0));

                  pDC->SetPixel((int)samplecen[i].cx-4,(int)samplecen[i].cy,RGB(255,0,0));
			      pDC->SetPixel((int)samplecen[i].cx+4,(int)samplecen[i].cy,RGB(255,0,0));
		          pDC->SetPixel((int)samplecen[i].cx,(int)samplecen[i].cy-4,RGB(255,0,0));
		          pDC->SetPixel((int)samplecen[i].cx,(int)samplecen[i].cy+4,RGB(255,0,0));
			  }
		   }
			  bshowcen = false;
		  
	}
		// 恢复正常光标
	EndWaitCursor();
}




void CPatternView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();

	//CSize sizeTotal;
	// TODO: calculate the total size of this view
	//sizeTotal.cx = sizeTotal.cy = 100;
	//SetScrollSizes(MM_TEXT, sizeTotal);
}
void CPatternView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	//CScrollView::CalcWindowRect(lpClientRect, nAdjustType);

CScrollView::OnInitialUpdate();
	ASSERT(GetDocument() != NULL);
	
	SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize());

}

/////////////////////////////////////////////////////////////////////////////
// CPatternView printing

BOOL CPatternView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CPatternView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CPatternView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CPatternView diagnostics

#ifdef _DEBUG
void CPatternView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CPatternView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

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

/////////////////////////////////////////////////////////////////////////////
// CPatternView message handlers



LRESULT CPatternView::OnDoRealize(WPARAM wParam, LPARAM)
{
	ASSERT(wParam != NULL);

	// 获取文档
	CPatternDoc* pDoc = GetDocument();
	
	// 判断DIB是否为空
	if (pDoc->GetHDIB() == NULL)
	{
		// 直接返回
		return 0L;
	}
	
	// 获取Palette
	CPalette* pPal = pDoc->GetDocPalette();
	if (pPal != NULL)
	{
		// 获取MainFrame
		CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
		ASSERT_KINDOF(CMainFrame, pAppFrame);
		
		CClientDC appDC(pAppFrame);

		CPalette* oldPalette = appDC.SelectPalette(pPal, ((HWND)wParam) != m_hWnd);
		
		if (oldPalette != NULL)
		{
			UINT nColorsChanged = appDC.RealizePalette();
			if (nColorsChanged > 0)
				pDoc->UpdateAllViews(NULL);
			appDC.SelectPalette(oldPalette, TRUE);
		}
		else
		{
			TRACE0("\tCMssbView::OnPaletteChanged中调用SelectPalette()失败!\n");
		}
	}
	
	return 0L;
}

void CPatternView::BrushScreen(CDC *pDC, COLORREF crColor)
{
//刷屏函数
	CRect rect;
    CBrush NewBrush;
	CBrush* pOldBrush;
	NewBrush.CreateSolidBrush(crColor);
	pOldBrush=pDC->SelectObject(&NewBrush);
	rect.top    = 0;	
	rect.left   = 0;
	rect.right  = 1024;	
	rect.bottom = 968;
	pDC->FillRect(rect,&NewBrush);
	pDC->SelectObject(pOldBrush);
	NewBrush.DeleteObject();
}

void CPatternView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView);

if (bActivate)
	{
		ASSERT(pActivateView == this);
		OnDoRealize((WPARAM)m_hWnd, 0);   // same as SendMessage(WM_DOREALIZE);
	}
}

void CPatternView::OnMoBanSet() 
{
	// TODO: Add your command handler code here

	CDC* pDC;
	pDC=GetDC();

	//判断菜单的激活
	bMoBanSet=true;

	// 更改光标形状
	BeginWaitCursor();
   
    // 创建对话框
	CDlgmobancanshu dlgPara;
		
	// 显示对话框,提示用户设定用户参数
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	
	//变量赋值
	iJuLi = dlgPara.m_iJuLi;
	iShuMu = dlgPara.m_iShuMu;
	iDianShu = dlgPara.m_iDianShu;
	
    // 删除对话框
	delete dlgPara;

//刷屏
	 BrushScreen(pDC,RGB(255,255,255));//不改变颜色

	
    //随机样本点的产生
    SampleDot *yangbenzhx;//*yangbenzhx为SampleDot结构变量
	yangbenzhx = new SampleDot[iShuMu];
	int i, j, distance;
	bool flagdis;
	flagdis = true;

    //一、随机中心点的产生
    for(i=0;i<iShuMu;i++)   
	{
		if(!flagdis && i==1)//关系运算:将!flagdis(表示逻辑非)的结果与i==1的值进行逻辑与运算
			i = 0;         //产生一个中心点
    	flagdis = true;
        yangbenzhx[i].cx=rand()/60;//给结构yangbenzhx[i]的成员cx赋值
   	    yangbenzhx[i].cy=rand()/60;
       if(yangbenzhx[i].cx < 80 || yangbenzhx[i].cy <80)//若中心点(X,Y)的坐标X<50或Y<50
		   //则返回到前一点即不要该点做中心点。
	   {
		   if(i==0)//将I与0相比较
			   flagdis = false;
		   else
		       i--;
	   }
	   else//若中心点(X,Y)的坐标X<50且Y<50则求该中心点与其前面所有的中心点的距离distance。
//若distance< iJuLi(类间距离)则返回到前一点即不要该点做中心点
	   { 
		   for(j=0; j<i; j++)
		   {
			   distance=sqrt((yangbenzhx[i].cx-yangbenzhx[j].cx)*(yangbenzhx[i].cx-yangbenzhx[j].cx)
			               +(yangbenzhx[i].cy-yangbenzhx[j].cy)*(yangbenzhx[i].cy-yangbenzhx[j].cy));
		       if(distance < iJuLi)
			   {
				   i--;
				   break;
			   }
		   }
		   
	   
	   }

     //  yangbenzhx[i].colorvalue=RGB(255,0,0);
	}

    //二、随机数据产生
	flagdis = true;
	for(i=0;i<iShuMu;i++)   
	{
		for(j=0;j<iDianShu;j++)
		{
			if(j==1 && !flagdis)  // j==1与!flagdis(逻辑非)进行逻辑与(&&)
				j = 0;		//求随机数据点与原点的距离作为半径iBanJing
                samplenum[i*iDianShu+j].cx = rand()/32768.0*40*2;
			    samplenum[i*iDianShu+j].cy = rand()/32768.0*40*2;
                samplenum[i*iDianShu+j].cx = samplenum[i*iDianShu+j].cx - 40;
			    samplenum[i*iDianShu+j].cy = samplenum[i*iDianShu+j].cy - 40;
			    iBanJing = sqrt(samplenum[i*iDianShu+j].cx * samplenum[i*iDianShu+j].cx 
				             + samplenum[i*iDianShu+j].cy * samplenum[i*iDianShu+j].cy);
			    //判断角度的象限
				if(	samplenum[i*iDianShu+j].cx >= 0 )
				{
				   alpha = asin(samplenum[i*iDianShu+j].cy/iBanJing);//arcsin()其值为幅度
				}
				else
				{
                   alpha = PI - asin(samplenum[i*iDianShu+j].cy/iBanJing);//第二象限的角
				}

                //旋转角度
			   beta = alpha ;

				//坐标变换
			        samplenum[i*iDianShu+j].cx = iBanJing*cos(beta);
                    samplenum[i*iDianShu+j].cy = iBanJing*sin(beta);
				//判断是否在椭圆内
			if(ib*ib*samplenum[i*iDianShu+j].cx*samplenum[i*iDianShu+j].cx
				+ ia*ia*samplenum[i*iDianShu+j].cy*samplenum[i*iDianShu+j].cy > ia*ia*ib*ib )
			{
				if(j==0)
					flagdis = false;
				else
					j--;
				continue;
			}
			else if(j==0)
				flagdis = true;

                //平移到中心点
			    samplenum[i*iDianShu+j].cx+=yangbenzhx[i].cx;//samplenum[i*iDianShu+j].cx=samplenum[i*iDianShu+j].cx+yangbenzhx[i].cx
			    samplenum[i*iDianShu+j].cy+=yangbenzhx[i].cy;
			    samplenum[i*iDianShu+j].colorvalue=RGB(255,0,0);
		}
	}

⌨️ 快捷键说明

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