2015-12-14 2 views
-1

Я пытаюсь создать алгоритм линии Bresenhams, который сохраняет порядок, чтобы пользователь мог рисовать сетку во время выполнения.Почему мой алгоритм линии Bresenhams разбивает мою программу?

Он работает, по большей части, однако, кажется, что он застрял в цикле while и иногда изредка сбрасывает мою программу. Я считаю, что это происходит, когда мышь движется довольно быстро.

public static IEnumerable<WorldTile> GetWorldTilesOnLine(int x0, int y0, int x1, int y1) 
{ 
    int dy = (int)(y1-y0); 
    int dx = (int)(x1-x0); 
    int xstep = 1; 
    int ystep = 1; 

    if (dy < 0) {dy = -dy; xstep = -1;} 
    else {ystep = 1;} 
    if (dx < 0) {dx = -dx; ystep = -1;} 
    else {xstep = 1;} 
    dy <<= 1; 
    dx <<= 1; 

    float fraction = 0; 
    //Debug.Log (xstep); 

    if (x0 >= 0 && x0 < worldBoard.GetLength(0) && y0 >= 0 && y0 < worldBoard.GetLength(1)) 
    { 
     yield return worldBoard[x0, y0]; 
    } 

    if (dx > dy) { 
     fraction = dy - (dx >> 1); 

     while (Mathf.Abs(x0 - x1) > 1) { // This seems to be where the crash occurs 

      if (fraction >= 0) { 
       y0 += ystep; 
       fraction -= dx; 
      } 
      x0 += xstep; 
      fraction += dy; 
      if (x0 >= 0 && x0 < worldBoard.GetLength(0) && y0 >= 0 && y0 < worldBoard.GetLength(1)) 
      { 
       yield return worldBoard[x0, y0]; 
      } 
     } 
    } 
    else { 
     fraction = dx - (dy >> 1); 

     while (Mathf.Abs(y0 - y1) > 1) { // This seems to be where the crash occurs 

      if (fraction >= 0) { 
       x0 += xstep; 
       fraction -= dy; 
      } 
      y0 += ystep; 
      fraction += dx; 
      if (x0 >= 0 && x0 < worldBoard.GetLength(0) && y0 >= 0 && y0 < worldBoard.GetLength(1)) 
      { 
       yield return worldBoard[x0, y0]; 
      } 
     } 
    } 
    yield break; 
} 

Этот метод вызывается, когда пользователь имеет кнопку мыши с помощью этого

IEnumerator Draw() 
{ 
    startPos = WorldGridUtilities.getNearestWorldTileArrayValue(getMousePosition()); 
    worldTilesToAdd = new List<WorldTile>(); 
    Debug.Log (worldTilesToAdd.Count); 
    while (true) 
    {  
     worldTilesToAdd.Clear(); 
     nextPos = WorldGridUtilities.getNearestWorldTileArrayValue(getMousePosition()); 

     if (nextPos != startPos) 
     { 

      foreach (WorldTile wt in WorldGridUtilities.GetWorldTilesOnLine((int)startPos.x,(int)startPos.y, (int)nextPos.x, (int)nextPos.y)) 
      { 
       worldTilesToAdd.Add (wt); 

      startPos = nextPos; 
     } 

     foreach (WorldTile wt in worldTilesToAdd) 
     { 
      //Debug.Log ("coordinates added to list used by vectorline: " + wt.gridCoordinates); 
      vectorLine.points3.Add(wt.gridCoordinates); 
      vectorLine.Draw3D(); 
     } 


     yield return new WaitForEndOfFrame(); 
    } 
} 
+1

У вас есть точное утверждение, где он падает? – FKutsche

+0

Нет, мне жаль, что нет. Он разбивает Unity, и я не получаю никаких сообщений об ошибках. Единственная причина, по которой я знаю, что он падает в цикле while, когда я пытаюсь распечатать журналы, он остановится, прежде чем дойти до этой точки. – Jim

+0

Возможно ли, что вы перечислите или ваш vectorLine станет слишком большим? – FKutsche

ответ

1

Там что-то странное в xstep ystep. , если dy > 0 и dx < 0 затем xstep = 1 и ystep = 1. Итак, x1 < x0, потому что dx < 0, но вы продолжаете увеличивать x0 с xstep =1. Это означает бесконечный цикл. Вероятно, что-то перегружается, а иногда вы получаете сообщение об ошибке.

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