地图区域划分转换成数学模型解决问题
计算机与数学是息息相关的,计算机模型中无时无刻不体现数学的理念。例如余弦定理用来求两个文案的相似度。今天我这里解决的问题也与数学有关。实际需求是这样的,在项目当中,需要人工在百度地图中划分配送区域,要求划分出来的区域不能是杂乱无章的,即线段与线段之间不能相穿。当时接到这个需求有点懵逼,如何是好,开完会坐下来,慢慢画图发现划出的图形只要是凹凸多边形即可,突然茅塞顿开,问题迎刃而解,因为规则的凹凸多边形的顶点数与边数相等,根据这段理念简单写了一段验证,结果验证无误。
用对象的方式实现代码逻辑:<?php/***平面点**ClassPoint2D*/classPoint2D{public$x;public$y;publicfunction__construct($x,$y){$this->x=$x;$this->y=$y;}publicfunction__toString(){return"({$this->x},{$this->y})";}}/***平面线**ClassLine2D*/classLine2D{/***@varPoint2D*/public$p1;/***@varPoint2D*/public$p2;publicfunction__construct(Point2D$p1,Point2D$p2){$this->p1=$p1;$this->p2=$p2;}publicfunction__toString(){return"({$this->p1},{$this->p2})";}}/***平面向量**ClassVector*/classVectorextendsLine2D{/***向量**@varPoint2D*/public$v;publicfunction__construct(Point2D$p1,Point2D$p2){parent::__construct($p1,$p2);$this->v=newPoint2D($p2->x-$p1->x,$p2->y-$p1->y);}publicfunction__toString(){return"({$this->p1}->{$this->p2})";}/***向量叉积**@paramVector$v1*@paramVector$v2*@returnVector*/publicstaticfunctionmul(Vector$v1,Vector$v2){return$v1->v->x*$v2->v->y-$v2->v->x*$v1->v->y;}}publicfunctioncheckMapIsRegular($aPoint){$aFormatPoint=array();$aFormatLine=array();try{if($aPoint){//拆分出坐标点,初始化坐标对象foreach($aPointas$item){list($pointX,$pointY)=explode(',',$item);$aFormatPoint[]=array('x'=>$pointX,'y'=>$pointY);}//按顺序构成矢量线$index=count($aFormatPoint)-1;foreach($aFormatPointas$key=>$point){$aFormatLine[]['start']=$point;if($index==$key){$aFormatLine[$key]['end']=$aFormatPoint[0];}else{$aFormatLine[$key]['end']=$aFormatPoint[$key+1];}}$aOutPoint=$aFormatLine;$edgeCount=0;$vertexCount=count($aOutPoint);array_shift($aFormatLine);//两两求交点foreach($aOutPointas$key=>$aLine){if(empty($aFormatLine)){continue;}foreach($aFormatLineas$innerKey=>$aInnerLine){//初始化坐标对象$oAPointStart=newPoint2D($aOutPoint[$key]['start']['x'],$aOutPoint[$key]['start']['y']);$oAPointEnd=newPoint2D($aOutPoint[$key]['end']['x'],$aOutPoint[$key]['end']['y']);$oBPointStart=newPoint2D($aFormatLine[$innerKey]['start']['x'],$aFormatLine[$innerKey]['start']['y']);$oBPointEnd=newPoint2D($aFormatLine[$innerKey]['end']['x'],$aFormatLine[$innerKey]['end']['y']);//两两画出矢量线$vector=newVector($oAPointStart,$oAPointEnd);$vABStart=newVector($oAPointStart,$oBPointStart);$vABEnd=newVector($oAPointStart,$oBPointEnd);$isInterSect1=false;$isInterSect2=false;if(Vector::mul($vABStart,$vector)*Vector::mul($vABEnd,$vector)<=0){$isInterSect1=true;}$oppositeVector=newVector($oBPointStart,$oAPointStart);$oVABStart=newVector($oBPointStart,$oAPointEnd);$oVABEnd=newVector($oBPointStart,$oBPointEnd);if(Vector::mul($oppositeVector,$oVABEnd)*Vector::mul($oVABStart,$oVABEnd)<=0){$isInterSect2=true;}if($isInterSect1&&$isInterSect2){$edgeCount+=1;}}array_shift($aFormatLine);}}if($edgeCount==$vertexCount){returntrue;}else{returnfalse;}}catch(\Exception$e){return$e->getMessage();}}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。