예제 #1
0
        /// <summary>
        /// 恾宍偺堏摦 (懭墌)
        /// </summary>
        /// <param name="figure">恾宍</param>
        /// <param name="current">尰嵼偺儅僂僗埵抲</param>
        /// <param name="info">儃僞儞墴壓帪偺忣曬</param>
        /// <param name="key">儃僞儞墴壓帪偺僉乕儃乕僪忣曬</param>
        protected virtual void ModifyFigure(FVIL.GDI.CFviGdiEllipse figure, FVIL.Data.CFviPoint current, MouseInfo info, KeyboardInfo key)
        {
            if (info.iGripPosition == 0)
            {
                return;
            }

            // 恾宍傪堏摦.
            FVIL.GDI.RectPosition rectpos = (FVIL.GDI.RectPosition)info.iGripPosition;
            if ((rectpos & FVIL.GDI.RectPosition.ALL) == FVIL.GDI.RectPosition.ALL)
            {
                MoveFigure(figure, current, info, key);
                return;
            }

            // 儅僂僗墴壓帪偺忣曬偱嵗昗寁嶼偡傞.
            FVIL.Data.CFviPoint axis  = Math.Add(info.position, info.axis);
            FVIL.Data.CFviAngle angle = Math.Invert(info.angle);
            FVIL.Data.CFviPoint pos   = FVIL.Math.Rotate(current, axis, angle);

            // 恾宍偺曄宍.
            FVIL.Data.CFviRectangle clip = figure.GetClipRect();

            if ((rectpos & FVIL.GDI.RectPosition.Left) == FVIL.GDI.RectPosition.Left)
            {
                clip.Left = pos.X;
            }
            if ((rectpos & FVIL.GDI.RectPosition.Right) == FVIL.GDI.RectPosition.Right)
            {
                clip.Right = pos.X;
            }
            if ((rectpos & FVIL.GDI.RectPosition.Top) == FVIL.GDI.RectPosition.Top)
            {
                clip.Top = pos.Y;
            }
            if ((rectpos & FVIL.GDI.RectPosition.Bottom) == FVIL.GDI.RectPosition.Bottom)
            {
                clip.Bottom = pos.Y;
            }

            double radius_x = clip.Width / 2;
            double radius_y = clip.Height / 2;

            figure.X     = clip.X + radius_x;
            figure.Y     = clip.Y + radius_y;
            figure.AxisX = radius_x;
            figure.AxisY = radius_y;

            // --- 婡幉偺曗惓.
            if (angle.Degree != 0.0)
            {
                figure.Axis = Math.Sub(axis, figure.Position);
            }
        }
예제 #2
0
        /// <summary>
        /// 恾宍偺堏摦 (恀墌)
        /// </summary>
        /// <param name="figure">恾宍</param>
        /// <param name="current">尰嵼偺儅僂僗埵抲</param>
        /// <param name="info">儃僞儞墴壓帪偺忣曬</param>
        /// <param name="key">儃僞儞墴壓帪偺僉乕儃乕僪忣曬</param>
        protected virtual void ModifyFigure(FVIL.GDI.CFviGdiCircle figure, FVIL.Data.CFviPoint current, MouseInfo info, KeyboardInfo key)
        {
            if (info.iGripPosition == 0)
            {
                return;
            }

            // 恾宍傪堏摦.
            FVIL.GDI.RectPosition rectpos = (FVIL.GDI.RectPosition)info.iGripPosition;
            if ((rectpos & FVIL.GDI.RectPosition.ALL) == FVIL.GDI.RectPosition.ALL)
            {
                MoveFigure(figure, current, info, key);
                return;
            }

            // 儅僂僗墴壓帪偺忣曬偱嵗昗寁嶼偡傞.
            FVIL.Data.CFviPoint axis  = Math.Add(info.position, info.axis);
            FVIL.Data.CFviAngle angle = Math.Invert(info.angle);
            FVIL.Data.CFviPoint mouse = FVIL.Math.Rotate(info.mouse, axis, angle);
            FVIL.Data.CFviPoint pos   = FVIL.Math.Rotate(current, axis, angle);
            FVIL.Data.CFviPoint move  = Math.Sub(pos, mouse);

            // 恾宍偺曄宍.
            bool L = ((rectpos & FVIL.GDI.RectPosition.Left) == FVIL.GDI.RectPosition.Left);
            bool R = ((rectpos & FVIL.GDI.RectPosition.Right) == FVIL.GDI.RectPosition.Right);
            bool T = ((rectpos & FVIL.GDI.RectPosition.Top) == FVIL.GDI.RectPosition.Top);
            bool B = ((rectpos & FVIL.GDI.RectPosition.Bottom) == FVIL.GDI.RectPosition.Bottom);

            FVIL.Data.CFviRectangle clip = figure.GetClipRect();

            if (L && T)
            {
                clip.Left = (mouse.X + move.X);
                clip.Top  = (mouse.Y + move.X);
            }
            else if (L && B)
            {
                clip.Left   = (mouse.X + move.X);
                clip.Bottom = (mouse.Y - move.X);
            }
            else if (R && T)
            {
                clip.Right = (mouse.X + move.X);
                clip.Top   = (mouse.Y - move.X);
            }
            else if (R && B)
            {
                clip.Right  = (mouse.X + move.X);
                clip.Bottom = (mouse.Y + move.X);
            }
            else if (L)
            {
                clip.Left    = (mouse.X + move.X);
                clip.Top    += move.X / 2;
                clip.Bottom -= move.X / 2;
            }
            else if (R)
            {
                clip.Right   = (mouse.X + move.X);
                clip.Top    -= move.X / 2;
                clip.Bottom += move.X / 2;
            }
            else if (T)
            {
                clip.Top    = (mouse.Y + move.Y);
                clip.Left  += move.Y / 2;
                clip.Right -= move.Y / 2;
            }
            else if (B)
            {
                clip.Bottom = (mouse.Y + move.Y);
                clip.Left  -= move.Y / 2;
                clip.Right += move.Y / 2;
            }

            double radius_x = clip.Width / 2;
            double radius_y = clip.Height / 2;

            figure.X = clip.X + radius_x;
            figure.Y = clip.Y + radius_y;

            if (L || R)
            {
                figure.Radius = clip.Width / 2;
            }
            else
            {
                figure.Radius = clip.Height / 2;
            }

            // --- 婡幉偺曗惓.
            if (angle.Degree != 0.0)
            {
                figure.Axis = Math.Sub(axis, figure.Position);
            }
        }