public string GetPath(SVGContext context) { PointDbl p = new PointDbl(context.fxy(this.center)); PointDbl dbl4 = new PointDbl(context.fxy(this.cd1)); PointDbl dbl3 = new PointDbl(context.fxy(this.cd2)); PointDbl dbl2 = new PointDbl(this.context_fxy2(this.v1, context)); PointDbl dbl = new PointDbl(this.context_fxy2(this.v2, context)); SVGEllipseArc arc = CGM2SVGMath.FindSVGArc(p, dbl4, dbl3, dbl2, dbl); string dAttribute = arc.dAttribute; string transformAttribute = arc.transformAttribute; if ((arc.StartP.X == arc.EndP.X) & (arc.StartP.Y == arc.EndP.Y)) { SVGEllipseArc arc2 = arc; arc2.EndP.Y++; dAttribute = arc.dAttribute; } switch (this.closingType) { case 0: return(dAttribute + string.Format(" L{0},{1} L{2},{3} Z", new object[] { arc.CenterP.X, arc.CenterP.Y, arc.StartP.X, arc.StartP.Y })); case 1: return(dAttribute + string.Format(" L{0},{1} Z", arc.StartP.X, arc.StartP.Y)); } return(dAttribute); }
public void SetCircle3Points(Point[] p) { PointDbl[] dblArray = new PointDbl[3]; PointDbl dbl3 = new PointDbl(p[0]); dblArray[0] = dbl3; PointDbl dbl2 = new PointDbl(p[1]); dblArray[1] = dbl2; PointDbl dbl = new PointDbl(p[2]); dblArray[2] = dbl; CircleInfo info = CGM2SVGMath.FindCircleBy3Points(dblArray); if (info.R >= 0.0) { this.center.X = new decimal(info.Center.X); this.center.Y = new decimal(info.Center.Y); this.SetCircleDiameters(info.R, Math2.CompareAngles(Convert.ToDouble(decimal.Subtract(p[2].X, p[0].X)), Convert.ToDouble(decimal.Subtract(p[2].Y, p[0].Y)), Convert.ToDouble(decimal.Subtract(p[1].X, p[0].X)), Convert.ToDouble(decimal.Subtract(p[1].Y, p[0].Y))) < 0.0); this.v1.X = decimal.Subtract(p[0].X, this.center.X); this.v1.Y = decimal.Subtract(p[0].Y, this.center.Y); this.v2.X = decimal.Subtract(p[2].X, this.center.X); this.v2.Y = decimal.Subtract(p[2].Y, this.center.Y); } else { this.collinearCoords = true; this.center = p[1]; this.SetCircleDiameters(Math2.Distance(Convert.ToDouble(decimal.Subtract(p[0].X, this.center.X)), Convert.ToDouble(decimal.Subtract(p[2].X, this.center.X))), false); this.v1.X = decimal.Subtract(p[0].X, this.center.X); this.v1.Y = decimal.Subtract(p[0].Y, this.center.Y); this.v2.X = decimal.Subtract(p[2].X, this.center.X); this.v2.Y = decimal.Subtract(p[2].Y, this.center.Y); } }
public override bool Equals(object obj) { if (obj is CGM.Scanner.Point) { PointF tf2 = (PointF)obj; if (Math2.IsNul(this.X - tf2.X)) { PointF tf = (PointF)obj; if (Math2.IsNul(this.Y - tf.Y)) { return(true); } } return(false); } if (!(obj is PointDbl)) { throw new InvalidCastException(); } PointDbl dbl2 = (PointDbl)obj; if (Math2.IsNul(this.X - dbl2.X)) { PointDbl dbl = (PointDbl)obj; if (Math2.IsNul(this.Y - dbl.Y)) { return(true); } } return(false); }
private static PointDbl TransformPoint(double[,] A, PointDbl p) { PointDbl dbl; double[] numArray = Math2.MultiplyMatrix(A, new double[] { p.X, p.Y, 1.0 }); dbl.X = numArray[0]; dbl.Y = numArray[1]; return(dbl); }
public static double[,] FindEllipseTransformToHorizontal(PointDbl p, PointDbl p1, PointDbl p2) { double num = Math2.Distance(p1.X - p.X, p1.Y - p.Y); double num2 = Math2.Distance(p2.X - p.X, p2.Y - p.Y); return(new double[, ] { { ((p2.X - p.X) / num2), ((p1.X - p.X) / num), p.X }, { ((p2.Y - p.Y) / num2), ((p1.Y - p.Y) / num), p.Y }, { 0.0, 0.0, 1.0 } }); }
public void UpdateSVG(XmlTextWriter doc, SVGContext context) { try { PointDbl dbl6 = new PointDbl(context.fxy(this.center)); PointDbl p = dbl6; dbl6 = new PointDbl(context.fxy(this.cd1)); PointDbl dbl2 = dbl6; dbl6 = new PointDbl(context.fxy(this.cd2)); PointDbl dbl3 = dbl6; dbl6 = new PointDbl(this.context_fxy2(this.v1, context)); PointDbl dbl4 = dbl6; dbl6 = new PointDbl(this.context_fxy2(this.v2, context)); PointDbl dbl5 = dbl6; SVGEllipseArc arc = CGM2SVGMath.FindSVGArc(p, dbl2, dbl3, dbl4, dbl5); string dAttribute = arc.dAttribute; string transformAttribute = arc.transformAttribute; switch (this.closingType) { case 0: dAttribute = dAttribute + string.Format(" L{0},{1} L{2},{3} Z", new object[] { arc.CenterP.X, arc.CenterP.Y, arc.StartP.X, arc.StartP.Y }); break; case 1: dAttribute = dAttribute + string.Format(" L{0},{1} Z", arc.StartP.X, arc.StartP.Y); break; } doc.WriteStartElement("path"); doc.WriteAttributeString("d", dAttribute); if (!String.IsNullOrEmpty(transformAttribute)) //if (StringType.StrCmp(transformAttribute, "", false) != 0) { doc.WriteAttributeString("transform", transformAttribute); } if (this.closingType >= 0) { context.PrintEdgeArc(doc); doc.WriteAttributeString("fill", context.fill); } else { context.PrintLine(doc); doc.WriteAttributeString("fill", "none"); } } finally { if (context.isClip & !String.IsNullOrEmpty(context.CurrClipID)) //if (context.isClip & (StringType.StrCmp(context.CurrClipID, "", false) != 0)) { doc.WriteAttributeString("clip-path", "url(#" + context.CurrClipID + ")"); } doc.WriteFullEndElement(); } }
public static SVGEllipseArc FindSVGArc(PointDbl p, PointDbl p1, PointDbl p2, PointDbl Δstart, PointDbl Δend) { SVGEllipseArc arc2 = new SVGEllipseArc(); arc2.RadiusX = Math2.Distance(p.X, p.Y, p2.X, p2.Y); arc2.RadiusY = Math2.Distance(p.X, p.Y, p1.X, p1.Y); double[,] a = FindEllipseTransformToHorizontal(p, p1, p2); double[,] numArray2 = SpecialInvertMatrix(a); PointDbl dbl3 = new PointDbl(Δstart.X + p.X, Δstart.Y + p.Y); PointDbl dbl2 = TransformPoint(numArray2, dbl3); double introduced10 = Math2.Sqr(dbl2.X / arc2.RadiusX); double num = Math.Sqrt(introduced10 + Math2.Sqr(dbl2.Y / arc2.RadiusY)); dbl2.X /= num; dbl2.Y /= num; dbl3 = new PointDbl(Δend.X + p.X, Δend.Y + p.Y); PointDbl dbl = TransformPoint(numArray2, dbl3); double introduced11 = Math2.Sqr(dbl.X / arc2.RadiusX); double num2 = Math.Sqrt(introduced11 + Math2.Sqr(dbl.Y / arc2.RadiusY)); dbl.X /= num2; dbl.Y /= num2; if (Math2.Is90DegIntersection(p1.X - p.X, p1.Y - p.Y, p2.X - p.X, p2.Y - p.Y)) { arc2.AngleX = Math.Atan2(a[1, 0], a[0, 0]); arc2.StartP = TransformPoint(a, dbl2); arc2.EndP = TransformPoint(a, dbl); arc2.CenterP = p; arc2.SweepFlag = Math2.CompareAngles(p1.X - p.X, p1.Y - p.Y, p2.X - p.X, p2.Y - p.Y) < 0.0; arc2.LargeArc = Math2.CompareAngles(dbl2.X, dbl2.Y, dbl.X, dbl.Y) < 0.0; return(arc2); } arc2.Transform = a; arc2.AngleX = 0.0; arc2.StartP = dbl2; arc2.EndP = dbl; dbl3 = new PointDbl(0.0, 0.0); arc2.CenterP = dbl3; arc2.SweepFlag = false; arc2.LargeArc = Math2.CompareAngles(dbl2.X, dbl2.Y, dbl.X, dbl.Y) < 0.0; return(arc2); }
public PointDbl(CGM.Scanner.Point p) { this = new PointDbl(); this.X = Convert.ToDouble(p.X); this.Y = Convert.ToDouble(p.Y); }
public PointDbl(double X, double Y) { this = new PointDbl(); this.X = X; this.Y = Y; }