Exemple #1
0
        /// <summary>
        /// 位置変更メイン
        /// </summary>
        /// <param name="polygonUnit"></param>
        /// <param name="partIndex"></param>
        /// <param name="dx"></param>
        /// <param name="dy"></param>
        /// <param name="da"></param>
        /// <param name="dr"></param>
        /// <param name="center"></param>
        /// <returns></returns>
        internal bool PointChange(MainPage.PolygonUnit polygonUnit, int partIndex, float dx, float dy, float da, float dr, Vector2 center)
        {
            int  unit = (int)polygonUnit;
            bool rot  = true;

            if (dx != 0 || dy != 0)
            {
                rot = false;
            }

            if (rot)
            {
                if (IsC() && partIndex != 2)
                {
                    if (partIndex == 1)
                    {
                        center = points[2];
                    }
                    else
                    {
                        center = befor.GetPoint(); // C の場合最低前にMが存在。
                    }
                }
                ValueRotate(partIndex, center, da, dr);
            }
            else
            {
                // 移動
                ValueChange(partIndex, dx, dy);
            }
            //----------------------------------------------------------
            if (polygonUnit == MainPage.PolygonUnit.Symmetry)
            {
            }
            else if (unit > 0 && polygonUnit != MainPage.PolygonUnit.RulerOrigin)
            {
                if (IsC() && partIndex != 2)
                {
                    var v = CalcCenter();
                    if (v == null)
                    {
                        return(false);
                    }
                    center = v.Value;
                }
                SvgPathItem last  = null;
                var         top   = FindTop();
                int         count = PathCount(ref last);
                var         item  = this;
                for (int cx = 1; cx < count / unit; cx++)
                {
                    for (int ix = 0; ix < unit; ix++)
                    {
                        item = item.FindNext(true);
                    }
                    if (item == this)
                    {
                        break;
                    }
                    item.ApplyOtherValue2(this, partIndex, center, (360.0f / count * unit) * cx);
                }
            }

            return(true);
        }
        internal string GetInfo(MainPage.PolygonUnit polygonUnitValue)
        {
            if (CurrentIndex.IsValid())
            {
                var m_path = Paths[CurrentIndex.BlockIndex];
                if (polygonUnitValue == PolygonUnit.Symmetry)
                {
                    if (CurrentIndex.BlockIndex == Paths.Count - 1)
                    {
                        Vector2 start = m_path[0].GetPoint();
                        Vector2 end   = m_path[1].GetPoint();

                        var v1 = end - start;
                        var a1 = MathF.Atan2(v1.Y, v1.X);


                        string text = string.Format("始点({0:0.00},{1:0.00}) 終点({2:0.00},{3:0.00}) 角度({4:0.0}) ", start.X, start.Y, end.X, end.Y, CmUtils.ToAngle(a1));


                        return(text);
                    }
                    else
                    {
                        Vector2 start = new Vector2();
                        Vector2 end   = new Vector2();
                        var     item  = m_path[CurrentIndex.ItemIndex];
                        var     p     = item.GetPoint(CurrentIndex.PartIndex);
                        if (RulerEnabled)
                        {
                            var ruler = Paths[Paths.Count - 1];
                            start = ruler[0].GetPoint();
                            end   = ruler[1].GetPoint();
                        }
                        else
                        {
                            CalcReferenceLine(ref start, ref end);
                        }

                        /*
                         *
                         */

                        var v1 = end - start;
                        var a1 = MathF.Atan2(v1.Y, v1.X);
                        var v2 = p - start;
                        var a2 = MathF.Atan2(v2.Y, v2.X);
                        var l  = MathF.Abs(MathF.Sin(a2 - a1) * MathF.Sqrt(MathF.Pow(v2.X, 2) + MathF.Pow(v2.Y, 2)));
                        var l2 = MathF.Cos(a2 - a1) * MathF.Sqrt(MathF.Pow(v2.X, 2) + MathF.Pow(v2.Y, 2));


                        string text = string.Format("基準から:{1:0.0} 中心線から:{0:0.0} $$  ", l, l2);

                        string info = item.GetInfo(CurrentIndex.PartIndex, true);
                        return(text + info);
                    }
                }
                else if (polygonUnitValue == PolygonUnit.RulerOrigin)
                {
                    if (RulerVisible)
                    {
                        var ruler = Paths[Paths.Count - 1];
                        var v     = ruler[0].GetPoint();

                        var    item = m_path[CurrentIndex.ItemIndex];
                        string info = item.GetInfo(CurrentIndex.PartIndex, true);


                        string text = string.Format("原点:{0:0.0} {1:0.0}", v.X, v.Y);

                        var   p   = item.GetPoint();
                        var   ofy = p.Y - v.Y;
                        var   ofx = p.X - v.X;
                        float r   = MathF.Sqrt(MathF.Pow(ofx, 2) + MathF.Pow(ofy, 2));

                        var a = MathF.Atan2(ofy, ofx);

                        text += string.Format(" 半径 {0:0.00} 角度 {1:0.00}", r, ToAngle(a));


                        return(text + info);
                    }
                }
                else if (polygonUnitValue != MainPage.PolygonUnit.none)
                {
                    int unit  = (int)polygonUnitValue;
                    var count = m_path.Count - 1;
                    if (IsSameLast(m_path))
                    {
                        count--;
                    }
                    if (count >= unit * 2 && count % 2 == 0)
                    {
                        var    PolygonCenter = CalcCenter(m_path);
                        string text          = string.Format("中心:{0:0.0} {1:0.0}", PolygonCenter.X, PolygonCenter.Y);
                        var    index         = CurrentIndex.ItemIndex;//
                        if (index >= 0)
                        {
                            var   item = m_path[index];
                            var   p    = item.GetPoint();
                            var   v    = PolygonCenter;
                            var   ofy  = p.Y - v.Y;
                            var   ofx  = p.X - v.X;
                            float r    = MathF.Sqrt(MathF.Pow(ofx, 2) + MathF.Pow(ofy, 2));

                            var a = MathF.Atan2(ofy, ofx);

                            text += string.Format(" 半径 {0:0.00} 角度 {1:0.00}", r, ToAngle(a));


                            var    partIndex = CurrentIndex.PartIndex; //
                            string info      = item.GetInfo(partIndex, true);
                            text += info;
                        }
                        return(text);
                    }
                }
                {
                    var index     = CurrentIndex.ItemIndex; //
                    var partIndex = CurrentIndex.PartIndex; //
                    if (index >= 0)
                    {
                        var    item = m_path[index];
                        string info = item.GetInfo(partIndex);

                        return(info);
                    }
                }
            }
            return("選択されていません");
        }