/** *description:计算球面一点到一条路径的距离 *param: double double 点坐标 int 边标号 double* 最近点距离边的前端点距离 double* 道路长度 *return:地球面距离,单位米 */ double nodeToEdgeDistanceAndNodeSide(double nodeX,double nodeY,int edgeId,double *sideLen,double *roadLen){ int i,j; double tmpSideLen=0,tmpRoadLen=0; double result=1e80,tmp=0; for (i=edgeStart[edgeId];i<edgeStart[edgeId+1];++i){ double x=coordNet[i << 1],y=coordNet[(i << 1)+1],x2=coordNet[(i << 1)+2],y2=coordNet[(i << 1)+3]; double dist=circleDistance(x,y,nodeX,nodeY); if (dist<result){ result=dist; tmpSideLen=tmp; } if (i<edgeStart[edgeId+1]-1) { double vecX1=x2-x,vecY1=y2-y, vecX2=nodeX-x,vecY2=nodeY-y, vecX3=nodeX-x2,vecY3=nodeY-y2; if (vecX1*vecX2+vecY1*vecY2>0 && -vecX1*vecX3-vecY1*vecY3>0 && (vecX1!=0 || vecY1!=0)){ double rate=((nodeX-x2)*vecX1+(nodeY-y2)*vecY1)/(-vecX1*vecX1-vecY1*vecY1); double nearX=rate*x+(1-rate)*x2,nearY=rate*y+(1-rate)*y2; double dist=circleDistance(nearX,nearY,nodeX,nodeY); if (dist<result){ result=dist; tmpSideLen=tmp+circleDistance(x,y,nearX,nearY); } } tmpRoadLen+=circleDistance(x,y,x2,y2); } tmp+=circleDistance(x,y,x2,y2); } *sideLen=tmpSideLen; *roadLen=tmpRoadLen; return result; }
bool Rect::intersectsCircle(const cocos2d::Vec2 ¢er, float radius) const { Vec2 rectangleCenter((origin.x + size.width / 2), (origin.y + size.height / 2)); float w = size.width / 2; float h = size.height / 2; float dx = fabs(center.x - rectangleCenter.x); float dy = fabs(center.y - rectangleCenter.y); if (dx > (radius + w) || dy > (radius + h)) { return false; } Vec2 circleDistance(fabs(center.x - origin.x - w), fabs(center.y - origin.y - h)); if (circleDistance.x <= (w)) { return true; } if (circleDistance.y <= (h)) { return true; } float cornerDistanceSq = powf(circleDistance.x - w, 2) + powf(circleDistance.y - h, 2); return (cornerDistanceSq <= (powf(radius, 2))); }
bool FGAFRect::IntersectsCircle(const FVector2D ¢er, float radius) const { FVector2D rectangleCenter((Origin.X + Size.Width / 2), (Origin.Y + Size.Height / 2)); float w = Size.Width / 2.f; float h = Size.Height / 2.f; float dx = FMath::Abs(center.X - rectangleCenter.X); float dy = FMath::Abs(center.Y - rectangleCenter.Y); if (dx > (radius + w) || dy > (radius + h)) { return false; } FVector2D circleDistance(FMath::Abs(center.X - Origin.X - w), FMath::Abs(center.Y - Origin.Y - h)); if (circleDistance.X <= (w)) { return true; } if (circleDistance.Y <= (h)) { return true; } float cornerDistanceSq = FMath::Pow(circleDistance.X - w, 2.f) + FMath::Pow(circleDistance.Y - h, 2.f); return (cornerDistanceSq <= (FMath::Pow(radius, 2.f))); }
//给定相对于某条边的偏移,返回经纬度实数值 void getPosition(int edgeId, double bias, double* resX, double* resY) { int i; for (i=edgeStart[edgeId];i<edgeStart[edgeId+1];++i){ double x=coordNet[i << 1],y=coordNet[(i << 1)+1],x2=coordNet[(i << 1)+2],y2=coordNet[(i << 1)+3]; double dist=circleDistance(x,y,x2,y2); if (dist<bias) bias -= dist; else { double rate = bias / dist; *resX = x + (x2 - x) * rate; *resY = y + (y2 - y) * rate; return; } } }