// 2点を結ぶ直線上に存在するセルの座標リストを取得する public static List GetCellPos(Vector2 vecA, Vector2 vecB) { // セル座標リストの宣言 List cellPos = new List(); // 傾きが90度(直角)の場合 if (vecA.X == vecB.X) { if (vecA.Y < vecB.Y) for (int y = (int)vecA.Y + 1; y < vecB.Y; y++) // セル座標リストに追加 cellPos.Add(new Vector2(vecA.X, y)); else for (int y = (int)vecB.Y + 1; y < vecA.Y; y++) // セル座標リストに追加 cellPos.Add(new Vector2(vecA.X, y)); // セル座標リストを返す return cellPos; } // 一次方程式:y = x * d + a の傾き d と増分 a を求める float d = (vecB.Y - vecA.Y) / (vecB.X - vecA.X); float a = vecA.X * d - vecA.Y; // X軸の開始点と終了点の設定 int startX = (int)vecA.X; int endX = (int)vecB.X; // vecA.Xの方が大きかったら入れ替える if (vecA.X > vecB.X) { startX = (int)vecB.X; endX = (int)vecA.X; } // Y座標が大きいベクトル float smallY = vecA.Y; float largeY = vecB.Y; if (vecA.Y > vecB.Y) { smallY = vecB.Y; largeY = vecA.Y; } for (int x = startX; x <= endX; x++) if (d > 0) { for (int y = (int)((x - 0.499f) * d - a + 0.5f); y <= (int)((x + 0.499f) * d - a + 0.5f); y++) if ((smallY <= y) && (y <= largeY)) // セル座標リストに追加 cellPos.Add(new Vector2(x, y)); } else { for (int y = (int)((x - 0.499f) * d - a + 0.5f); y >= (int)((x + 0.499f) * d - a + 0.5f); y--) if ((smallY <= y) && (y <= largeY)) // セル座標リストに追加 cellPos.Add(new Vector2(x, y)); } // 末尾と先頭を削除 cellPos.Remove(cellPos[cellPos.Count - 1]); cellPos.Remove(cellPos[0]); // セル座標リストを返す return cellPos; }