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

📄 faultazmdlg.cpp

📁 裂隙统计程序设计
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
选择排序
pdat按从小到达排序,对应的pid随着pdat的移动而移动
*/
void CFaultAzmDlg::SortData(double *pdat, int N, int *pid)
{
	if( N <=0 )
		return;
	int i,j,k;
	double temp;
	int t;
	for( i=0; i<N-1; i++ )
	{
		k=i;
		for( j=i+1; j<N; j++ )
		{
			if( pdat[j]<pdat[k] )
				k=j;
		}
		if( k!=i )
		{
			temp=pdat[k];
			pdat[k]=pdat[i];
			pdat[i]=temp;
			//
			t=pid[k];
			pid[k]=pid[i];
			pid[i]=t;
		}
	}
}

void CFaultAzmDlg::FindClsPos(double *pdat,int N, double clsF, CUIntArray &ruiaClsPos)
{
	if( N <=0 )
		return;
	if( m_uiaClsPos.GetSize()>=0 )
		m_uiaClsPos.RemoveAll();
	for( int i=0; i<N; i++ )
	{
		if( pdat[i]>=clsF )
			ruiaClsPos.Add(i);
	}
}

void CFaultAzmDlg::BasStatVar(double *pdat, int N, CELL &rAmzStatCell)
{
	if( N <=0 )
		return;
	double	min=pdat[0];
	double max=pdat[0];
	double t=pdat[0];
	for( int i=1; i<N; i++ )
	{
		if( pdat[i]<min ) min=pdat[i];
		if( pdat[i]>max ) max=pdat[i];
		t+=pdat[i];
	}
	rAmzStatCell.n = N;
	rAmzStatCell.per = (double)N/m_N*100;
	rAmzStatCell.min = min;
	rAmzStatCell.max = max;
	rAmzStatCell.mean = t/N;

	//计算标准方差
	t=0;
	for( i=0; i<N; i++ )
	{
		t+=(pdat[i]-rAmzStatCell.mean)*(pdat[i]-rAmzStatCell.mean);
	}
	if( N>30 )	rAmzStatCell.stdvar = sqrt(t/N);
	else if( N<=30 && N-1>0 )	rAmzStatCell.stdvar = sqrt(t/(N-1));
	else	rAmzStatCell.stdvar = -1;//无效值
}

void CFaultAzmDlg::f_PreDraw()
{
	//获取占位控件Picture的Rect
	GetDlgItem(IDC_STATIC_PICAREA)->GetClientRect(&m_Rect);

	m_Rect.DeflateRect(10,10);
	int width=m_Rect.Width();
	int height=m_Rect.Height();
	m_x0=m_Rect.left+width/2;
	m_y0=m_Rect.top+height/2;
	m_AxisL=width; if(width>height) m_AxisL=height;
	m_Scale = m_AxisL*0.5/1;
	//m_AxisL=(int)(m_AxisL*0.95);

}

void CFaultAzmDlg::f_DrawCircle()
{
	CWnd* pWndDraw=GetDlgItem(IDC_STATIC_PICAREA);
	CDC* pDC=pWndDraw->GetDC();
//	pWndDraw->Invalidate();
	pWndDraw->UpdateWindow();
	//创建画笔
	CPen *pNewPen;
	CPen *pOldPen;
	pNewPen=new CPen;
	pNewPen->CreatePen(PS_SOLID,1,RGB(192,192,192));	
	pOldPen=pDC->SelectObject(pNewPen);
	int r=(int)(1*m_Scale*m_Zoom);
	//pDC->LineTo(m_x0-r,m_y0-r);
	pDC->Ellipse(m_x0-r,m_y0-r,m_x0+r,m_y0+r);
	r/=2;
	pDC->Ellipse(m_x0-r,m_y0-r,m_x0+r,m_y0+r);
	r/=2;
	pDC->Ellipse(m_x0-r,m_y0-r,m_x0+r,m_y0+r);
	r/=2;
	pDC->Ellipse(m_x0-r,m_y0-r,m_x0+r,m_y0+r);

	// X--Y
	r=m_AxisL/2;
	pDC->MoveTo(m_x0,m_y0);	pDC->LineTo(m_x0-r,m_y0);
	pDC->MoveTo(m_x0,m_y0);	pDC->LineTo(m_x0+r,m_y0);
	pDC->MoveTo(m_x0,m_y0);	pDC->LineTo(m_x0,m_y0-r);
	pDC->MoveTo(m_x0,m_y0);	pDC->LineTo(m_x0,m_y0+r);
	//\/
	r=(int)(1.414*0.5*0.5*m_AxisL);
	pDC->MoveTo(m_x0,m_y0);	pDC->LineTo(m_x0-r,m_y0-r);
	pDC->MoveTo(m_x0,m_y0);	pDC->LineTo(m_x0+r,m_y0+r);
	pDC->MoveTo(m_x0,m_y0);	pDC->LineTo(m_x0-r,m_y0+r);
	pDC->MoveTo(m_x0,m_y0);	pDC->LineTo(m_x0+r,m_y0-r);

	pDC->SelectObject(pOldPen);
	delete pNewPen;
	ReleaseDC(pDC);
}

