// 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; } // 直線(一次方程式)の傾きと増分を求める float d = (vecB.Y - vecA.Y) / (vecB.X - vecA.X); float alpha = vecA.X * d - vecA.Y; int sx = (int)vecA.X; // startX int sy = (int)vecA.Y; // startY int ex = (int)vecB.X; // endX int ey = (int)vecB.Y; // endY int addA = 1; int addB = -1; // vecA.Xの方が大きかったら入れ替える if (vecA.X > vecB.X) { sx = (int)vecB.X; // startX ex = (int)vecA.X; // endX } // vecA.Yの方が大きかったら入れ替える if (vecA.Y > vecB.Y) { sy = (int)vecB.Y; // startY ey = (int)vecA.Y; // endY } // 直線(一次方程式)の傾きによってループの開始/終了値と増分を補正する float absD = Math.Abs(d); if (absD > 1.0f) { sy++; ex++; } else if (absD < 1.0f) { sx++; ey++; } else if (absD == 1.0f) { sx++; sy++; addA = 0; addB = 0; } for (int y = sy;y < ey;y++) for (int x = sx;x < ex;x++) if ((x * d - alpha + addA >= y) && (x * d - alpha + addB <= y)) // セル座標リストに追加 cellPos.Add(new Vector2(x, y)); // セル座標リストを返す return cellPos; }