亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? netlayer.cpp

?? 北京市交通mo+visual c++開發(fā)實(shí)例
?? CPP
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
#include "StdAfx.h"
#include "netlayer.h"
#include "MoRecordset.h"
#include <math.h>
#include "MoLine.h"
#include "MoField.h"
#include "MoFields.h"
#include "MoPoints.h"
#include "MoPoint.h"
#include "MoParts.h"
#include "MainFrm.h"
#include "AppApi.h"

//-----------------------------------------------------------------------------------------
NetLine::NetLine(CMoMapLayer layer)
{
	m_layer = layer;
}
//-----------------------------------------------------------------------------------------
NetLine::~NetLine()
{
	m_pCoords.RemoveAll();
}
//-----------------------------------------------------------------------------------------
// 計(jì)算線的幾何長(zhǎng)度
double NetLine::CalcLength()
{
	double	dLength = 0.0 ;		// 保存計(jì)算出的線幾何長(zhǎng)度的結(jié)果
	int		loop ;				// 保存循環(huán)計(jì)數(shù)
    
	// 檢查線的有效性
	if ( m_pCoords.GetCount() < 2 )
		return 0.0 ;
	// 計(jì)算線的幾何長(zhǎng)度
	double	dist = 0.0 ;
	for ( loop = 1 ; loop<m_pCoords.GetCount(); loop ++ )
	{
		NetPoint PrePoint = (NetPoint)m_pCoords.GetAt(m_pCoords.FindIndex(loop -1));
		NetPoint CurPoint = (NetPoint)m_pCoords.GetAt(m_pCoords.FindIndex(loop));
		dist = sqrt( (PrePoint.x - CurPoint.x) * (PrePoint.x - CurPoint.x) +
			         (PrePoint.y - CurPoint.y) * (PrePoint.y - CurPoint.y)) ;
		dLength += dist ;
	}
	
	return dLength ;
}
//-----------------------------------------------------------------------------------------
// 通過線的id得到線數(shù)據(jù)
BOOL NetLine::GetLineData(int id)
{
	char buf[20];
	itoa(id, buf, 10);
	CMoRecordset rs;
	rs = m_layer.SearchExpression("GeoID = " + CString(buf));
    
	if (!rs)
		return FALSE;
    
	rs.MoveFirst(); 
	if (rs.GetEof())
		return FALSE;
    
	CMoLine line(rs.GetFields().Item(COleVariant("shape")).GetValue().pdispVal);
	CMoPoints pts = line.GetParts().Item(COleVariant(long(0), VT_I4));
	m_pCoords.RemoveAll();
    
	for (long i = 0; i<pts.GetCount(); i ++)
	{
		NetPoint pt;
		CMoPoint moPt(pts.Item(COleVariant(i, VT_I4)));
		pt.x = moPt.GetX();
		pt.y = moPt.GetY();
		m_pCoords.AddTail(pt); 
	}
    
	return true;
}
//-----------------------------------------------------------------------------------------
// 得到距離某點(diǎn)最近的線段,返回該線段的id
int NetLine::GetNearestLineData( double x, double y)
{
	CMoRecordset rs = m_layer.GetRecords();
	CMoPoint pt;
	pt.CreateDispatch(_T("MapObjects2.Point"));
	pt.SetX(x);
	pt.SetY(y);

	double	dDist = 9999999;
	int		id = -1;
    
	rs.MoveFirst(); 
	while(!rs.GetEof())
	{
		CMoFields fields(rs.GetFields());
		CMoField shapeField(fields.Item(COleVariant("shape")));
		CMoLine line(shapeField.GetValue().pdispVal);
		double d = line.DistanceTo(pt);   					
        
		if (dDist > d)
		{
			dDist = d;
			CString szValue = fields.Item(COleVariant("Geoid")).GetValueAsString();
			id = atoi(szValue);
		}
		rs.MoveNext(); 
	}
    
	if (id != -1)
	{
		if (!GetLineData(id))
			return -1;
	}
	return id;
}
//-----------------------------------------------------------------------------------------
// 判斷兩點(diǎn)是否重合
BOOL NetLine::IsPtCoincide( NetPoint ptFirst, NetPoint ptSecond)
{
	if ( fabs(ptFirst.x - ptSecond.x ) <= 0.00000001 
		&& fabs(ptFirst.y - ptSecond.y ) <= 0.00000001 )
		return TRUE;
	return FALSE;
}
//-----------------------------------------------------------------------------------------
// 得到最鄰近的點(diǎn)
void NetLine::GetNearestPoint(NetPoint ptP, NetPoint ptA, NetPoint ptB, 
							  NetPoint* ptNearest, double* dDistance )
{
	double Px,Py,Ax,Ay,Bx,By;
	double AB2,PA2,PB2,AB,PA,PB,S,AREA ;
	double med,med1,k1,k2,b1,b2 ;
    
	*dDistance = 0;
    
	if ( IsPtCoincide(ptA,ptB) )
	{
		ptNearest->x = ptA.x;
		ptNearest->y = ptA.y;
		return ;
	}
    
	Px = ptP.x ;
	Py = ptP.y ;
	Ax = ptA.x ;
	Ay = ptA.y ;
	Bx = ptB.x ;
	By = ptB.y ;
	AB2 = (Ax - Bx) * (Ax - Bx) + (Ay - By) * (Ay - By) ;
	PB2 = (Px - Bx) * (Px - Bx) + (Py - By) * (Py - By) ;
	PA2 = (Ax - Px) * (Ax - Px) + (Ay - Py) * (Ay - Py) ;	

	if(PA2 + AB2 < PB2 || AB2 + PB2 < PA2)	
	{                       
		if(PA2 > PB2)
		{
			med = PB2 ;
			ptNearest->x = Bx ;
			ptNearest->y = By ;
		}
		else
		{
			med = PA2 ;
			ptNearest->x = Ax ;
			ptNearest->y = Ay ;
		}
		med = sqrt(med) ;	
		*dDistance = med ;
		return ;
	}
    
	if (PA2 < 0.00000001 || PB2 < 0.00000001)
	{
		if(PA2 < 0.00000001)
		{
			med = sqrt(PA2) ;
			*dDistance = med ;
			ptNearest->x = Ax ;
			ptNearest->y = Ay ;
			return ;
		}
		else 
		{
			med = sqrt(PB2) ;
			*dDistance = med ;
			ptNearest->x = Bx ;
			ptNearest->y = By ;
			return ;
		}
	}
    
	AB = sqrt(AB2) ;
	PA = sqrt(PA2) ;
	PB = sqrt(PB2) ;
	S = (AB + PA + PB) / 2.0 ;
	AREA = S ;
	AREA *= (S - PA) ;
	AREA *= (S - PB) ;
	AREA *= (S - AB) ;
	AREA = sqrt(AREA) ;
	med = (2.0 * AREA) / AB ;
	*dDistance = med ;
    
	med = Ay - By ;
	med1 = Ax - Bx ;
	if(fabs(med) < 0.00000001 || fabs(med1) < 0.00000001)		
	{	
		if(fabs(med) < 0.00000001)
		{
			ptNearest->x = Px ;
			ptNearest->y = Ay ;
		}
		else
		{
			ptNearest->y = Py ;
			ptNearest->x = Ax ;
		}
	}
	else
	{	
		k1 = (Ay - By) / ( Ax - Bx) ;	
		k2 = -1.0 / k1 ;			
		b1 = Ay - k1 * Ax ;
		b2 = Py - k2 * Px ;
		S = (b2 - b1) / (k1 - k2) ;
		ptNearest->x = S ;
		S = k1 * S + b1 ;
		ptNearest->y = S ;
	}
}
//-----------------------------------------------------------------------------------------
// 得到最鄰近的點(diǎn)
void NetLine::GetNearestPoint(NetPoint point, NetPoint* ptNearestPoint, 
							  int* nSegmentIndex, double* dLeastDistance)
{
	int nPointNum = m_pCoords.GetCount();			
	double dDistance;
	NetPoint ptTemp;
    
	NetPoint firstPt = m_pCoords.GetAt(m_pCoords.FindIndex(0));
	NetPoint secondPt = m_pCoords.GetAt(m_pCoords.FindIndex(1));
	GetNearestPoint( point, firstPt, secondPt, ptNearestPoint, dLeastDistance);
	nSegmentIndex = 0 ;
	
	// 遍歷每一條弧段來搜索最近的點(diǎn)
	int nIndex ;
	for(nIndex = 1 ; nIndex<nPointNum-1 ; nIndex ++ ) 
	{		
		// 得到最近的點(diǎn)
		GetNearestPoint(point, m_pCoords.GetAt(m_pCoords.FindIndex(0)), 
			m_pCoords.GetAt(m_pCoords.FindIndex(1)), &ptTemp, &dDistance ) ;
        
		// 比較最小的距離
		if( dDistance < *dLeastDistance )
		{
			*dLeastDistance = dDistance ;
			ptNearestPoint->x = ptTemp.x; 
			ptNearestPoint->y = ptTemp.y;
			*nSegmentIndex = nIndex ;
		}
	}
}
//-----------------------------------------------------------------------------------------
// 獲得根據(jù)給定點(diǎn)分裂線得到的兩個(gè)部分的比例, 但并不真正分裂線
// 參數(shù)point: 給定點(diǎn)
// 參數(shù)ptNearestPoint: 分裂線時(shí)的分裂點(diǎn) (返回)
// 參數(shù)dRatio: 起始結(jié)點(diǎn)部分的比例 (返回)
BOOL NetLine::GetSplitRatioByNearestPoint(NetPoint point, NetPoint* ptNearest, 
										  double* dRatio)
{
	int nIndex = 0;
	double dDistance = 0.0;
    
	int nPointNum = m_pCoords.GetCount();
	// 首先得到最近的點(diǎn)和線段索引
	GetNearestPoint(point, ptNearest, &nIndex, &dDistance );
	
	// 檢查線上最近的點(diǎn)是否與首尾點(diǎn)相重合
	if( nIndex == 0 )
	{
		if( IsPtCoincide(*ptNearest, m_pCoords.GetAt(m_pCoords.FindIndex(0))))
		{
			dRatio = 0;
			return true;
		}
	}

	if( nIndex == nPointNum-2 )
	{
		if( IsPtCoincide(*ptNearest, m_pCoords.GetAt(
			             m_pCoords.FindIndex(nPointNum-1))))
		{
			*dRatio = 1.0;
			return true;
		}
	}
    
	// 計(jì)算分裂出來的第二條線的長(zhǎng)度
	int nLoop;
	double dLength = 0;
	// 如果最近點(diǎn)與本線上的下一點(diǎn)不重合,則需將最近點(diǎn)計(jì)算在內(nèi)
	if ( !IsPtCoincide(*ptNearest, m_pCoords.GetAt(m_pCoords.FindIndex(nIndex+1))))
	{
		NetPoint PostPoint = m_pCoords.GetAt(m_pCoords.FindIndex(nIndex+1));
		dLength += sqrt( ( PostPoint.x - ptNearest->x ) * ( PostPoint.x - ptNearest->x ) + 
			( PostPoint.y - ptNearest->y ) * ( PostPoint.y - ptNearest->y ));
	}
	
	for( nLoop = nIndex+2; nLoop<nPointNum; nLoop ++ )
	{
		NetPoint CurPoint = m_pCoords.GetAt(m_pCoords.FindIndex(nLoop));
		NetPoint PrePoint = m_pCoords.GetAt(m_pCoords.FindIndex(nLoop-1));
		dLength += sqrt( ( CurPoint.x - PrePoint.x ) * ( CurPoint.x - PrePoint.x ) + 
			             ( PrePoint.y - PrePoint.y ) * ( PrePoint.y - PrePoint.y ));
	}
    
	*dRatio = 1.0 - dLength / CalcLength();
	return true;
}
//-----------------------------------------------------------------------------------------
// 加入一個(gè)連接的弧段(調(diào)用前需確定弧段是連接在該點(diǎn)上的)
BOOL NetNode::Add(int nLink, double dAngle )
{
	// 結(jié)點(diǎn)連接的弧段按角度排序
	int i = 0;
	for(i=0; i<m_arrLinks.GetCount(); i++ )
	{
		if(dAngle < m_arrLinks.GetAt(m_arrLinks.FindIndex(i)).fAngle )
			break;
	}
	
	NetEdge pEdge;
	pEdge.nLink = nLink;
	pEdge.fAngle = (float)dAngle;
	m_arrLinks.InsertBefore(m_arrLinks.FindIndex(i), pEdge );
    
	return true;
}
//-----------------------------------------------------------------------------------------
// 刪除一個(gè)已連接的弧段
BOOL NetNode::Remove( int nLink )
{
	for(int i=0; i<m_arrLinks.GetCount(); i++ )
	{
		if ( nLink == m_arrLinks.GetAt(m_arrLinks.FindIndex(i)).nLink )
		{
			m_arrLinks.RemoveAt(m_arrLinks.FindIndex(i));
			break;
		}
	}
	return true;
}
//-----------------------------------------------------------------------------------------
// 得到一個(gè)連接弧段的角度
double NetNode::GetLinkAngle( int nLink )
{
	for(int i=0; i<m_arrLinks.GetCount(); i++ )
	{
		if ( nLink == m_arrLinks.GetAt(m_arrLinks.FindIndex(i)).nLink )
		{
			return m_arrLinks.GetAt(m_arrLinks.FindIndex(i)).fAngle;
		}
	}
	return -1;
}
//-----------------------------------------------------------------------------------------
// 構(gòu)造函數(shù)
NetLink::NetLink()
{
	m_GeoID = -1;
	m_nFNode = -1;
	m_nTNode = -1;
	m_fLength = 0;
	m_fFromImp = 0;
	m_fToImp = 0;
}
//-----------------------------------------------------------------------------------------
// 拷貝另一弧段的數(shù)據(jù)
void NetLink::Copy( NetLink link )
{
	m_GeoID = link.m_GeoID;
	m_nFNode = link.m_nFNode;
	m_nTNode = link.m_nTNode;
	m_fLength = link.m_fLength;
	m_fFromImp = link.m_fFromImp;
	m_fToImp = link.m_fToImp;
}
//-----------------------------------------------------------------------------------------
// 判斷兩弧段是否是同一弧段
BOOL NetLink::IsEqual( NetLink link )
{
	return m_GeoID == link.m_GeoID;
}
//-----------------------------------------------------------------------------------------
BOOL NetLinkBackup::Add(int nSeg, double dRatio)
{
	int i = 0;
	for(i = 0; i<m_arrSegs.GetCount(); i++ )
	{
		if (dRatio < m_arrSegs.GetAt(m_arrSegs.FindIndex(i)).dRatio )
			break;
	}
	
	NetLinkSeg pSeg;
	pSeg.nSegID = nSeg;
	pSeg.dRatio = dRatio;
	m_arrSegs.InsertBefore(m_arrSegs.FindIndex(i), pSeg);
    
	return true;
}
//-----------------------------------------------------------------------------------------
CNetLayer::CNetLayer(CMoMapLayer layer)
{
	m_nLinkNum = 0;
	m_nNodeNum = 0;
	m_pPath = NULL;
	m_layer = layer;
}
//-----------------------------------------------------------------------------------------
CNetLayer::~CNetLayer(void)
{
	if(m_pPath)
	{
		delete m_pPath;
		m_pPath = NULL;
	}
}
//-----------------------------------------------------------------------------------------
BOOL CNetLayer::ReadNetTable()
{
	CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
	CDaoDatabase* tmpDB = new CDaoDatabase;
	try
	{
		tmpDB->Open(pMainWnd->m_environment.m_szDBName);
	}
	catch (CDaoException* e)
	{
		DisplayDaoException(e);
		delete tmpDB;
		e->Delete();
		return FALSE;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久国产综合精品女国产盗摄| 欧美专区亚洲专区| 秋霞午夜av一区二区三区| 一区二区在线电影| 中文字幕制服丝袜成人av| 久久蜜桃一区二区| 久久亚洲捆绑美女| 久久这里只有精品首页| 精品美女在线播放| 久久众筹精品私拍模特| 久久久久久久久99精品| www亚洲一区| 久久九九国产精品| 久久精品在线观看| 中文字幕在线不卡视频| 亚洲视频图片小说| 一区二区三区影院| 香蕉成人啪国产精品视频综合网 | www欧美成人18+| 精品国产成人系列| 日本一区二区综合亚洲| 国产精品久久看| 亚洲私人影院在线观看| 一区二区三区欧美在线观看| 亚瑟在线精品视频| 亚洲图片欧美一区| 美女国产一区二区| 国产精品一区二区在线观看不卡| 风间由美中文字幕在线看视频国产欧美| 国产精品一区二区免费不卡| 成人a区在线观看| 日本精品裸体写真集在线观看| 欧美日韩专区在线| 欧美videossexotv100| 国产欧美日韩在线| 亚洲黄色小视频| 日韩黄色免费电影| 国产精品911| 91在线国产福利| 欧美精品久久久久久久多人混战 | 乱一区二区av| 国产乱对白刺激视频不卡| 成人美女在线观看| 欧美视频中文字幕| 精品毛片乱码1区2区3区 | 青草av.久久免费一区| 国产精品18久久久久久久久 | 亚洲欧美一区二区在线观看| 丝袜亚洲另类欧美综合| av中文字幕不卡| 欧美三区在线视频| 一区二区三区不卡在线观看| 亚洲成人免费视频| 午夜视频一区在线观看| 国产91在线|亚洲| 26uuu亚洲综合色欧美| 国产精品久久久久久久久免费相片 | 精彩视频一区二区三区| 亚洲五码中文字幕| 日本视频免费一区| 免费国产亚洲视频| 欧美日本精品一区二区三区| 91精品国产aⅴ一区二区| 亚洲视频1区2区| 精品系列免费在线观看| 欧美日韩成人在线| 一区二区欧美精品| 色香蕉成人二区免费| 中文字幕在线观看一区| 成人aa视频在线观看| 国产日韩欧美一区二区三区乱码| 极品少妇xxxx精品少妇偷拍| 欧美一区二区三区成人| 日本免费新一区视频| jizzjizzjizz欧美| 国产亚洲午夜高清国产拍精品| 国内国产精品久久| 欧美激情一区二区三区| 成人看片黄a免费看在线| 中文幕一区二区三区久久蜜桃| 成人精品电影在线观看| 亚洲欧美综合色| 欧美高清hd18日本| 一区二区三区免费观看| 丁香婷婷深情五月亚洲| 精品免费视频.| 亚洲成人一区在线| 91视频91自| 亚洲裸体在线观看| 欧美剧在线免费观看网站| 视频一区二区三区入口| 日韩视频一区二区三区| 91福利视频在线| 久久精品72免费观看| 亚洲视频免费在线| 国产精品色哟哟| 精品日韩一区二区三区免费视频| 色综合久久88色综合天天免费| 成人小视频免费观看| 亚洲电影你懂得| www一区二区| 欧美日韩aaa| 欧美午夜精品一区二区蜜桃| 成人久久18免费网站麻豆 | 懂色一区二区三区免费观看| 亚洲大型综合色站| 中文字幕在线不卡一区| 精品国产成人在线影院 | 国产精品中文字幕欧美| 亚洲视频精选在线| 亚洲综合视频在线观看| 一区二区国产视频| 91捆绑美女网站| 国产91精品精华液一区二区三区 | 国产成人精品免费一区二区| 日本成人中文字幕在线视频| 亚洲高清一区二区三区| 国产精品日产欧美久久久久| 亚洲欧美偷拍三级| 七七婷婷婷婷精品国产| 国产成人精品免费网站| 在线亚洲人成电影网站色www| 欧美日韩一区二区三区四区五区 | 亚洲一区中文日韩| 亚洲欧美偷拍另类a∨色屁股| 亚洲免费观看高清在线观看| 一区二区三区精品在线观看| 一区二区三区四区av| 日韩精品色哟哟| 精品在线一区二区| 亚洲一区二区中文在线| 日本亚洲欧美天堂免费| 国产精品一区久久久久| 亚洲成人动漫av| 亚洲一区二区三区爽爽爽爽爽| 一区二区国产盗摄色噜噜| 五月天久久比比资源色| 五月激情六月综合| 丝袜亚洲精品中文字幕一区| 久久激情五月婷婷| 国产sm精品调教视频网站| 91蝌蚪porny| 717成人午夜免费福利电影| 精品日韩在线观看| 成人免费视频在线观看| 亚洲午夜三级在线| 精品中文字幕一区二区小辣椒 | 欧美日韩一区精品| 精品久久久久一区二区国产| 国产精品家庭影院| 日韩精品一级二级 | 中文字幕免费观看一区| 亚洲伊人色欲综合网| 国产成人午夜电影网| 欧美日韩在线观看一区二区| 国产色综合一区| 一区二区高清免费观看影视大全 | 欧美精品日韩精品| 亚洲国产高清在线观看视频| 日韩**一区毛片| 色菇凉天天综合网| 久久久精品天堂| 日韩成人一区二区三区在线观看| www.激情成人| 久久精品在线观看| 精品中文字幕一区二区小辣椒 | 色呦呦国产精品| 精品国精品国产| 亚洲成av人片在线| 一本一道波多野结衣一区二区| 亚洲伦理在线免费看| 国产成a人亚洲| 欧美一区二区三区视频在线观看 | 亚洲成a天堂v人片| 婷婷综合久久一区二区三区| 亚洲午夜免费电影| 奇米精品一区二区三区在线观看 | 欧美精品日韩一区| 中文字幕在线一区免费| 日韩精品在线看片z| 欧美午夜精品一区二区蜜桃| 盗摄精品av一区二区三区| 精品一区免费av| 日本v片在线高清不卡在线观看| 亚洲综合激情另类小说区| 国产日韩v精品一区二区| 一本大道久久a久久综合| 亚洲欧美福利一区二区| 国内外成人在线视频| 欧美性极品少妇| 中文一区一区三区高中清不卡| 亚洲国产视频在线| 欧美剧情电影在线观看完整版免费励志电影| 国产欧美日韩在线观看| 91视频com| 亚洲国产日日夜夜| 91亚洲永久精品| 久久精品人人做| 国产精品66部| 国产精品美女久久久久久久|