网格区域计算(didi)"/>
直线经过的网格区域计算(didi)
- 问题描述:
在一给定画布场景中,判断线段所经过网格。下图所示分别为线性递增和线性递减时,直线经过的网格路径。
- 分析
回归问题本身,直线经过网格,就必然会与网格线产生交点,因此,可考虑此种策略:①先分别遍历直线与网格横纵交点(需考虑沿X轴和Y轴递增递减性质);②根据直线与网格横纵交点求出交点位置跨越的网格序列号,且存在以下规律:
1)当交点在横轴
2)当交点在纵轴
- 具体实现
/*** @description: 计算线段与网格线的交点* @param {type} * @return: */
function intersectionCal(startPoint, endPoint) {var dx = endPoint.x - startPoint.x;var dy = endPoint.y - startPoint.y;// 设置数据列表空间var temList = new Array();var gridList = new Array();// 设置增量var increX = dx/Math.abs(dx);var increY = dy/Math.abs(dy);// 直线方程:斜截式var k = dy/dx;var b = -k * startPoint.x + startPoint.y;// 开始计算交点for (var m=0; m<=Math.abs(dx)-1; m++) {// 沿横轴方向遍历,既查询与网格轴轴的交点var temPoint1 = new b2Vec2();temPoint1.x = Math.ceil(startPoint.x) + increX * m;temPoint1.y = k * temPoint1.x + b;temList.push(temPoint1);}// 沿纵轴方向遍历,既查询与网格横轴的交点for (var n=0; n<=Math.abs(dy); n++) {var temPoint2 = new b2Vec2();temPoint2.y = Math.ceil(startPoint.y) + increY * n;temPoint2.x = (temPoint2.y - startPoint.y) / k + startPoint.x;temList.push(temPoint2);}return temList;
}
/*** @description: 计算线段经过网格行列号* @param {type} * @return: */
function lineGridCal(temList) {// 存储网格路径for (var j=0; j<(temList.length);j++) {var temGridUp = new b2Vec2();var temGridDown = new b2Vec2();var temGridLeft = new b2Vec2();var temGridRight = new b2Vec2();// 横轴交点if((temList[j].x !=Math.ceil(temList[j].x)) && (temList[j].y ==Math.ceil(temList[j].y))){temGridUp.x = Math.ceil(temList[j].x);temGridUp.y = Math.ceil(temList[j].y)+1;temGridDown.x = Math.ceil(temList[j].x);temGridDown.y = Math.ceil(temList[j].y);gridList.push(temGridUp, temGridDown);} // 纵轴交点else if((temList[j].y !=Math.ceil(temList[j].y)) && (temList[j].x ==Math.ceil(temList[j].x))) {temGridLeft.x = Math.ceil(temList[j].x);temGridLeft.y = Math.ceil(temList[j].y);temGridRight.x = Math.ceil(temList[j].x)+1;temGridRight.y = Math.ceil(temList[j].y);gridList.push(temGridLeft, temGridRight);}};return gridList;}
}
更多推荐
直线经过的网格区域计算(didi)
发布评论