📄 patternview.cpp
字号:
// 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 + -