Beispiel #1
0
        /// <summary>
        /// 与えられたエンコーダ座標系の地点から最も近いグリッドマーク情報を取得します。
        /// </summary>
        /// <param name="point">エンコーダ座標系の座標</param>
        /// <returns>最も近いグッドマークをエンコーダ座標系で</returns>
        public GridMark GetTheNearestGridMark(Vector3 encoderPoint)
        {
            GridParameter gridParam = parameterManager.GridParameter;

            if (gridParam.LoadedGridOriginalFine == false)
            {
                throw new Exception("null");
            }
            GridMark retval = new GridMark();
            Vector2  pmover = new Vector2();
            //Vector2 gmover = new Vector2();
            Vector2 gstage = new Vector2();

            try {
                double[,] gridOriginalFineX = gridParam.GridOriginalFineX;
                double[,] gridOriginalFineY = gridParam.GridOriginalFineY;

                double minDistance = 99999999.9;

                for (int ix = 0; ix < gridOriginalFineX.GetLength(0); ++ix)
                {
                    for (int iy = 0; iy < gridOriginalFineX.GetLength(1); ++iy)
                    {
                        double distanceX = gridOriginalFineX[ix, iy] - encoderPoint.X;
                        double distanceY = gridOriginalFineY[ix, iy] - encoderPoint.Y;
                        double distance  = Math.Sqrt(distanceX * distanceX + distanceY * distanceY);
                        if (distance < minDistance)
                        {
                            minDistance = distance;
                            retval.x    = gridOriginalFineX[ix, iy];
                            retval.y    = gridOriginalFineY[ix, iy];
                        }
                    }
                }
            } catch {
                throw new Exception("null");
            }
            //Ipt.MtoG(0, gmover.X, gmover.Y, ref gstage.X, ref gstage.Y);
            Ipt.GToM("p", retval.x, retval.y, ref gstage.X, ref gstage.Y);
            retval.x = gstage.X;
            retval.y = gstage.Y;
            return(retval);
        }
Beispiel #2
0
        /// <summary>
        /// 座標の補正値を算出して,返します.
        /// </summary>
        /// <returns>座標の補正値</returns>
        private Vector2 calcOffset()
        {
            Vector2    offset = new Vector2();
            Vector2Int iId    = new Vector2Int();
            double     emX    = new double();
            double     emY    = new double();

            // 定義されたグリッドマーク数が少ない場合は例外を返す
            int num = DefinedGridMarkNum;

            if (num < 2)
            {
                throw new Exception("Grid mark data is few(" + num.ToString() + ").");
            }

            if (gridMarks[(int)GridMarkPoint.CenterMiddle].Existed)
            {
                offset.X = gridMarks[(int)GridMarkPoint.CenterMiddle].x;
                offset.Y = gridMarks[(int)GridMarkPoint.CenterMiddle].y;
            }
            else
            {
                for (int i = 1; i < AllGridMarksNum; ++i)
                {
                    if (gridMarks[i].Existed)
                    {
                        iId = getXYGridId(i);
                        Ipt.GToM("0", gridOrgX[iId.X, iId.Y], gridOrgY[iId.X, iId.Y], ref emX, ref emY);
                        offset.X += gridMarks[i].x - emX;
                        offset.Y += gridMarks[i].y - emY;
                    }
                }
                offset.X /= DefinedGridMarkNum;
                offset.Y /= DefinedGridMarkNum;
            }

            return(offset);
        }