コード例 #1
0
 private void CheckState()
 {
     if (canvasDock.SelectedManager.Set != null)
     {
         if (canvasDock.SelectedManager.Set.IsBezierPosition)
         {
             canvasDock.BezierControl.Controller.BCPS = canvasDock.SelectedManager.Set.BAnalyzer.BCPS;
             canvasDock.BezierControl.Controller.AllowMouseOperation = true;
         }
         else if (!(canvasDock.SelectedManager.Set[RatioType.X] is ConstantRatioMaker))
         {
             var bcp  = new BezierControlPoint();
             var bcp2 = new BezierControlPoint();
             bcp.Second  = new PointF(canvasDock.SelectedManager.Set.StartState.X, canvasDock.SelectedManager.Set.StartState.Y);
             bcp2.Second = new PointF(canvasDock.SelectedManager.Set.EndState.X, canvasDock.SelectedManager.Set.EndState.Y);
             canvasDock.BezierControl.Controller.BCPS = new BezierControlPoint[] { bcp, bcp2 };
             canvasDock.BezierControl.Controller.AllowMouseOperation = true;
         }
         else
         {
             canvasDock.BezierControl.Controller.BCPS = new BezierControlPoint[0];
             canvasDock.BezierControl.Controller.AllowMouseOperation = false;
         }
         RefreshCanvas();
         if (propertyDock.IsRatioMakerAvailable)
         {
             propertyDock.SetEnables(canvasDock.SelectedManager.Set.IsBezierPosition);
         }
     }
 }
コード例 #2
0
        private static void ReadXMLBezierPositions(XmlReader reader, EffectStateRatioSet set)
        {
            var bcps = new List <BezierControlPoint>(2);

            while (reader.Read())
            {
                if (reader.IsStartElement())
                {
                    if (reader.Name == "BezierPosition")
                    {
                        try
                        {
                            var pos = reader.GetAttribute("Position");
                            var bcp = BezierControlPoint.Deserialize(pos);
                            bcps.Add(bcp);
                        }
                        catch
                        {
                        }
                    }
                }
            }
            if (bcps.Count >= 2)
            {
                set.BAnalyzer = new BezierAnalyzer(bcps.ToArray());
            }
            reader.Close();
        }
コード例 #3
0
 public void SetLinearRatio()
 {
     bcps = new BezierControlPoint[] {
         BezierControlPoint.Deserialize("VT=1 SX=0 SY=128 TDX=0.707106781 TDY=-0.707106781 TL=60"),
         BezierControlPoint.Deserialize("VF=1 SX=128 SY=0 FDX=-0.707106781 FDY=0.707106781 FL=60")
     };
     IsLinear = true;
     DrawandRefresh();
 }
コード例 #4
0
 private void button4_Click(object sender, EventArgs e)
 {
     BezierControlPoint[] bcps = new BezierControlPoint[2];
     for (int i = 0; i < bcps.Length; i++)
     {
         bcps[i] = bezierRatioDrawer1.BCPS[i].Clone();
     }
     MainForm.CopiedBezier = bcps;
 }
コード例 #5
0
ファイル: Checker.cs プロジェクト: yvanoff/nitrosharp
 public bool AddPoint(BezierControlPoint pt)
 {
     if (_count == 4)
     {
         return(false);
     }
     Points[_count++] = pt;
     return(true);
 }
