📄 faultazmdlg.cpp
字号:
/*
选择排序
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 + -