2d Ray Tracing - заполняющий вид

Мой 2d ray tracer работал нормально до тех пор, пока я не отсортировал вычисленные лучи по углу (радиан, чтобы быть точным). Я предполагаю, что это связано с тем, как действует загар, но я не уверен. Каков наилучший способ сортировки углов по известным 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 с полным кодом js и html (html - после js) https://docs.google.com/document/d/12chxLiaj9gz-irlM0VdZs-BNoNqoMbz5AS0Dm0CpXfI/edit?usp=sharing

1 ответ

Решение

Первое, что нужно сделать, это уточнить ваш код.
1) вам не нужно заполнять массив в обратном порядке.
2) использовать atan2 - я не понял, как работать с радианами...
3) кэшировать элемент массива, который вы будете использовать повторно.
4) не создавайте одну функцию сортировки для каждой сортировки.
5) если вы сортируете в правильном порядке, вам не нужно отображать в обратном порядке.

Как только ситуация прояснится, я нахожу странным, что вы используете поля 3, 5 или 6 для y вашей точки. Я бы сказал, что достаточно одного смещения для данных 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] }
Другие вопросы по тегам