void CFaultAzmDlg::f_DrawLine()
{
	CWnd* pWndDraw=GetDlgItem(IDC_STATIC_PICAREA);
	CDC* pDC=pWndDraw->GetDC();
//	pWndDraw->Invalidate();
	pWndDraw->UpdateWindow();

	int nLine = m_uiaClsPos.GetSize()+1;
	int i;
	int dx,dy;
	double sinA,cosA;
	double L;
	//创建画笔
	CPen *pNewPen;
	CPen *pOldPen;
	pNewPen=new CPen;
	pNewPen->CreatePen(PS_SOLID,1,RGB(0,0,255));	
	pOldPen=pDC->SelectObject(pNewPen);

	for( i=0; i<nLine; i++)
	{
		L=(double)m_pAmzStatCell[i].n/m_N;
		L*=m_Zoom;
		sinA = sin(m_pAmzStatCell[i].mean*PI/180);
		cosA = cos(m_pAmzStatCell[i].mean*PI/180);
		dx=(int)( L*sinA*m_Scale );
		dy=(int)( L*cosA*m_Scale );
		pDC->MoveTo(m_x0,m_y0);	
		pDC->LineTo(m_x0+dx,m_y0-dy);
	}
	delete pNewPen;
	pOldPen=pDC->SelectObject(pNewPen);
	ReleaseDC(pDC);
}

void CFaultAzmDlg::OnButtonZoomin() 
{
	// TODO: Add your control notification handler code here
	Invalidate(TRUE);
	m_Zoom/=0.8;//0.618;
	InvalidateRect(m_Rect);
}

void CFaultAzmDlg::OnButtonZoomout() 
{
	// TODO: Add your control notification handler code here
	Invalidate(TRUE);
	m_Zoom*=0.8;//0.618;
	InvalidateRect(m_Rect);
	
}

void CFaultAzmDlg::OnButtonZoomeq1() 
{
	// TODO: Add your control notification handler code here
	Invalidate(TRUE);
	m_Zoom=1;
	InvalidateRect(m_Rect);
}

void CFaultAzmDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	UpdateData(true);
	m_strAngle = "";
	if( m_canDrawLine )
	{
		double r,angle;
		GetRadiusAngle(point,r,angle);
		if( angle >=0 )
		{
			m_strR.Format("%.3lf",r/m_Scale/m_Zoom);
			m_strAngle.Format("%.3lf°",angle);
		}
		else
		{
			m_strR.Empty();
			m_strAngle.Empty();
		}
	}
	UpdateData(false);
	CDialog::OnMouseMove(nFlags, point);
}

