编程代码.docx

上传人:b****7 文档编号:16788016 上传时间:2023-07-17 格式:DOCX 页数:83 大小:35.95KB
下载 相关 举报
编程代码.docx_第1页
第1页 / 共83页
编程代码.docx_第2页
第2页 / 共83页
编程代码.docx_第3页
第3页 / 共83页
编程代码.docx_第4页
第4页 / 共83页
编程代码.docx_第5页
第5页 / 共83页
编程代码.docx_第6页
第6页 / 共83页
编程代码.docx_第7页
第7页 / 共83页
编程代码.docx_第8页
第8页 / 共83页
编程代码.docx_第9页
第9页 / 共83页
编程代码.docx_第10页
第10页 / 共83页
编程代码.docx_第11页
第11页 / 共83页
编程代码.docx_第12页
第12页 / 共83页
编程代码.docx_第13页
第13页 / 共83页
编程代码.docx_第14页
第14页 / 共83页
编程代码.docx_第15页
第15页 / 共83页
编程代码.docx_第16页
第16页 / 共83页
编程代码.docx_第17页
第17页 / 共83页
编程代码.docx_第18页
第18页 / 共83页
编程代码.docx_第19页
第19页 / 共83页
编程代码.docx_第20页
第20页 / 共83页
亲,该文档总共83页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

编程代码.docx

《编程代码.docx》由会员分享,可在线阅读,更多相关《编程代码.docx(83页珍藏版)》请在冰点文库上搜索。

编程代码.docx

编程代码

//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;

}

 

//设置多边形大小(改变顶点个

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 英语

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2