title: Poisson Disc Sampling Throws Index Out Of Range
body: <p>here's Poisson Disc Sampling Algorithm realization that I use:</p>
  
  <pre><code>using System.Collections.Generic;
  using UnityEngine;
  using Random = UnityEngine.Random;
  
  namespace Assets.Scripts.Algorithms
  {
      public static class PoissonDiscSampling
      {
          public static List&lt;Vector2&gt; GeneratePoints(int seed, float radius, Vector2 sampleRegionSize, int sampleAmount)
          {
              Random.InitState(seed);
              float cellSize = radius / Mathf.Sqrt(2);
              var grid = new int[Mathf.FloorToInt(sampleRegionSize.x / cellSize), Mathf.FloorToInt(sampleRegionSize.y / cellSize)];
              var points = new List&lt;Vector2&gt;();
              var spawnPoints = new List&lt;Vector2&gt;
              {
                  sampleRegionSize / 2
              };
  
              while (spawnPoints.Count &gt; 0)
              {
                  int spawnIndex = Random.Range(0, spawnPoints.Count);
                  Vector2 spawnCenter = spawnPoints[spawnIndex];
                  bool accepted = false;
  
                  for (int i = 0; i &lt; sampleAmount; i++)
                  {
                      float angle = Random.value * Mathf.PI * 2;
                      var direction = new Vector2(Mathf.Sin(angle), Mathf.Cos(angle));
                      Vector2 candidate = spawnCenter + direction * Random.Range(radius, radius * 2);
  
                      if (IsValid(candidate, sampleRegionSize, cellSize, radius, points, grid))
                      {
                          points.Add(candidate);
                          spawnPoints.Add(candidate);
  
                          grid[(int)(candidate.x / cellSize), (int)(candidate.y / cellSize)] = points.Count;
  
                          accepted = true;
  
                          break;
                      }
                  }
  
                  if (!accepted)
                  {
                      spawnPoints.RemoveAt(spawnIndex);
                  }
              }
  
              return points;
          }
  
          private static bool IsValid(Vector2 candidate, Vector2 sampleRegionSize, float cellSize, float radius,
              IList&lt;Vector2&gt; points, int[,] grid)
          {
              if (candidate.x &gt;= 0 &amp;&amp; candidate.x &lt; sampleRegionSize.x &amp;&amp; candidate.y &gt;= 0 &amp;&amp; candidate.y &lt; sampleRegionSize.y)
              {
                  int cellX = (int)(candidate.x / cellSize);
                  int cellY = (int)(candidate.y / cellSize);
                  int searchStartX = Mathf.Max(0, cellX - 2);
                  int searchStartY = Mathf.Max(0, cellY - 2);
                  int searchEndX = Mathf.Min(cellX + 2, grid.GetLength(0) - 1);
                  int searchEndY = Mathf.Min(cellY + 2, grid.GetLength(1) - 1);
  
                  for (int x = searchStartX; x &lt;= searchEndX; x++)
                  {
                      for (int y = searchStartY; y &lt;= searchEndY; y++)
                      {
                          int pointIndex = grid[x, y] - 1;
  
                          if (pointIndex != -1)
                          {
                              float sqrDistance = (candidate - points[pointIndex]).sqrMagnitude;
  
                              if (sqrDistance &lt; radius * radius)
                              {
                                  return false;
                              }
                          }
                      }
                  }
              }
  
              return true;
          }
      }
  }
  </code></pre>
  
  <p>But there's a slight problem with this algorithm realization. On the line:</p>
  
  <pre><code>grid[(int)(candidate.x / cellSize), (int)(candidate.y / cellSize)] = points.Count;
  </code></pre>
  
  <p>After few iterations it throws</p>
  
  <blockquote>
    <p>Index Out Of Range Exception</p>
  </blockquote>
  
  <p>Somehow (I am still not sure why) It goes beyond the size of the <code>grid</code>, sometimes it can be negative and sometimes it can be basically equal the size of the <code>grid</code>.</p>
  
  <p>I'm stuck and I don't know what to do. It seems that there's something that I simply don't see.</p>
  
  <p>Thanks!</p>