void CFaultAzmDlg::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if( m_canDrawLine )
	{
		//将列表中所有项为非选
		for( int i=0; i<m_listCtrl.GetItemCount(); i++ )
			m_listCtrlRlt.SetItemState(i,0,LVIS_SELECTED);
		double r,angle;
		GetRadiusAngle(point,r,angle);
		int iCls = GetIndexClass(angle,m_pAmzStatCell,m_uiaClsPos.GetSize()+1);
		if( iCls<0 )
			return;
		//选中
		m_listCtrlRlt.SetItemState(iCls,LVIS_SELECTED,LVIS_SELECTED);
		m_listCtrlRlt.SetFocus();
		m_listCtrlRlt.EnsureVisible(iCls, FALSE);


	}
	CDialog::OnLButtonDblClk(nFlags, point);
}

void CFaultAzmDlg::GetRadiusAngle(CPoint point, double& r, double& angle)
{
	int x,y;//鼠标点(屏幕坐标)
	int x0,y0;//原点(屏幕坐标)
	
	CRect rc;
	GetDlgItem(IDC_STATIC_PICAREA)->GetWindowRect(&rc);
	x0 = (rc.left+rc.right)/2;
	y0 = (rc.top+rc.bottom)/2;
	
	ClientToScreen(&point);
	x=point.x; y=point.y;


	r=sqrt(( (y-y0)*(y-y0)+(x-x0)*(x-x0) )); 
	if(r<1 || r>m_AxisL/2 ) 
	{
		r=-1;	angle=-1;
		return;
	}

	// double acos( double a ) 
	//angle=[0,PI]结合y值为正为负判断鼠标所在区间的角度
	angle=(x-x0)/r; //余弦值
	angle=acos(angle);    //弧度
	angle=180*angle/PI; //角度
	if( y<=y0 )	
	{
		if( x>=x0 ) angle=90-angle;//第一象限
		else angle=360-(angle-90);//第二象限
	}
	else
	{
		if(x<=x0 ) angle=90+angle;//第三象限
		else angle=90+angle;
	}

}

int CFaultAzmDlg::GetIndexClass(double angle, CELL* pAmzStatCell,int nCls)
{
	int iCls=-1;
	double dA=3;
	for( int i=0; i<nCls; i++ )
	{
		if( angle>=pAmzStatCell[i].mean-3 && angle<=pAmzStatCell[i].mean+3 )
		{
			iCls=i;
			break;
		}
	}
	return iCls;
}



void CFaultAzmDlg::OnButtonSave() 
{
	// TODO: Add your control notification handler code here
	static char BASED_CODE szFilter[]="统计结果(*.txt)|*.txt||";
	LPCTSTR lpstrDefExt="txt";
	LPCTSTR lpszFileName ="*.txt";
	CFileDialog dlg(false,lpstrDefExt,lpszFileName,
	                OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|
					OFN_OVERWRITEPROMPT |
					OFN_EXPLORER ,
	                szFilter,NULL);
	//文件对话框的窗口标题
	dlg.m_ofn.lpstrTitle="保存裂隙倾向统计结果文件";

	if(dlg.DoModal()!=IDOK)
		return;	
	//读文件
	FILE *fp;
	int i;
	if((fp=fopen(dlg.GetPathName(),"w"))==NULL)
		return;
	
	fprintf(fp,"对%d个数据排序与差值\n",m_N);
	for (i=0; i < m_N; i++)
	{
		if( i==0 )
			fprintf(fp,"%.3lf\t\n",m_pdatSort[i]);
		else
			fprintf(fp,"%.3lf\t%.3lf\n",
				m_pdatSort[i],m_pdatdAB[i]);
	}
	int nCls = m_uiaClsPos.GetSize()+1;
	fprintf(fp,"当阀值=%.2lf,分组数=%d\n",m_f,nCls);
	fprintf(fp,"组别\t数目\t百分比(%%)\t最小值\t最大值\t平均值\t标准差\n");
	for( i=0; i<nCls; i++)
	{
		fprintf(fp,"第%d组\t%d\t%.3lf\t%.3lf\t%.3lf\t%.3lf\t%.3lf\n",
		i,
		m_pAmzStatCell[i].n,m_pAmzStatCell[i].per,
		m_pAmzStatCell[i].min,m_pAmzStatCell[i].max,
		m_pAmzStatCell[i].mean,m_pAmzStatCell[i].stdvar);

	}
	fclose(fp);
}

⌨️ 快捷键说明

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