一、路径首先是已知的。
1.用描点法,定大概。
2.再将上面的点位提取出坐标,加入数组:
var MapData=[];
var MapArray:Array = [[879,57],[832,55],[648,48],[418,49],[142,68],[66,134],
[50,225],[53,335],[76,458],[135,542],[300,559],
[546,558],[677,542],[741,491],[746,378],[734,259],
[679,155],[564,150],[336,159],[180,193],[158,262],
[154,351],[207,434],[312,484],[482,474],[591,456],
[635,384],[613,277],[473,234],[309,251],[289,356],];
用下面原方法可查看路径:
function initMap(arr:Array) {
graphics.lineStyle(2,0xFFFFFF);
graphics.moveTo(arr[0][0],arr[0][1]);
for (var i:uint = 1; i var xc:Number = (arr[i][0] + arr[i+1][0])/2; var yc:Number = (arr[i][1] + arr[i+1][1])/2; graphics.curveTo(arr[i][0],arr[i][1],xc,yc); } graphics.curveTo(arr[i][0],arr[i][1],arr[i+1][0],arr[i+1][1]); } 3.再用贝赛尔曲线类,生成一定数量的关键点。 贝赛尔曲线类: package { import flash.geom.Point; public class Bezier { // ===================================== 属性 // 对外变量 private static var p_start:Point;// 起点 private static var p_ctrl:Point;// 贝塞尔点 private static var p_over:Point;// 终点 private static var step:uint;// 分割份数 // 辅助变量 private static var ax:int; private static var ay:int; private static var bx:int; private static var by:int; private static var A:Number; private static var B:Number; private static var C:Number; private static var total_length:Number;// 长度 // 速度函数 private static function s(t:Number):Number { return Math.sqrt(A * t * t + B * t + C); } // 长度函数 private static function L(t:Number):Number { var temp_ctrl:Number = Math.sqrt(C + t * (B + A * t)); var temp_over:Number = (2 * A * t * temp_ctrl + B *(temp_ctrl - Math.sqrt(C))); var temp3:Number = Math.log(B + 2 * Math.sqrt(A) * Math.sqrt(C)); var temp4:Number = Math.log(B + 2 * A * t + 2 * Math.sqrt(A) * temp_ctrl); var temp5:Number=2*Math.sqrt(A)*temp_over; var temp6:Number = (B * B - 4 * A * C) * (temp3 - temp4); return (temp5 + temp6) / (8 * Math.pow(A, 1.5)); } // 长度函数反函数,使用牛顿切线法求解 private static function InvertL(t:Number, l:Number):Number { var t1:Number=t; var t2:Number; do { t2 = t1 - (L(t1) - l)/s(t1); if (Math.abs(t1-t2) < 0.000001) { break; } t1=t2; } while (true); return t2; } // 返回所需总步数 public static function init($p_start:Point, $p_ctrl:Point, $p_over:Point, $speed:Number):uint { p_start=$p_start; p_ctrl=$p_ctrl; p_over=$p_over; //step = 30; ax=p_start.x-2*p_ctrl.x+p_over.x; ay=p_start.y-2*p_ctrl.y+p_over.y; bx=2*p_ctrl.x-2*p_start.x; by=2*p_ctrl.y-2*p_start.y; A = 4*(ax * ax + ay * ay); B = 4*(ax * bx + ay * by); C=bx*bx+by*by; // 计算长度 total_length=L(1); // 计算步数 step = Math.floor(total_length / $speed); if (total_length % $speed > $speed / 2) { step++; } return step; } // 根据指定nIndex位置获取锚点:返回坐标和角度 public static function getAnchorPoint(nIndex:Number):Array { if (nIndex >= 0 && nIndex <= step) { var t:Number=nIndex/step; // 如果按照线行增长,此时对应的曲线长度 var l:Number=t*total_length; // 根据L函数的反函数,求得l对应的t值 t=InvertL(t,l); // 根据贝塞尔曲线函数,求得取得此时的x,y坐标 var xx:Number = (1 - t) * (1 - t) * p_start.x + 2 * (1 - t) * t * p_ctrl.x + t * t * p_over.x; var yy:Number = (1 - t) * (1 - t) * p_start.y + 2 * (1 - t) * t * p_ctrl.y + t * t * p_over.y; // 获取切线 var Q0:Point = new Point((1 - t) * p_start.x + t * p_ctrl.x, (1 - t) * p_start.y + t * p_ctrl.y); var Q1:Point = new Point((1 - t) * p_ctrl.x + t * p_over.x, (1 - t) * p_ctrl.y + t * p_over.y); // 计算角度 var dx:Number=Q1.x-Q0.x; var dy:Number=Q1.y-Q0.y; var radians:Number=Math.atan2(dy,dx); var degrees:Number=radians*180/Math.PI; xx=int(xx*10)/10 yy=int(yy*10)/10 degrees=int(degrees*10)/10 return [xx, yy, degrees]; } else { return []; } } } } 生成的点: 这些点就是路径!!! 这些点是代码的,不是引导线的!