flex+BlazeDS关于军标的实现思路和算法
转:http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=57166 本帖最后由 _daniel 于 2009-11-12 22:26 编辑
/** ?? var dgbj_geometry:Array=getdbx_geometry(curvepoints); ? /** ?? * 这个函数是用来求多边行的各个点的 ?? * 他利用的原理就是求垂线的距离 ?? * @return ?? * ?? */ ? private function getdbx_geometry(curvepoints:Array):Array ? { ?? //定义上边曲线的点坐标数组(当确定军标多边形的时候我是从这个数组开始的) ?? var topcurepoints:Array=new Array(); ?? //定义下边曲线的点坐标数组 ?? var bottomcurepoints:Array=new Array(); ?? //定义左上测的直线 ?? var left_top_points:Array=new Array(); ?? //定义左下侧的直线 ?? var left_bottom_points:Array=new Array(); ?? //定义右上角边的数组 ?? var right_top_points:Array=new Array(); ?? //定义中轴线离上下两边的距离 ?? var dis:Number=(8 - map.level) * (8 - map.level) * 40; ?? //大的框架肯定是从0--1 ?? var c_length:Number=curvepoints.length; ?? for (var u:Number=0; u < curvepoints.length; u++) ?? { ??? if (u == 0) ??? { ???? continue; ??? } ??? else ??? { ???? var m_point:MapPoint=curvepoints; ???? var pos_x:Number=m_point.x; ???? var pos_y:Number=m_point.y; ???? //先求上一点的坐标 ???? var pre_point:MapPoint=curvepoints[u - 1]; ???? //进行计算取的上下边的点 ???? var pre_pos_x:Number=pre_point.x; ???? var pre_pos_y:Number=pre_point.y; ???? var slope:Number=(pos_y - pre_pos_y) / (pos_x - pre_pos_x); ???? //上边点确定 ???? var bb:Number=dis * (1 - u / c_length * 0.9); ???? var cos_number:Number=Math.cos(Math.atan(slope) - Math.PI / 2); ???? var sin_number:Number=Math.sin(Math.atan(slope) - Math.PI / 2); ???? var top_pos_x:Number=0.0; ???? var top_pos_y:Number=0.0; ???? //下面分四种情况画线。 ???? if (pre_pos_x <= pos_x && pre_pos_y <= pos_y) ???? { ????? top_pos_x=pre_pos_x - ((bb * cos_number) < 0 ? (-bb * cos_number) : (bb * cos_number)); ????? top_pos_y=pre_pos_y + ((bb * sin_number) < 0 ? (-bb * sin_number) : (bb * sin_number)); ???? } ???? else if (pre_pos_x <= pos_x && pre_pos_y > pos_y) ???? { ????? top_pos_x=pre_pos_x + ((bb * cos_number) < 0 ? (-bb * cos_number) : (bb * cos_number)); ????? top_pos_y=pre_pos_y + ((bb * sin_number) < 0 ? (-bb * sin_number) : (bb * sin_number)); ???? } ???? else if (pre_pos_x >= pos_x && pre_pos_y >= pos_y) ???? { ????? top_pos_x=pre_pos_x + ((bb * cos_number) < 0 ? (-bb * cos_number) : (bb * cos_number)); ????? top_pos_y=pre_pos_y - ((bb * sin_number) < 0 ? (-bb * sin_number) : (bb * sin_number)); ???? } ???? else if (pre_pos_x >= pos_x && pre_pos_y <= pos_y) ???? { ????? top_pos_x=pre_pos_x - ((bb * cos_number) < 0 ? (-bb * cos_number) : (bb * cos_number)); ????? top_pos_y=pre_pos_y - ((bb * sin_number) < 0 ? (-bb * sin_number) : (bb * sin_number)); ???? } ???? var top_point:MapPoint=new MapPoint(top_pos_x,top_pos_y); ???? clogger.logger.info("上半部分是:" + top_pos_x + "yy:" + top_pos_y); ???? topcurepoints.push(top_point); ???? //下面来确定下边的曲线 ???? var bottom_pos_x:Number; ???? var bottom_pos_y:Number; ???? if (pre_pos_x <= pos_x && pre_pos_y <= pos_y) ???? { ????? bottom_pos_x=pre_pos_x + ((bb * cos_number) < 0 ? (-bb * cos_number) : (bb * cos_number)); ????? bottom_pos_y=pre_pos_y - ((bb * sin_number) < 0 ? (-bb * sin_number) : (bb * sin_number)); ???? } ???? else if (pre_pos_x <= pos_x && pre_pos_y > pos_y) ???? { ????? bottom_pos_x=pre_pos_x - ((bb * cos_number) < 0 ? (-bb * cos_number) : (bb * cos_number)); ????? bottom_pos_y=pre_pos_y - ((bb * sin_number) < 0 ? (-bb * sin_number) : (bb * sin_number)); ???? } ???? else if (pre_pos_x >= pos_x && pre_pos_y >= pos_y) ???? { ????? bottom_pos_x=pre_pos_x - ((bb * cos_number) < 0 ? (-bb * cos_number) : (bb * cos_number)); ????? bottom_pos_y=pre_pos_y + ((bb * sin_number) < 0 ? (-bb * sin_number) : (bb * sin_number)); ???? } ???? else if (pre_pos_x >= pos_x && pre_pos_y <= pos_y) ???? { ????? bottom_pos_x=pre_pos_x + ((bb * cos_number) < 0 ? (-bb * cos_number) : (bb * cos_number)); ????? bottom_pos_y=pre_pos_y + ((bb * sin_number) < 0 ? (-bb * sin_number) : (bb * sin_number)); ???? } ???? var bottom_point:MapPoint=new MapPoint(bottom_pos_x,bottom_pos_y); ???? bottomcurepoints.push(bottom_point); ??? } ?? } ?? /* ??? **下面是添加军标箭头的程序,因为现在已经得到上下边界的曲线了。 ??? ** ??? */ ?? var end_curvepoint:MapPoint=curvepoints[curvepoints.length - 1]; ?? var end_top_point:MapPoint=topcurepoints[topcurepoints.length - 1]; ?? var end_top_point2:MapPoint=topcurepoints[topcurepoints.length - 2]; ?? //求箭头上方的点 ?? var x2:Number=end_curvepoint.x; ?? var y2:Number=end_curvepoint.y; ?? var pos_x:Number=end_top_point.x; ?? var pos_y:Number=end_top_point.y; ?? var pre_pos_x:Number=end_top_point2.x; ?? var pre_pos_y:Number=end_top_point2.y; ?? var end_slope:Number=(pre_pos_y - pos_y) / (pre_pos_x - pos_x); ?? var b:Number=dis; ?? var end_point_x:Number; ?? var end_point_y:Number; ?? var cos_number:Number=Math.cos(Math.atan(end_slope) - Math.PI / 2); ?? var sin_number:Number=Math.sin(Math.atan(end_slope) - Math.PI / 2); ?? //下面分四种情况画线。 ?? if (pre_pos_x <= pos_x && pre_pos_y <= pos_y) ?? { ??? end_point_x=pre_pos_x - ((b * cos_number) < 0 ? (-b * cos_number) : (b * cos_number)); ??? end_point_y=pre_pos_y + ((b * sin_number) < 0 ? (-b * sin_number) : (b * sin_number)); ?? } ?? else if (pre_pos_x <= pos_x && pre_pos_y > pos_y) ?? { ??? end_point_x=pre_pos_x + ((b * cos_number) < 0 ? (-b * cos_number) : (b * cos_number)); ??? end_point_y=pre_pos_y + ((b * sin_number) < 0 ? (-b * sin_number) : (b * sin_number)); ?? } ?? else if (pre_pos_x >= pos_x && pre_pos_y >= pos_y) ?? { ??? end_point_x=pre_pos_x + ((b * cos_number) < 0 ? (-b * cos_number) : (b * cos_number)); ??? end_point_y=pre_pos_y - ((b * sin_number) < 0 ? (-b * sin_number) : (b * sin_number)); ?? } ?? else if (pre_pos_x >= pos_x && pre_pos_y <= pos_y) ?? { ??? end_point_x=pre_pos_x - ((b * cos_number) < 0 ? (-b * cos_number) : (b * cos_number)); ??? end_point_y=pre_pos_y - ((b * sin_number) < 0 ? (-b * sin_number) : (b * sin_number)); ?? } ?? //创建第三个点,然后创建三角形 ?? clogger.logger.info("右上面的点的横坐标点x:" + end_point_x + "----------右上方点的纵坐标的y:" + end_point_y); ?? //得到右上方的点 ?? var end_right_point:MapPoint=new MapPoint(end_point_x,end_point_y); ?? topcurepoints.push(end_right_point); ?? //最右边,箭头顶点的坐标是 ?? clogger.logger.info("顶点的横坐标是x:" + end_curvepoint.x + "---------顶点的纵坐标y:" + end_curvepoint.y); ?? topcurepoints.push(end_curvepoint); ?? //下边线 ?? var end_bottom_point:MapPoint=bottomcurepoints[bottomcurepoints.length - 1]; ?? var end_bottom_point2:MapPoint=bottomcurepoints[bottomcurepoints.length - 2]; ?? //求箭头下方向的点 ?? var bx1:Number=end_bottom_point.x; ?? var by1:Number=end_bottom_point.y; ?? var bx0:Number=end_bottom_point2.x; ?? var by0:Number=end_bottom_point2.y; ?? var bend_slope:Number=(by1 - by0) / (bx1 - bx0); ?? var bend_point_x:Number; ?? var bend_point_y:Number; ?? var bend_cos_number:Number=Math.cos(Math.atan(bend_slope) - Math.PI / 2); ?? var bend_sin_number:Number=Math.sin(Math.atan(bend_slope) - Math.PI / 2); ?? if (bx0 <= bx1 && by0 <= by1) ?? { ??? bend_point_x=bx0 + ((b * bend_cos_number) < 0 ? (-b * bend_cos_number) : (b * bend_cos_number)); ??? bend_point_y=by0 - ((b * bend_sin_number) < 0 ? (-b * bend_sin_number) : (b * bend_sin_number)); ?? } ?? else if (bx0 <= bx1 && by0 > by1) ?? { ??? bend_point_x=bx0 - ((b * bend_cos_number) < 0 ? (-b * bend_cos_number) : (b * bend_cos_number)); ??? bend_point_y=by0 - ((b * bend_sin_number) < 0 ? (-b * bend_sin_number) : (b * bend_sin_number)); ?? } ?? else if (bx0 >= bx1 && by0 >= by1) ?? { ??? bend_point_x=bx0 - ((b * bend_cos_number) < 0 ? (-b * bend_cos_number) : (b * bend_cos_number)); ??? bend_point_y=by0 + ((b * bend_sin_number) < 0 ? (-b * bend_sin_number) : (b * bend_sin_number)); ?? } ?? else if (bx0 >= bx1 && by0 <= by1) ?? { ??? bend_point_x=bx0 + ((b * bend_cos_number) < 0 ? (-b * bend_cos_number) : (b * bend_cos_number)); ??? bend_point_y=by0 + ((b * bend_sin_number) < 0 ? (-b * bend_sin_number) : (b * bend_sin_number)); ?? } ?? clogger.logger.info("下方的点的横坐标x为:" + bend_point_x + "-------下方的点的纵坐标y为:" + bend_point_y); ?? //得到右下方的点 ?? var bend_right_point:MapPoint=new MapPoint(bend_point_x,bend_point_y); ?? topcurepoints.push(bend_right_point); ?? for (var k:Number=bottomcurepoints.length - 1; k >= 0; k--) ?? { ??? //? 这个是下半部分 ??? clogger.logger.info("由此开始下半部分:" + bottomcurepoints[k].x + "yyyyy:" + bottomcurepoints[k].y); ??? topcurepoints.push(bottomcurepoints[k]); ?? } ?? //添加尾部的部分,至此完成对军标多边行的算法, ?? topcurepoints.push(curvepoints[1]); ?? topcurepoints.push(topcurepoints[0]); ?? clogger.logger.info("军标上的点的个数是" + topcurepoints.length); ?? var rings:Array=new Array(); ?? rings.push(topcurepoints); ?? return rings; ? } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |