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); } } }
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(); }
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(); }
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; }
public bool AddPoint(BezierControlPoint pt) { if (_count == 4) { return(false); } Points[_count++] = pt; return(true); }
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; } }
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); }
static bool consumePoint( ref ReadOnlySpan <BezierControlPoint> points, out BezierControlPoint pt) { if (points.Length == 0) { pt = default; return(false); } pt = points[0]; points = points[1..];
public StraighteningCommand(Link link) { if (link == null) { throw new ArgumentNullException(); } CP1 = link.LayoutData.CP1; CP2 = link.LayoutData.CP2; Link = link; }
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(); } }
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; } }
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(); }
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(); }
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; } }
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(); }
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(); }
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); } }
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]; } }
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); } }
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); } }
private void BezierRatioDrawer_MouseUp(object sender, MouseEventArgs e) { selected = null; }
/// <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 }); }
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(); }
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); }