/// <summary>
        /// LRFセンサーデータをGridMapから生成(代用)
        /// </summary>
        /// <param name="robot"></param>
        /// <returns></returns>
        public double[] Sense(GridMap map, double posX, double posY, double robotTheta)
        {
            double[] result = new double[AngleRange];
            int i;
            int angRng = AngleRange / 2;

            int iroboTheta = (int)(robotTheta+0.5);
            iroboTheta = iroboTheta - ((iroboTheta / 360) * 360);

            LocPreSumpSystem.swCNT_MRF.Start();
            try
            {
                for (i = -angRng; i < angRng; ++i)
                {
                    int theta = (iroboTheta + -i + 360 * 2) % 360;

                    // 障害物までの距離を取得
                    result[i + angRng] = map.MeasureDist(
                        posX,
                        posY,
                        DeltaX[theta],
                        DeltaY[theta],
                        RangeMax);
                }
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                LocPreSumpSystem.swCNT_MRF.Stop();
            }

            return result;
        }
 public void SetMap(GridMap map)
 {
     Map = map;
 }
        /// <summary>
        /// LRFセンサーデータをGridMapから生成(代用)
        /// </summary>
        /// <param name="robot"></param>
        /// <returns></returns>
        public double[] Sense(GridMap map, double posX, double posY, double robotTheta)
        {
            double[] result = new double[AngleRange];
            //int i;
            int angRng = AngleRange / 2;

            int iroboTheta = (int)(robotTheta+0.5);
            iroboTheta = iroboTheta - ((iroboTheta / 360) * 360);

            //LocPreSumpSystem.swCNT_MRF.Start();
            try
            {
                Parallel.For(-angRng, angRng, i => // こう書くだけで、並行して処理が行われる
                {
                    //for (i = -angRng; i < angRng; ++i) {

                    int theta = (iroboTheta + -i + 360 * 2) % 360;

                    // 障害物までの距離を取得
                    result[i + angRng] = map.MeasureDist(posX / PixelScale,
                                                          posY / PixelScale,
                                                          DeltaX[theta],
                                                          DeltaY[theta],
                                                          RangeMax) * PixelScale;
                });
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                //LocPreSumpSystem.swCNT_MRF.Stop();
            }

            return result;
        }
 public MapRangeFinder(double rangeMax, double pixelScale, Bitmap srcBmpMap)
     : this(rangeMax, pixelScale)
 {
     Bitmap bmpMap = new Bitmap(srcBmpMap);
     Map = new GridMap(bmpMap);
 }
        /// <summary>
        /// GridMap同時生成
        /// </summary>
        /// <param name="rangeMax"></param>
        /// <param name="bmpMapFilename"></param>
        public MapRangeFinder(double rangeMax, double pixelScale, string bmpMapFilename)
            : this(rangeMax, pixelScale)
        {
            Bitmap bmpMap = new Bitmap(bmpMapFilename);

            Map = new GridMap(bmpMap);
        }
        /// <summary>
        /// ワールドBMPからエリアのGridMapを作成
        /// </summary>
        /// <returns></returns>
        public GridMap MakeAreaGridMap()
        {
            GridMap gm = new GridMap(AreaGridSize.w, AreaGridSize.h);

            BitmapAccess bmpAp = new BitmapAccess(mapBmp);
            bmpAp.BeginAccess();

            // bmpからGridMapを生成
            for (int x = 0; x < gm.W; ++x)
            {
                for (int y = 0; y < gm.H; ++y)
                {
                    Color c;
                    int adX = WldOffset.x + x;
                    int adY = WldOffset.y + y;

                    if (adX < 0 || adX >= mapBmp.Width ||
                        adY < 0 || adY >= mapBmp.Height)
                    {
                        // レンジ外
                        c = GridMap.GridColor_Fill;
                    }
                    else
                    {
                        c = bmpAp[adX, adY];

                        // 色数を減らして、微妙な誤差をなくす
                        //c = Color.FromArgb((((c.R+4) / 5) * 5), (((c.G+4) / 5) * 5), (((c.B+4) / 5) * 5));
                    }

                    //if (c == GridMap.GridColor_Fill)
                    if ( GridMap.IsLess(c,GridMap.GridColor_Fill,20))
                    {
                        // 障害物
                        gm.M[x, y] = Grid.Fill;
                    }
                    //else if (c == GridMap.GridColor_Free)
                    else if (GridMap.IsUpper(c, GridMap.GridColor_Free, -20))
                    {
                        // 通行可能
                        gm.M[x, y] = Grid.Free;
                    }
                    else if (c == GridMap.GridColor_RedArea)
                    {
                        // 通行不可 壁の中
                        gm.M[x, y] = Grid.RedArea;
                    }
                    else if (c == GridMap.GridColor_GreenArea)
                    {
                        // 通行可能 位置補正推奨
                        gm.M[x, y] = Grid.GreenArea;
                    }
                    else if (c == GridMap.GridColor_BlueArea)
                    {
                        // 通行可能 スローダウン
                        gm.M[x, y] = Grid.BlueArea;
                    }
                    else
                    {
                        // それ以外
                        gm.M[x, y] = Grid.Unknown;
                    }
                }
            }

            bmpAp.EndAccess();

            AreaGridMap = gm;

            return gm;
        }