我的2d光线追踪器已经工作正常,直到我按角度对弧形射线进行分类(弧度是特定的)。我认为这与谭的行为方式有关,但我不确定。对于碰撞和起始点,用已知的x,y对角度进行排序的最佳方法是什么?我一直在研究和关闭同样的问题2周,并且已经尝试了几乎所有的东西。
我现在可以在这里上传图片: 如果你想摆弄它,这是有罪的代码:
function sortByAngle(pos){
for (var i = viewFeild.length - 1; i >= 0; i --) {
viewFeild[i][3] = Math.atan((viewFeild[i][4]-pos.y)/(viewFeild[i][0]-pos.x));
if(viewFeild[i][5]<pos.y)
viewFeild[i][6] = viewFeild[i][7]*-1-4;
if (viewFeild[i][8]<0) {viewFeild[i][9]+=2};
};
viewFeild.sort(function(a,b){return a[2]-b[2]});
}
function fillView(pos) {
for (var i = viewFeild.length - 1; i >= 0; i--) {
//console.log(i+" "+viewFeild[i][10] + " " + viewFeild[(i+1)%viewFeild.length][11])
//console.log(viewFeild.length)
ctx.beginPath();
ctx.moveTo(pos.x, pos.y);
ctx.lineTo(viewFeild[i][0]+pos.x, viewFeild[i][12]+pos.y);
ctx.lineTo(viewFeild[(i+1)%viewFeild.length][0]+pos.x, viewFeild[(i+1)%viewFeild.length][13]+pos.y);
ctx.closePath();
ctx.fillStyle = "rgba(100, " + 35*i + ", 100, .6)";
ctx.fill();
};
}
这是google doc,包含整个js代码和html(html是在js之后) https://docs.google.com/document/d/12chxLiaj9gz-irlM0VdZs-BNoNqoMbz5AS0Dm0CpXfI/edit?usp=sharing
答案 0 :(得分:2)
首先要做的是澄清你的代码
1)您不需要以相反的顺序填充阵列
2)使用atan2 - 我没有办法处理弧度......
3)缓存你将重复使用的数组元素
4)不要在每种类型上创建一个排序函数
5)如果按正确的顺序排序,则不需要以相反的顺序显示。
一旦情况更清楚,我会发现你使用第3,5或6栏作为你的观点的奇怪之处。我想说y数据只有一个偏移就足够了; - )
function sortByAngle(center) {
for (var i = 0 ; i<viewFeild.length ; i++) {
var thisField = viewFeild[i] ;
thisField[2] = Math.atan2( thisField[3] - center.y)
, (thisField[0] - center.x));
};
viewFeild.sort(sortOnSecondItem);
}
function fillView(pos) {
for (var i = 0 ; i<viewFeild.length ; i++) {
var thisField = viewFeild[i] ;
var nextField = (i==viewFeild.length-1) ?
viewFeild[0]
: viewFeild[i+1] ;
ctx.beginPath();
ctx.moveTo(pos.x, pos.y);
ctx.lineTo(thisField[0] + pos.x, thisField[5] + pos.y);
ctx.lineTo(nextField[0] + pos.x, nextField[6] + pos.y);
ctx.closePath();
ctx.fillStyle = "rgba(100, " + 35 * i + ", 100, .6)";
ctx.fill();
};
}
function sortOnSecondItem(a,b) { return a[2] - b[2] }