LoginSignup
3
2

More than 5 years have passed since last update.

[アルゴリズム] ドットでお絵かきする際の補間

Last updated at Posted at 2018-07-18

補間しなかったらひどいことになった
no-interpolate.gif
ということで考えてみた補間方法まとめ

手順

  1. 補間する距離を調べる
  2. 補間方向を調べる
  3. 補間距離が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();
}

実際に補間してみた

取得したドットの補間データで塗り潰しを行なうようにしてみた
interpolate.gif
隙間が空かないでちゃんと線が引けるようになった!

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2