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 void UpdateSVG(XmlTextWriter doc, SVGContext context) { this.center = context.fxy(this.center); this.cd1 = context.fxy(this.cd1); this.cd2 = context.fxy(this.cd2); double introduced4 = Convert.ToDouble(decimal.Subtract(this.cd1.X, this.center.X)); double num2 = Math2.Distance(introduced4, Convert.ToDouble(decimal.Subtract(this.cd1.Y, this.center.Y))); double introduced5 = Convert.ToDouble(decimal.Subtract(this.cd2.X, this.center.X)); double num3 = Math2.Distance(introduced5, Convert.ToDouble(decimal.Subtract(this.cd2.Y, this.center.Y))); decimal introduced6 = decimal.Subtract(this.cd1.Y, this.center.Y); double num = Math.Atan(Convert.ToDouble(decimal.Divide(introduced6, decimal.Subtract(this.cd1.X, this.center.X)))) * 57.295779513082323; doc.WriteStartElement("ellipse"); doc.WriteAttributeString("cx", this.center.X.ToString()); doc.WriteAttributeString("cy", this.center.Y.ToString()); doc.WriteAttributeString("rx", num2.ToString()); doc.WriteAttributeString("ry", num3.ToString()); doc.WriteAttributeString("transform", "rotate(" + num.ToString() + " " + this.center.X.ToString() + " " + this.center.Y.ToString() + ")"); context.PrintEdge(doc); doc.WriteAttributeString("fill", context.fill); 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 void updatesvg(XmlTextWriter doc) { Bitmap bitmap = new Bitmap(this.nx, this.ny, PixelFormat.Format24bppRgb); int num4 = this.nx - 1; for (int i = 0; i <= num4; i++) { int num3 = this.ny - 1; for (int j = 0; j <= num3; j++) { bitmap.SetPixel((this.nx - 1) - i, j, this.cellarray[i, j]); } } MemoryStream stream = new MemoryStream(); PNGMaker.Convert((Image)bitmap, (Stream)stream); stream.Close(); doc.WriteStartElement("image"); doc.WriteAttributeString("x", (this.mycontext.fx(Convert.ToDouble(decimal.Compare(this.p.X, this.r.X) < 0 ? this.p.X : this.r.X))).ToString()); doc.WriteAttributeString("y", (this.mycontext.fy(Convert.ToDouble(decimal.Compare(this.p.Y, this.q.Y) > 0 ? this.p.Y : this.q.Y))).ToString()); double introduced6 = Convert.ToDouble(this.p.X); double introduced7 = Convert.ToDouble(this.r.X); doc.WriteAttributeString("width", (this.mycontext.fscale(Math2.Distance(introduced6, Convert.ToDouble(this.p.Y), introduced7, Convert.ToDouble(this.r.Y)))).ToString()); double introduced8 = Convert.ToDouble(this.r.X); double introduced9 = Convert.ToDouble(this.q.X); doc.WriteAttributeString("height", (this.mycontext.fscale(Math2.Distance(introduced8, Convert.ToDouble(this.r.Y), introduced9, Convert.ToDouble(this.q.Y)))).ToString()); doc.WriteAttributeString("href", "http://www.w3.org/1999/xlink", "data:;base64," + Convert.ToBase64String(stream.ToArray())); if (this.mycontext.isClip & !String.IsNullOrEmpty(mycontext.CurrClipID)) //if (this.mycontext.isClip & (StringType.StrCmp(this.mycontext.CurrClipID, "", false) != 0)) { doc.WriteAttributeString("clip-path", "url(#" + this.mycontext.CurrClipID + ")"); } doc.WriteEndElement(); }
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 } }); }
// Methods public static CircleInfo FindCircleBy3Points(PointDbl[] p) { CircleInfo info = new CircleInfo();//TODO if (Math2.IsNul(Math2.CompareAngles(p[0].X - p[1].X, p[0].Y - p[1].Y, p[2].X - p[1].X, p[2].Y - p[1].Y))) { info.R = -1.0; return(info); } double[] numArray = Math2.SolveSystem2(new double[, ] { { 2.0 * (p[0].X - p[2].X), 2.0 * (p[0].Y - p[2].Y) }, { 2.0 * (p[1].X - p[2].X), 2.0 * (p[1].Y - p[2].Y) } }, new double[] { (((p[0].X * p[0].X) - (p[2].X * p[2].X)) + (p[0].Y * p[0].Y)) - (p[2].Y * p[2].Y), (((p[1].X * p[1].X) - (p[2].X * p[2].X)) + (p[1].Y * p[1].Y)) - (p[2].Y * p[2].Y) }); info.Center.X = numArray[0]; info.Center.Y = numArray[1]; info.R = Math2.Distance(p[0].X - numArray[0], p[0].Y - numArray[1]); return(info); }
// Methods public string GetPath(SVGContext context) { this.center = context.fxy(this.center); this.cd1 = context.fxy(this.cd1); this.cd2 = context.fxy(this.cd2); double introduced6 = Convert.ToDouble(decimal.Subtract(this.cd1.X, this.center.X)); double num2 = Math2.Distance(introduced6, Convert.ToDouble(decimal.Subtract(this.cd1.Y, this.center.Y))); double introduced7 = Convert.ToDouble(decimal.Subtract(this.cd2.X, this.center.X)); double num3 = Math2.Distance(introduced7, Convert.ToDouble(decimal.Subtract(this.cd2.Y, this.center.Y))); decimal introduced8 = decimal.Subtract(this.cd1.Y, this.center.Y); double num = Math.Atan(Convert.ToDouble(decimal.Divide(introduced8, decimal.Subtract(this.cd1.X, this.center.X)))) * 57.295779513082323; string str = " M" + (Convert.ToDouble(this.center.X) - num2).ToString() + "," + this.center.Y.ToString(); str = ((str + " A" + num2.ToString() + "," + num3.ToString()) + " 0 0 1 ") + (Convert.ToDouble(this.center.X) + num2).ToString() + "," + this.center.Y.ToString(); str = str + " M" + (Convert.ToDouble(this.center.X) + num2).ToString() + "," + this.center.Y.ToString(); str = (((str + " A" + num2.ToString() + "," + num3.ToString()) + " 0 0 1 ") + (Convert.ToDouble(this.center.X) - num2).ToString() + "," + this.center.Y.ToString()) + "Z"; context.newregion = true; return(str); }
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); }