编程代码.docx
《编程代码.docx》由会员分享,可在线阅读,更多相关《编程代码.docx(83页珍藏版)》请在冰豆网上搜索。
编程代码
//DEG
voidCAngleTransDlg:
:
OnBnClickedOk()
{
//用于存放度、分、秒三个值的变量
intiDegree,iMin;
doubledSec;
//dDeg;//十进制角度(度),控件变量
//dDms;//度分秒格式角度,控件变量
UpdateData(true);
//注意ceil和floor两个取整函数的使用
iDegree=int(dDms);//截取整数部分,即度
iMin=int((dDms-iDegree)*100);//截取分
dSec=((dDms-iDegree)*100-iMin)*100;//获得秒
dDeg=iDegree+double(iMin)/60+dSec/3600;//把分和秒转换成度,再相加
UpdateData(false);
//OnOK();
}
//DMS
voidCAngleTransDlg:
:
OnBnClickedBtndms()
{
//用于存放度、分、秒三个值的变量
intiDegree,iMin;
doubledSec;
//dDeg;//十进制角度(度),控件变量
//dDms;//度分秒格式角度,控件变量
doubledTmp;//临时变量
UpdateData(true);
iDegree=int(dDeg);//截取度
dTmp=(dDeg-iDegree)*60;//把度的小数部分转换为分
iMin=int(dTmp);//截取分
dSec=(dTmp-iMin)*60;//把分的小数部分转换为秒
dDms=iDegree+double(iMin)/100+dSec/10000;//合并为度分秒形式
UpdateData(false);
}
voidCAngleTransDlg:
:
OnBnClickedCancel()
{
//TODO:
在此添加控件通知处理程序代码
OnCancel();
}-------------------------------------------------------------------------------------------
BOOLCForeInSectionPosDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//将“关于...”菜单项添加到系统菜单中。
//IDM_ABOUTBOX必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//设置此对话框的图标。
当应用程序主窗口不是对话框时,框架将自动
//执行此操作
SetIcon(m_hIcon,TRUE);//设置大图标
SetIcon(m_hIcon,FALSE);//设置小图标
//TODO:
在此添加额外的初始化代码
//在图片控件中显示前方交会示意图
CStatic*pPic=(CStatic*)GetDlgItem(IDC_STATIC);//通过ID获取图片控件
//定义位图句柄,并把位图资源加入其中
HBITMAPhBitmap=:
:
LoadBitmap(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
//设置PictureControl的样式,使其可以使用位图,并使位图居中
pPic->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
pPic->SetBitmap(hBitmap);//显示位图
//初始化文本框的文本内容
Xa=37477.54;
Ya=16307.24;
Xb=37327.20;
Yb=16078.90;
dAlfa=40.4157;
dBeta=75.1902;
UpdateData(false);
returnTRUE;//除非将焦点设置到控件,否则返回TRUE
}
voidCForeInSectionPosDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//如果向对话框添加最小化按钮,则需要下面的代码
//来绘制该图标。
对于使用文档/视图模型的MFC应用程序,
//这将由框架自动完成。
voidCForeInSectionPosDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND,reinterpret_cast(dc.GetSafeHdc()),0);
//使图标在工作区矩形中居中
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//绘制图标
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSORCForeInSectionPosDlg:
:
OnQueryDragIcon()
{
returnstatic_cast(m_hIcon);
}
#include
constdoublePI=3.1415926535897932;
voidCForeInSectionPosDlg:
:
OnBnClickedBtncompute()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(true);
intiDegree,iMin;
doubledSec,dDegAlfa,dDegBeta;
//把度分秒形式的Alfa角转换成十进制的度
iDegree=int(dAlfa);//截取整数部分,即度
iMin=int((dAlfa-iDegree)*100);//截取分
dSec=((dAlfa-iDegree)*100-iMin)*100;//获得秒
dDegAlfa=iDegree+double(iMin)/60+dSec/3600;//把分和秒转换成度,再相加
//把度分秒形式的Beta角转换成十进制的度
iDegree=int(dBeta);//截取整数部分,即度
iMin=int((dBeta-iDegree)*100);//截取分
dSec=((dBeta-iDegree)*100-iMin)*100;//获得秒
dDegBeta=iDegree+double(iMin)/60+dSec/3600;//把分和秒转换成度,再相加
//计算角a,b的反正切值
doubledCotA,dCotB;//角a与角b的反正切值
dCotA=1/tan(dDegAlfa/180*PI);
dCotB=1/tan(dDegBeta/180*PI);
//根据公式计算前方交会定位值
Xp=((Xa*dCotB+Xb*dCotA)+(Yb-Ya))/(dCotA+dCotB);
Yp=((Ya*dCotB+Yb*dCotA)+(Xa-Xb))/(dCotA+dCotB);
//显示计算结果
//UpdateData(false);
CStringstrXp,strYp;
strXp.Format(_T("%.3f"),Xp);//格式化显示结果,显示至小数点后三位
strYp.Format(_T("%.3f"),Yp);
SetDlgItemText(IDC_EDITXP,strXp);BOOL SetDlgItemText(
HWND hDlg,
int nIDDlgItem,
LPCTSTR lpString
);
Parameters
hDlg
[in] Handletothedialogboxthatcontainsthecontrol.
nIDDlgItem
[in] Specifiesthecontrolwithatitleortexttobeset.
lpString
[in] Pointertothenull-terminatedstringthatcontainsthetexttobecopiedtothecontrol.
SetDlgItemText(IDC_EDITYP,strYp);
}
voidCForeInSectionPosDlg:
:
OnBnClickedBtnclear()
{
//TODO:
在此添加控件通知处理程序代码
Xa=0;
Ya=0;
Xb=0;
Yb=0;
Xp=0;
Yp=0;
dAlfa=0;
dBeta=0;
UpdateData(false);
}------------------------------------------------------------------------
判断线段相交
typedefstruct
{
doublex;
doubley;
}HPOINT;
voidCLineSegCrossDlg:
:
OnBnClickedBtnjudge()
{
//TODO:
在此添加控件通知处理程序代码
HPOINTP1,P2,P3,P4;
UpdateData(true);
P1.x=dStartX1;
P1.y=dStartY1;
P2.x=dEndX1;
P2.y=dEndY1;
P3.x=dStartX2;
P3.y=dStartY2;
P4.x=dEndX2;
P4.y=dEndY2;
/*每个线段的两点都在另一个线段的左右不同侧,则能断定线段相交
公式对于向量(x1,y1)->(x2,y2),判断点(x3,y3)在向量的左边,右边,还是线上.
p=x1(y3-y2)+x2(y1-y3)+x3(y2-y1).p<0左侧,p=0线上,p>0右侧*/
doubled1,d2,d3,d4;
//判断线段的两个端点p1和p2是否在线段p3->p4的两侧
d1=P3.x*(P1.y-P4.y)+
P4.x*(P3.y-P1.y)+
P1.x*(P4.y-P3.y);
d2=P3.x*(P2.y-P4.y)+
P4.x*(P3.y-P2.y)+
P2.x*(P4.y-P3.y);
//判断线段的两个端点p3和p4是否在线段p1->p2的两侧
d3=P1.x*(P3.y-P2.y)+
P2.x*(P1.y-P3.y)+
P3.x*(P2.y-P1.y);
d4=P1.x*(P4.y-P2.y)+
P2.x*(P1.y-P4.y)+
P4.x*(P2.y-P1.y);
if(d1*d2<0&&d3*d4<0)//夸立试验
MessageBox(_T("相交"));
elseif(d1==0&&OnSegment(P3,P4,P1))//边缘检测p1在p3->p4线段上
MessageBox(_T("相交,p1在p3->p4线段上"));
elseif(d2==0&&OnSegment(P3,P4,P2))//边缘检测p2在p3->p4线段上
MessageBox(_T("相交,p2在p3->p4线段上"));
elseif(d3==0&&OnSegment(P1,P2,P3))//边缘检测p3在p1->p2线段上
MessageBox(_T("相交,p3在p1->p2线段上"));
elseif(d4==0&&OnSegment(P1,P2,P4))//边缘检测p4在p1->p2线段上
MessageBox(_T("相交,p4在p1->p2线段上"));
else
MessageBox(_T("不相交"));
}
//用于判断点Pk是否在线段Pi->Pj上。
//当d=0,则可判断点Pk在直线Pi->Pj上,需进一步判断是否在线段上
//具体算法为:
Pk的坐标是否在Pi和Pj的区间内;
boolCLineSegCrossDlg:
:
OnSegment(HPOINTPi,HPOINTPj,HPOINTPk)
{
doubleMinX,MinY,MaxX,MaxY;
if(Pi.x>Pj.x)
{
MinX=Pj.x;
MaxX=Pi.x;
}
else
{
MinX=Pi.x;
MaxX=Pj.x;
}
if(Pi.y>Pj.y)
{
MinY=Pj.y;
MaxY=Pi.y;
}
else
{
MinY=Pi.y;
MaxY=Pj.y;
}
if(Pk.x>=MinX&&Pk.x<=MaxX&&Pk.y>=MinY&&Pk.y<=MaxY)
returntrue;
else
returnfalse;
}-------------------------------------------------------------------------------
#include
voidCzuobiaozhuanhuanDlg:
:
OnBnClickedzhuanweikongjian()//大地坐标转为空间坐标
{
UpdateData(TRUE);
constdoublef=1/298.257223563;
constdoublea=6378137;
constdoublepi=3.141592654;
doubleN,e;
e=sqrt(2*f-f*f);
intDeg,Min,Deg1,Min1;
doubleSec,Sec1;
Deg=int(B);
Min=int((B-Deg)*100);
Sec=((B-Deg)*100-Min)*100;
B=Deg+double(Min)/60+Sec/3600;
Deg1=int(L);
Min1=int((L-Deg1)*100);
Sec1=((L-Deg1)*100-Min1)*100;
L=Deg1+double(Min1)/60+Sec1/3600;
N=a/sqrt(1-e*e*sin(B*pi/180)*sin(B*pi/180));
x=(N+H)*cos(B*pi/180)*cos(L*pi/180);
y=(N+H)*cos(B*pi/180)*sin(L*pi/180);
z=(N*(1-e*e)+H)*sin(B*pi/180);//偏心率
UpdateData(false);
}
voidCzuobiaozhuanhuanDlg:
:
OnBnClickedzhuanweidadi()//空间坐标转为大地坐标
{
UpdateData(true);
constdoublef=1/298.257223563;//扁率
constdoublea=6378137;//椭圆长半径
constdoublepi=3.14159265358979323846;
doublee;//卯酉圈半径
e=sqrt(2*f-f*f);
intDeg,Min,Deg1,Min1;
doubleSec,dTmp,Sec1,dTmp1;
//doubleB0=0;
doubleH0=0;
doubleH1,dH=1;
if(y>0&&x>0)
{
L=atan(y/x)*180/pi;
}
elseif(y>0&&x<0)
{
L=atan(y/x)*180/pi+180;
}
elseif(y<0&&x<0)
{
L=atan(y/x)*180/pi-180;
}
else
{
L=atan(y/x)*180/pi;
}
doubleB1=0,B2,N1,N2;
do
{
N1=a/sqrt(1-e*e*sin(B1)*sin(B1));
H0=(sqrt(x*x+y*y)/cos(B1))-N1;
B2=atan(z/(sqrt(x*x+y*y)*(1-e*e*N1/(N1+H0))));
//H1=H0;
N2=a/sqrt(1-e*e*(sin(B2))*(sin(B2)));
H1=(sqrt(x*x+y*y)/cos(B2))-N2;
//H0=H;
dH=H1-H0;
B1=B2;
H=H1;
}while(fabs(dH)>0.00000001);//只精确到小数点后五位误差较大
Deg=(int)(L);
dTmp=(L-Deg)*60;//把度的小数部分转换为分
Min=int(dTmp);//截取分
Sec=(dTmp-Min)*60;//把分的小数部分转换为秒
L=Deg+double(Min)/100+Sec/10000;//合并为度分秒形式
B=B2*180/pi;
Deg1=(int)(B);
dTmp1=(B-Deg1)*60;//把度的小数部分转换为分
Min1=int(dTmp1);//截取分
Sec1=(dTmp1-Min1)*60;//把分的小数部分转换为秒
B=Deg1+double(Min1)/100+Sec1/10000;//合并为度分秒形式
UpdateData(false);
}
//TODO:
在此添加控件通知处理程序代码
voidCzuobiaozhuanhuanDlg:
:
OnBnClickedclear()
{
x=0;
y=0;
z=0;
B=0;
L=0;
H=0;
UpdateData(false);========================================================
Polygon.cpp
#include"StdAfx.h"
#include"Polygon.h"
#include"math.h"
CPolygon:
:
CPolygon(void)
{
pPointData=NULL;
iPointCount=0;
}
CPolygon:
:
CPolygon(intn)//重载构造函数
{
pPointData=newHPOINT[n];
iPointCount=n;
}
CPolygon:
:
~CPolygon(void)//析构函数
{
if(pPointData!
=NULL)
{
delete[]pPointData;
pPointData=NULL;
}
}
////设置第pos顶点(从开始)数据
boolCPolygon:
:
SetPoint(intpos,HPOINTp)
{
if(pos>=iPointCount)
{
returnfalse;
}
pPointData[pos]=p;
returntrue;
}
//设置第pos顶点(从开始)数据(重载)
//请思考:
如果改用逐点增加,如AddPoint()该怎么做?
怎样做效率高?
boolCPolygon:
:
SetPoint(intpos,doublex,doubley)
{
if(pos>=iPointCount)
{
returnfalse;
}
pPointData[pos].x=x;
pPointData[pos].y=y;
returntrue;
}
//获取第pos顶点(从开始)数据
boolCPolygon:
:
GetPoint(intpos,HPOINT&p)
{
if(pos>=iPointCount)
{
returnfalse;
}
p=pPointData[pos];
returntrue;
}
//设置多边形大小(改变顶点个