補間しなかったらひどいことになった
ということで考えてみた補間方法まとめ
手順
- 補間する距離を調べる
- 補間方向を調べる
- 補間距離が0になるまで間のドットを潰していく
結構シンプルな感じ
プログラム
自作の簡易Vector2
Vector2.cs
public class Vector2Int
{
public int X { get; set; } = 0;
public int Y { get; set; } = 0;
public Vector2Int()
{
}
public Vector2Int(int x, int y)
{
X = x;
Y = y;
}
public static Vector2Int operator/ (Vector2Int v, int n)
{
return new Vector2Int(v.X / n , v.Y / n);
}
public static Vector2Int operator +(Vector2Int v1, Vector2Int v2)
{
return new Vector2Int(v1.X + v2.X , v1.Y + v2.Y);
}
}
手順を元に補間していく
補間処理
public static Vector2Int[] DotInterpolate(Vector2Int from, Vector2Int to)
{
//-----1. 補間する距離を調べる
var distance = new Vector2Int
{
X = to.X - from.X,
Y = to.Y - from.Y
};
//-----2. 補間方向を調べる
bool isRight = distance.X >= 0;
bool isDown = distance.Y >= 0;
//方向判定に使い終わったので使いやすいように絶対値にしておく
distance.X = Math.Abs(distance.X);
distance.Y = Math.Abs(distance.Y);
//これが補間されたドットのデータ一覧になる
var dotPositions = new List<Vector2Int>();
//-----3. 補間距離が0になるまで間のドットを潰していく
while(distance.X != 0 || distance.Y != 0)
{
//ずらし距離
var shift = new Vector2Int
{
X = distance.X * (isRight ? 1 : -1),
Y = distance.Y * (isDown ? 1 : -1)
};
//データ追加
dotPositions.Add(from + shift);
//大きい方の数値を減らす
if(distance.X > distance.Y) distance.X--;
else distance.Y--;
}
return dotPositions.ToArray();
}