コード例 #6
0
        private void DrawTransData(IBezierDrawContext context)
        {
            context.DrawLines(Color.Black, new PointF[] { transBeziers.TransformRectange.TopLeft, transBeziers.TransformRectange.TopRight, transBeziers.TransformRectange.BottomRight, transBeziers.TransformRectange.BottomLeft, transBeziers.TransformRectange.TopLeft });
            DrawSquare(transBeziers.TransformRectange.TopLeft, context);
            DrawSquare(transBeziers.TransformRectange.TopRight, context);
            DrawSquare(transBeziers.TransformRectange.BottomLeft, context);
            DrawSquare(transBeziers.TransformRectange.BottomRight, context);
            DrawSquare(transBeziers.TransformRectange.TopMiddle, context);
            DrawSquare(transBeziers.TransformRectange.LeftMiddle, context);
            DrawSquare(transBeziers.TransformRectange.RightMiddle, context);
            DrawSquare(transBeziers.TransformRectange.BottomMiddle, context);
            PointF center = transBeziers.TransformRectange.Center;

            context.DrawEllipse(Color.Black, new RectangleF
            {
                X      = center.X - 3,
                Width  = 6,
                Y      = center.Y - 3,
                Height = 6
            });

            BezierControlPoint previous = null;

            foreach (BezierControlPoint bcp in transBeziers.BCPS)
            {
                if (previous != null)
                {
                    if (previous.ValidThird)
                    {
                        if (!bcp.ValidFirst)
                        {
                            //second bezier
                            DrawBezeier(previous.Second, previous.Third, bcp.Second, bcp.Second, context);
                        }
                        else
                        {
                            //third bezier
                            DrawBezeier(previous.Second, previous.Third, bcp.First, bcp.Second, context);
                        }
                    }
                    else
                    {
                        if (!bcp.ValidFirst)
                        {
                            //first bezier
                            context.DrawLine(Color.Black, previous.Second, bcp.Second);
                        }
                        else
                        {
                            //second bezier
                            DrawBezeier(previous.Second, previous.Second, bcp.First, bcp.Second, context);
                        }
                    }
                }
                previous = bcp;
            }
        }
コード例 #7
0
        private void DrawNormalData(Graphics g)
        {
            BezierControlPoint p1 = bcps[0];
            BezierControlPoint p2 = bcps[1];

            DrawBezeier(p1.Second, p1.Third, p2.First, p2.Second, g);
            DrawAnchor(p1, g);
            DrawAnchor(p2, g);
        }
