2

各ピクセルのビットマップでは、ビットマップの最後まで、最初、2 番目、3 番目のレベルの隣人を取得しようとしていますが、私の解決策は少し遅いので、誰かが持っている場合はお知らせくださいこれを行うためのより良いアルゴリズムまたは方法:

例

private IEnumerable<Point> getNeightboorsOfLevel(int level, Point startPos, Point[,] bitMap)
{
    var maxX = bitMap.GetLength(0);
    var maxY = bitMap.GetLength(1);
    if (level > Math.Max(maxX, maxY)) yield break;

    int startXpos = startPos.X - level;
    int startYpos = startPos.Y - level;
    int sizeXY = level * 2;

    var plannedTour = new Rectangle(startXpos, startYpos, sizeXY, sizeXY);
    var tourBoundaries = new Rectangle(0, 0, maxX, maxY);

    for(int UpTour  = plannedTour.X; UpTour<plannedTour.Width; UpTour++) 
        if (tourBoundaries.Contains(UpTour,plannedTour.Y)) 
            yield return bitMap[UpTour,plannedTour.Y];

    for(int RightTour  = plannedTour.Y; RightTour<plannedTour.Height;RightTour++)
        if (tourBoundaries.Contains(plannedTour.Right,RightTour)) 
            yield return bitMap[plannedTour.Right,RightTour];

    for(int DownTour  = plannedTour.X; DownTour<plannedTour.Width;DownTour++)
        if (tourBoundaries.Contains(DownTour,plannedTour.Bottom)) 
            yield return bitMap[DownTour,plannedTour.Bottom];

    for (int LeftTour = plannedTour.Y; LeftTour < plannedTour.Height; LeftTour++)
        if (tourBoundaries.Contains(plannedTour.X,LeftTour)) 
            yield return bitMap[plannedTour.X,LeftTour];

}
4

2 に答える 2

6

これが遅すぎる場合は、アプローチを変更することをお勧めします。

たとえばDictionary<Color, List<Point>>、ビットマップ内の各色に対して、その色であるポイントのリストを持つ を生成します。次に、ポイントが与えられると、色を取得し、ポイントのリストを実行して、指定されたポイントに最も近いポイントを見つけます。

これは、画像の 1 回の事前計算であり、同じ色であるポイントの数だけ複雑さを変更します。同じ色のポイントを見つけることはめったにないため、多くのポイントを見なければならないため、現在は遅いと思います。

于 2013-04-22T18:15:41.847 に答える