2016-08-07 4 views
0

Я пытаюсь реализовать SAT (теорему о разделительной оси) в маленькую программу. У меня есть цикл for, который, как предполагается, повторяется три раза, но он делает это только один раз, прежде чем выходить из него и перейти к следующей части кода. Нет очевидной причины, что он должен это сделать ... Вот цикл for. Я включил функции, которые также вызывают из цикла.Почему этот цикл p5js для цикла не итерируется полностью

this.collides = function(shape) { 
    axes1 = this.getAxes(); 
    axes2 = shape.getAxes(); 

    for (i = 0; i < 3; i++) { 
     console.log(i + 1) 
     axis = axes1[i]; 
     pr1 = this.projectShape(axis) 
     pr2 = shape.projectShape(axis) 

     if (!this.overlaps(pr1, pr2)) { 
      console.log("no collision") 
       return false; 
      } 
     } 
    } 
} 

Как вы можете видеть код должен войти 1.2.3 на консоль, однако он только регистрирует 1.

"getAxes()" функция:

this.getAxes = function() { 
    axes = [] 
    for (i = 0; i < this.vertices.length; i++) { 
     p1 = this.vertices[i] 
     if (i === this.vertices.length - 1) { 
      p2 = this.vertices[0] 
     } else { 
      p2 = this.vertices[i + 1] 
     } 
     edge = createVector(p1.x - p2.x, p1.y - p2.y) 
     normal = createVector(-edge.y, edge.x) 
     // the perp method is just (x, y) => (-y, x) or (y, -x) 
     axes[i] = normal 
    } 

    return axes; 
} 

«projectShape ()»функции:

this.projectShape = function(axisToProj) { 
    minV = axisToProj.dot(this.vertices[0]); 
    maxV = minV; 
    for (i = 1; i < this.vertices.length; i++) { 
     // NOTE: the axis must be normalized to get accurate projections 
     p = axisToProj.dot(this.vertices[i]); 
     if (p < minV) { 
      minV = p; 
     } else if (p > maxV) { 
      maxV = p; 
     } 
    } 
    minMax = createVector(minV, maxV); 
    return minMax; 
} 

"() функция перекрытия":

this.overlaps = function(a, b) { 
    if (a.y > b.x && b.y > a.x) { 
     return true 
    } 

    return false 
} 
+0

@KevinWorkman Да, мне удалось это исправить. Я смутно помню, что проблема имела какое-то отношение к переменным в цикле for, которые противоречили друг другу. Я считаю, что вместо использования «i» в других для циклов я использовал, например, «j». Я также переписал всю часть программы и [здесь] (https://github.com/MaxBryarsMansell/Velavity/blob/collision/Velavity/collide.js), если вам интересно. – Max

+0

Хорошо, круто. Причина, по которой я спрашивал, состоит в том, что этот вопрос по-прежнему отмечен как нуждающийся в ответе, поэтому я просто хотел следить. Рад, что вы поняли это. –

ответ

0

В будущем, пожалуйста, предоставьте MCVE вместо связки отключенных фрагментов.

Но если ваш for цикл выхода, то это if заявление должно быть вычисляемая true:

if (!this.overlaps(pr1, pr2)) { 

Это означает, что это if утверждение также вычисляемая true:

if (a.y > b.x && b.y > a.x) { 

Я m не совсем уверен, что этот код должен делать, но теперь вам нужно начать процесс отладки вашего кода. Вам нужно точно узнать, что значения a и b находятся на этой линии.

Одна вещь, которая выскакивает для меня: это выглядит, как вы пробегаем по бокам формы и возвращение false как только вы находите сторону, которая не встречными. Вы не хотите возвращать true, как только найдете ту сторону, которая is colliding?

Смежные вопросы