コード例 #8
0
ファイル: Checker.cs プロジェクト: yvanoff/nitrosharp
 static bool consumePoint(
     ref ReadOnlySpan <BezierControlPoint> points,
     out BezierControlPoint pt)
 {
     if (points.Length == 0)
     {
         pt = default;
         return(false);
     }
     pt     = points[0];
     points = points[1..];
コード例 #9
0
        public StraighteningCommand(Link link)
        {
            if (link == null)
            {
                throw new ArgumentNullException();
            }

            CP1 = link.LayoutData.CP1;
            CP2 = link.LayoutData.CP2;

            Link = link;
        }
コード例 #10
0
 private void button5_Click(object sender, EventArgs e)
 {
     if (MainForm.CopiedBezier != null)
     {
         BezierControlPoint[] bcps = new BezierControlPoint[2];
         for (int i = 0; i < bcps.Length; i++)
         {
             bcps[i] = MainForm.CopiedBezier[i].Clone();
         }
         bezierRatioDrawer1.BCPS = bcps;
         bezierRatioDrawer1.DrawandRefresh();
     }
 }
コード例 #11
0
        private void BezierRatioDrawer_MouseDown(object sender, MouseEventArgs e)
        {
            BezierControlPoint p1 = bcps[0];
            BezierControlPoint p2 = bcps[1];
            var downpos           = new PointF(e.X, e.Y);

            selected = null;
            if (IsInside(p1.Third, downpos))
            {
                selected = p1;
            }
            else if (IsInside(p2.First, downpos))
            {
                selected = p2;
            }
        }
コード例 #12
0
        private void DrawAnchor(BezierControlPoint bcp, Graphics g)
        {
            var pen = new Pen(Color.Blue, 2);

            if (bcp.ValidFirst)
            {
                FillSquare(bcp.First, g);
                g.DrawLine(pen, bcp.First, bcp.Second);
            }
            if (bcp.ValidThird)
            {
                FillSquare(bcp.Third, g);
                g.DrawLine(pen, bcp.Second, bcp.Third);
            }
            pen.Dispose();
        }
コード例 #13
0
        private void CreateCircle()
        {
            float temp    = 0.5522847f;
            var   data    = new List <BezierControlPoint>();
            float radius  = 60;
            float centerx = 300;
            float centery = 162;
            var   bcp     = new BezierControlPoint
            {
                Second     = new PointF(centerx + radius, centery),
                First      = new PointF(centerx + radius, centery - radius * temp),
                Third      = new PointF(centerx + radius, centery + radius * temp),
                ValidFirst = true,
                ValidThird = true
            };

            data.Add(bcp);
            bcp = new BezierControlPoint
            {
                Second     = new PointF(centerx, centery + radius),
                First      = new PointF(centerx + radius * temp, centery + radius),
                Third      = new PointF(centerx + -radius * temp, centery + radius),
                ValidFirst = true,
                ValidThird = true
            };
            data.Add(bcp);
            bcp = new BezierControlPoint
            {
                Second     = new PointF(centerx + -radius, centery),
                First      = new PointF(centerx + -radius, centery + radius * temp),
                Third      = new PointF(centerx + -radius, centery - radius * temp),
                ValidFirst = true,
                ValidThird = true
            };
            data.Add(bcp);
            bcp = new BezierControlPoint
            {
                Second     = new PointF(centerx, centery - radius),
                First      = new PointF(centerx - radius * temp, centery - radius),
                Third      = new PointF(centerx + radius * temp, centery - radius),
                ValidFirst = true,
                ValidThird = true
            };
            data.Add(bcp);
            data.Add(data[0]);
            bezierControl1.Controller.BCPS = data.ToArray();
        }
コード例 #14
0
        private void DrawNormalData(IBezierDrawContext context)
        {
            BezierControlPoint previous = null;

            for (int i = 0; i < data.Count; i++)
            {
                var bcp = data[i] as BezierControlPoint;
                if ((dmode & DrawMode.Anchor) == DrawMode.Anchor)
                {
                    DrawAnchor(bcp, context);
                }
                if ((dmode & DrawMode.Line) == DrawMode.Line)
                {
                    if (previous != null)
                    {
                        if (previous.ValidThird)
                        {
                            if (!bcp.ValidFirst)
                            {
                                //second bezier
                                DrawBezeier(previous.Second, previous.Third, bcp.Second, bcp.Second, context);
                            }
                            else
                            {
                                //third bezier
                                DrawBezeier(previous.Second, previous.Third, bcp.First, bcp.Second, context);
                            }
                        }
                        else
                        {
                            if (!bcp.ValidFirst)
                            {
                                //first bezier
                                context.DrawLine(Color.Black, previous.Second, bcp.Second);
                            }
                            else
                            {
                                //second bezier
                                DrawBezeier(previous.Second, previous.Second, bcp.First, bcp.Second, context);
                            }
                        }
                    }
                }
                previous = bcp;
            }
        }
コード例 #15
0
        private void CreateCircle()
        {
            float temp   = 0.5522847f;
            var   data   = new List <BezierControlPoint>();
            float radius = 100;
            var   bcp    = new BezierControlPoint
            {
                Second     = new PointF(radius, 0),
                First      = new PointF(radius, -radius * temp),
                Third      = new PointF(radius, radius * temp),
                ValidFirst = true,
                ValidThird = true
            };

            data.Add(bcp);
            bcp = new BezierControlPoint
            {
                Second     = new PointF(0, radius),
                First      = new PointF(radius * temp, radius),
                Third      = new PointF(-radius * temp, radius),
                ValidFirst = true,
                ValidThird = true
            };
            data.Add(bcp);
            bcp = new BezierControlPoint
            {
                Second     = new PointF(-radius, 0),
                First      = new PointF(-radius, radius * temp),
                Third      = new PointF(-radius, -radius * temp),
                ValidFirst = true,
                ValidThird = true
            };
            data.Add(bcp);
            bcp = new BezierControlPoint
            {
                Second     = new PointF(0, -radius),
                First      = new PointF(-radius * temp, -radius),
                Third      = new PointF(radius * temp, -radius),
                ValidFirst = true,
                ValidThird = true
            };
            data.Add(bcp);
            data.Add(data[0]);
            bezierControl1.Controller.BCPS = data.ToArray();
        }
コード例 #16
0
        private void CreatePolygon(int num)
        {
            var   data    = new List <BezierControlPoint>();
            float radius  = 60;
            float centerx = 300;
            float centery = 162;

            for (int i = 0; i < num; i++)
            {
                var bcp = new BezierControlPoint();
                var cos = (float)Math.Cos(Math.PI * 2 * i / num);
                var sin = (float)Math.Sin(Math.PI * 2 * i / num);
                bcp.Second = new PointF(centerx + radius * cos, centery + radius * sin);
                data.Add(bcp);
            }
            data.Add(data[0]);
            bezierControl1.Controller.BCPS = data.ToArray();
        }
コード例 #17
0
 private void DrawAnchor(BezierControlPoint bcp, IBezierDrawContext context)
 {
     if (SelectedPoint == bcp)
     {
         FillSquare(bcp.Second, context);
         if (bcp.ValidFirst)
         {
             FillSquare(bcp.First, context);
             context.DrawLine(Color.Black, bcp.First, bcp.Second);
         }
         if (bcp.ValidThird)
         {
             FillSquare(bcp.Third, context);
             context.DrawLine(Color.Black, bcp.Second, bcp.Third);
         }
     }
     else
     {
         DrawSquare(bcp.Second, context);
     }
 }
コード例 #18
0
        private void GetTransFormed(BezierControlPoint bcp)
        {
            var mat = new Matrix();

            mat.Translate(TransRec.Move.X, TransRec.Move.Y);
            mat.RotateAt(TransRec.Rotation, TransRec.DefaultCenter);
            mat.Translate(TransformRectange.DefaultCenter.X, TransformRectange.DefaultCenter.Y);
            mat.Scale(TransRec.Scale.X, TransRec.Scale.Y);
            mat.Translate(-TransformRectange.DefaultCenter.X, -TransformRectange.DefaultCenter.Y);
            var temp = new PointF[] { bcp.Second, bcp.First, bcp.Third };

            mat.TransformPoints(temp);
            bcp.Second = temp[0];
            if (bcp.ValidFirst)
            {
                bcp.First = temp[1];
            }
            if (bcp.ValidThird)
            {
                bcp.Third = temp[2];
            }
        }
コード例 #19
0
 public void BezierEdit()
 {
     try
     {
         BezierControlPoint[] bcps = new BezierControlPoint[canvasDock.BezierControl.Controller.BCPS.Length];
         for (int i = 0; i < bcps.Length; i++)
         {
             bcps[i] = (BezierControlPoint)canvasDock.BezierControl.Controller.BCPS[i].Clone();
         }
         if (historyDock.CommandManager.LastCommand is BezierPositionChangeCommand lastbpcc)
         {
             lastbpcc.BCPS = bcps;
             lastbpcc.SpecialExecute();
             return;
         }
         var bpcc = new BezierPositionChangeCommand(canvasDock.EffectManager, changebezierposition, canvasDock.SelectedManager, bcps);
         bpcc.Execute();
         historyDock.CommandManager.AddCommand(bpcc);
     }
     catch (Exception e)
     {
         MessageBox.Show(e.Message);
     }
 }
コード例 #20
0
 private void NormalMouseDown(PointF downpos, bool isLeftButton, Keys modifierKeys)
 {
     if ((modifierKeys & Keys.Control) == Keys.Control)
     {
         bool foundanchor = false;
         if (SelectedPoint != null && SelectedPoint.ValidFirst && SelectedPoint.ValidThird)
         {
             if (IsInside(SelectedPoint.First, downpos))
             {
                 foundanchor = true;
                 changedFlag = true;
                 mode        = Mode.ChangeFirst;
             }
             else if (IsInside(SelectedPoint.Third, downpos))
             {
                 foundanchor = true;
                 changedFlag = true;
                 mode        = Mode.ChangeThird;
             }
         }
         if (!foundanchor)
         {
             SelectedPoint = null;
             for (int i = 0; i < data.Count; i++)
             {
                 var bcp = data[i] as BezierControlPoint;
                 if (IsInside(bcp.Second, downpos))
                 {
                     SelectedPoint = bcp;
                     changedFlag   = true;
                     mode          = Mode.Move;
                     break;
                 }
             }
         }
     }
     else if ((modifierKeys & Keys.Shift) == Keys.Shift)
     {
         SelectedPoint = null;
         for (int i = 0; i < data.Count; i++)
         {
             var bcp = data[i] as BezierControlPoint;
             if (IsInside(bcp.Second, downpos))
             {
                 SelectedPoint = bcp;
                 changedFlag   = true;
                 mode          = Mode.RestrictMove;
                 break;
             }
         }
     }
     else if ((modifierKeys & Keys.Alt) == Keys.Alt)
     {
         bool foundanchor = false;
         if (SelectedPoint != null && SelectedPoint.ValidFirst && SelectedPoint.ValidThird)
         {
             if (IsInside(SelectedPoint.First, downpos))
             {
                 foundanchor = true;
                 changedFlag = true;
                 mode        = Mode.ChangeOnlyFirst;
             }
             else if (IsInside(SelectedPoint.Third, downpos))
             {
                 foundanchor = true;
                 changedFlag = true;
                 mode        = Mode.ChangeOnlyThird;
             }
         }
         if (!foundanchor)
         {
             SelectedPoint = null;
             for (int i = 0; i < data.Count; i++)
             {
                 var bcp = data[i] as BezierControlPoint;
                 if (IsInside(bcp.Second, downpos))
                 {
                     SelectedPoint      = bcp;
                     bcp.ValidFirst     = false;
                     bcp.ValidThird     = false;
                     bcp.FirstDirection = new PointF(0, 0);
                     bcp.FirstLength    = 0;
                     bcp.ThirdDirection = new PointF(0, 0);
                     bcp.ThirdLength    = 0;
                     mode        = Mode.ChangeBoth;
                     changedFlag = true;
                     break;
                 }
             }
         }
     }
     else if (isLeftButton)
     {
         BezierControlPoint next = null;
         if (IsOnLine(downpos, out BezierControlPoint previous, out float t))
         {
             if (data.Count >= 2 && previous == data[0] && data[0] != data[data.Count - 1] && t >= 0.95)
             {
                 //loop
                 SelectedPoint = previous;
                 data.Add(previous);
                 changedFlag = true;
                 OnEdited(EditType.Add, data.Count - 1);
             }
             else
             {
                 var index = data.IndexOf(previous);
                 if (index < data.Count - 1)
                 {
                     next = data[index + 1] as BezierControlPoint;
                 }
                 BezierCaliculate.GetDevidedBeziers(previous, next, t, out BezierControlPoint bcp1, out BezierControlPoint bcp2, out BezierControlPoint bcp3);
                 var previousIndex = data.IndexOf(previous);
                 data[previousIndex]     = bcp1;
                 data[previousIndex + 1] = bcp3;
                 data.Insert(previousIndex + 1, bcp2);
                 SelectedPoint = bcp2;
                 changedFlag   = true;
                 OnEdited(EditType.Add, previousIndex + 1);
             }
         }
         else
         {
             var bcp = new BezierControlPoint
             {
                 Second = downpos
             };
             data.Add(bcp);
             SelectedPoint = bcp;
             changedFlag   = true;
             OnEdited(EditType.Add, data.Count - 1);
         }
     }
コード例 #21
0
 private void BezierRatioDrawer_MouseUp(object sender, MouseEventArgs e)
 {
     selected = null;
 }
コード例 #22
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="p1">ベジエ頂点1</param>
 /// <param name="p2">ベジエ頂点2</param>
 public BezierRatioMaker(BezierControlPoint p1, BezierControlPoint p2)
 {
     Analyzer = new BezierAnalyzer(new BezierControlPoint[] { p1, p2 });
 }
コード例 #23
0
        private static void ReadXMLRatioMakers(XmlReader reader, EffectStateRatioSet set)
        {
            while (reader.Read())
            {
                if (reader.Name == "RatioMaker")
                {
                    RatioType type = RatioType.X;
                    switch (reader.GetAttribute("Type"))
                    {
                    case "X":
                        type = RatioType.X;
                        break;

                    case "Y":
                        type = RatioType.Y;
                        break;

                    case "Alpha":
                        type = RatioType.Alpha;
                        break;

                    case "Rotation":
                        type = RatioType.Rotation;
                        break;

                    case "ScaleX":
                        type = RatioType.ScaleX;
                        break;

                    case "ScaleY":
                        type = RatioType.ScaleY;
                        break;

                    case "BezierPosition":
                        type = RatioType.BezierPosition;
                        break;
                    }
                    IRatioMaker maker = null;
                    switch (reader.GetAttribute("MakerType"))
                    {
                    case "LinearRatioMaker":
                        maker = new LinearRatioMaker();
                        break;

                    case "ConstantRatioMaker":
                        maker = new ConstantRatioMaker();
                        break;

                    case "BezierRatioMaker":
                        var p1 = BezierControlPoint.Deserialize(reader.GetAttribute("P1"));
                        var p2 = BezierControlPoint.Deserialize(reader.GetAttribute("P2"));
                        maker = new BezierRatioMaker(p1, p2);
                        break;
                    }
                    maker.Set = set;
                    set[type] = maker;
                }
            }
            reader.Close();
            set.SetDefaultToNullMaker();
        }
コード例 #24
0
        BezierLayoutInfo GetLayoutInfo(BezierControlPoint controlPoint1, BezierControlPoint controlPoint2)
        {
            var layout = new BezierLayoutInfo();

            layout.CP1 = controlPoint1;
            layout.CP2 = controlPoint2;

            Point     cp1, cp2;
            Rectangle rect1 = From.Bounds;
            Rectangle rect2 = Target.Bounds;
            Point     pts   = PaintHelper.CenterPoint(rect1);
            Point     ptd   = PaintHelper.CenterPoint(rect2);

            rect1.Inflate(2, 2);
            rect2.Inflate(2, 2);
            if (StartCap != LineAnchor.None)
            {
                rect1.Inflate(Layouter.LineAnchorSize, Layouter.LineAnchorSize);
            }
            if (EndCap != LineAnchor.None)
            {
                rect2.Inflate(Layouter.LineAnchorSize, Layouter.LineAnchorSize);
            }

            if (pts == ptd)
            {
                cp1 = pts;
                cp2 = ptd;

                layout.Bounds = Rectangle.Empty;
                layout.Region = null;
            }
            else
            {
                cp1 = BezierHelper.GetControlPoint(pts, controlPoint1);
                cp2 = BezierHelper.GetControlPoint(ptd, controlPoint2);

                //Point[] controlPoints = GetControlPoints(pts, ptd);

                Shape sShape = Shape.GetShaper(From);
                pts = sShape.GetBorderPoint(rect1, cp1);

                Shape dShape = Shape.GetShaper(Target);
                ptd = sShape.GetBorderPoint(rect2, cp2);

                GraphicsPath gp = new GraphicsPath();
                gp.AddBezier(pts, cp1, cp2, ptd);
                Pen penWiden = new Pen(Color.Black, LineWidth + 5);
                gp.Widen(penWiden);

                var rect = gp.GetBounds();
                rect.Inflate(LineWidth, LineWidth);
                layout.Bounds = rect;
                layout.Region = new Region(gp);
            }

            Point     ptCenter   = BezierHelper.GetPoint(pts, cp1, cp2, ptd, 0.5f);
            Rectangle textBounds = layout.TextBounds;

            textBounds.X = ptCenter.X - layout.TextBounds.Width / 2;
            textBounds.Y = ptCenter.Y - layout.TextBounds.Height / 2;

            // cache layout info
            layout.StartBounds   = rect1;
            layout.EndBounds     = rect2;
            layout.StartPoint    = pts;
            layout.EndPoint      = ptd;
            layout.ControlPoint1 = cp1;
            layout.ControlPoint2 = cp2;
            layout.TextBounds    = textBounds;

            return(layout);
        }