Пример #1
0
        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);
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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 }
            });
        }
Пример #6
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();
            }
        }
Пример #7
0
        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);
        }
Пример #8
0
 public PointDbl(CGM.Scanner.Point p)
 {
     this   = new PointDbl();
     this.X = Convert.ToDouble(p.X);
     this.Y = Convert.ToDouble(p.Y);
 }
Пример #9
0
 public PointDbl(double X, double Y)
 {
     this   = new PointDbl();
     this.X = X;
     this.Y = Y;
 }