先上個(gè)最終的效果動(dòng)態(tài)圖翻斟,
~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~
1忍法、首先我們要自定義一個(gè)相機(jī)界面诬留,可以用AVCaptureSession來自定義护姆,不需要其他按鈕汇荐,只有一個(gè)預(yù)覽的界面;
2棍厌、我們要畫一個(gè)簡(jiǎn)單的雷達(dá)圖肾胯,可以用CGContextRef來簡(jiǎn)單實(shí)現(xiàn),雷達(dá)圖用來顯示你跟你附近的用戶(物體)的距離耘纱,通過跟實(shí)際物體的經(jīng)緯度來算兩點(diǎn)之間的距離敬肚,通過一定的比例來映射到雷達(dá)圖上,兩點(diǎn)之間的距離計(jì)算公式如下:
//兩點(diǎn)的經(jīng)緯度計(jì)算距離
-(float)DistanceFromCoordinates:(CLLocationCoordinate2D)?myDotother:(CLLocationCoordinate2D)otherDot
{
doubleEARTH_RADIUS?=6378137.0;
doubleradLat1=?(myDot.latitude*?M_PI?/180.0);
doubleradLat2=?(otherDot.latitude*?M_PI?/180.0);
doublea?=?radLat1-?radLat2;
doubleb?=?(myDot.longitude-?otherDot.longitude)?*?M_PI?/180.0;
doubles?=22*?asin(sqrt(pow(sin(a?/2),2)
+?cos(radLat1)?*?cos(radLat2)
*?pow(sin(b?/2),2)));
s?=s*?EARTH_RADIUS;
s?=?round(s*10000)?/10000;
returns;
}
要算物體在雷達(dá)圖上的顯示位置束析,根據(jù)三角函數(shù)艳馒,sinA=對(duì)邊/斜邊,cosA=鄰邊/斜邊,斜邊我們已經(jīng)有了员寇,就是兩點(diǎn)之間的距離弄慰,那么我們就需要知道一個(gè)角度,才能算出一條邊蝶锋,通過這條邊跟半徑的加減陆爽,就可以算出這個(gè)物體在雷達(dá)圖上的位置。所以我們先要算兩點(diǎn)的方位角扳缕,看下面的一張圖:
這個(gè)維基上的一張方位角的解釋圖慌闭,我們可以同通過tan2函數(shù)來計(jì)算别威,公式如下:
-?(float)getHeadingForDirectionFromCoordinate:(CLLocationCoordinate2D)fromLoctoCoordinate:(CLLocationCoordinate2D)toLoc
{
floatfLat?=?DegreesToRadians(fromLoc.latitude);
floatfLng?=?DegreesToRadians(fromLoc.longitude);
floattLat?=?DegreesToRadians(toLoc.latitude);
floattLng?=?DegreesToRadians(toLoc.longitude);
floatdegree?=?RadiansToDegrees(atan2(sin(tLng-fLng)*cos(tLat),?cos(fLat)*sin(tLat)-sin(fLat)*cos(tLat)*cos(tLng-fLng)));
if(degree?>=0)?{
returndegree;
}else{
return(360+degree);
}
}
3、要實(shí)現(xiàn)雷達(dá)圖跟隨手機(jī)旋轉(zhuǎn)而轉(zhuǎn)動(dòng)驴剔,這里我們要用到指南針的原理省古,通過CLLocationManager管理類,里面有個(gè)CLHeading類仔拟,我們可以實(shí)現(xiàn)指南針衫樊,看這個(gè)類的結(jié)構(gòu):
里面有真北,磁北利花,還有磁力值在x,y,z三軸上的磁力值科侈,不過當(dāng)我用到這三個(gè)值的時(shí)候,發(fā)現(xiàn)有問題炒事,在前后移動(dòng)手機(jī)的時(shí)候臀栈,發(fā)現(xiàn)這個(gè)值變化有停頓,如果用這個(gè)值來實(shí)現(xiàn)移動(dòng)會(huì)導(dǎo)致不流暢挠乳,所以我又用了陀螺儀數(shù)據(jù)权薯,通過CMMotionManager這個(gè)管理類來獲取手機(jī)移動(dòng)擺動(dòng)的角度,用來計(jì)算手機(jī)前后移動(dòng)的時(shí)候睡扬,物體在手機(jī)界面上下的位置盟蚣。
-(void)?startMotion
{
if(![_mgrisDeviceMotionActive]?&&?[_mgrisDeviceMotionAvailable])
{
//設(shè)置采樣間隔
_mgr.deviceMotionUpdateInterval=0.1;
NSOperationQueue*queue?=?[[NSOperationQueuealloc]init];
[_mgrstartDeviceMotionUpdatesToQueue:queue
withHandler:^(CMDeviceMotion*?_Nullable?motion,
NSError*?_Nullable?error)?{
doublegravityX?=?motion.gravity.x;
doublegravityY?=?motion.gravity.y;
doublegravityZ?=?motion.gravity.z;
if(gravityY<=0&&?gravityY>=-1)
{
//獲取手機(jī)的傾斜角度(zTheta是手機(jī)與水平面的夾角,?xyTheta是手機(jī)繞自身旋轉(zhuǎn)的角度):
zTheta?=?atan2(gravityZ,sqrtf(gravityX*gravityX+gravityY*gravityY))/M_PI*180.0;
}
[[NSOperationQueuemainQueue]addOperationWithBlock:^{
[selfupdataPoint];
}];
//[self?performSelectorOnMainThread:@selector(updataPoint)?withObject:nil?waitUntilDone:NO];
}];
}
}
4卖怜、通過計(jì)算角度區(qū)間來顯示手機(jī)上的物體顯示還隱藏屎开,也就是說在雷達(dá)圖上的點(diǎn)進(jìn)入扇形可見的區(qū)域就顯示出物體并且移動(dòng),超出就隱藏起來马靠。還有一點(diǎn)奄抽,就是要算碰撞檢測(cè)的手機(jī)上物體與物體如果太多,就不能疊在一起甩鳄,通過錯(cuò)位錯(cuò)開來逞度,可以通過CGRectIntersectsRect來寫個(gè)算法檢測(cè)兩個(gè)矩形是否碰到了,
簡(jiǎn)單說了下我實(shí)現(xiàn)的原理妙啃,當(dāng)然實(shí)際做的時(shí)候會(huì)遇到很多問題档泽,,揖赴,茁瘦,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~