Пример #1
0
        public MarkGeometryCubicBezier(MarkGeometryPoint startPointIn, MarkGeometryPoint endPointIn, MarkGeometryPoint controlPoint_1In, MarkGeometryPoint controlPoint_2In)
            : base()
        {
            StartPoint     = startPointIn;
            EndPoint       = endPointIn;
            ControlPoint_1 = controlPoint_1In;
            ControlPoint_2 = controlPoint_2In;

            Update();
        }
Пример #2
0
        public MarkGeometryRectangle(MarkGeometryPoint centrePoint, double width, double height)
            : base()
        {
            CentrePoint = centrePoint;
            Width       = width;
            Height      = height;

            GenerateView();
            Update();
        }
Пример #3
0
        public MarkGeometryArc(MarkGeometryPoint center, double radius, double endAngle)
            : base()
        {
            Radius      = radius;
            StartAngle  = 0;
            EndAngle    = endAngle;
            CentrePoint = center;

            Update();
        }
Пример #4
0
        public MarkGeometryEllipse(Ellipse ellipse)
            : base()
        {
            CentrePoint = new MarkGeometryPoint(ellipse.Center);
            StartAngle  = ellipse.StartAngle;
            EndAngle    = ellipse.EndAngle;
            MinorAxis   = ellipse.MajorAxis; // AKA the y-axis
            MajorAxis   = ellipse.MinorAxis; // AKA. the x-axis

            Update();
        }
Пример #5
0
        public MarkGeometriesWrapper()
        {
            Points  = new List <MarkGeometryPoint>();
            Lines   = new List <MarkGeometryLine>();
            Arcs    = new List <MarkGeometryArc>();
            Circles = new List <MarkGeometryCircle>();
            Paths   = new List <MarkGeometryPath>();
            Origin  = new MarkGeometryPoint();

            Update();
        }
Пример #6
0
        /// <summary>
        ///     The copy constructor for this class.
        /// </summary>
        /// <param name="input"></param>
        internal MarkGeometryPoint(MarkGeometryPoint input)
            : base(input)
        {
            // force copy

            X = input.X + 0.0;
            Y = input.Y + 0.0;
            Z = input.Z + 0.0;

            Update();
        }
Пример #7
0
        /// <summary>
        /// Create and arc from three points.
        /// </summary>
        /// <param name="centre">The centre of the arc.</param>
        /// <param name="p1">The starting point</param>
        /// <param name="p2">The end point</param>
        public MarkGeometryArc(MarkGeometryPoint centre, MarkGeometryPoint p1, MarkGeometryPoint p2)
        {
            Radius      = GeometricArithmeticModule.ABSMeasure(centre, p1);
            StartAngle  = GeometricArithmeticModule.CalculateAngle(centre, p1);
            EndAngle    = GeometricArithmeticModule.CalculateAngle(centre, p2);
            CentrePoint = centre;

            StartPoint = p1;
            EndPoint   = p2;

            Update();
        }
Пример #8
0
        public MarkGeometryArc(MarkGeometryPoint center, double radius, double startAngle, double endAngle)
            : base()
        {
            Radius      = radius;
            StartAngle  = startAngle;
            EndAngle    = endAngle;
            CentrePoint = center;

            StartPoint = new MarkGeometryPoint();
            EndPoint   = new MarkGeometryPoint();

            Update();
        }
Пример #9
0
        public MarkGeometryArc()
            : base()
        {
            Radius      = 0;
            StartAngle  = 0;
            EndAngle    = 0;
            CentrePoint = new MarkGeometryPoint();

            StartPoint = new MarkGeometryPoint();
            EndPoint   = new MarkGeometryPoint();

            Update();
        }
Пример #10
0
        public void GenerateView()
        {
            double halfWidth  = Width / 2.0;
            double halfHeight = Height / 2.0;

            TopLeftPoint     = new MarkGeometryPoint(CentrePoint.X - halfWidth, CentrePoint.Y + halfHeight);
            TopRightPoint    = new MarkGeometryPoint(CentrePoint.X + halfWidth, CentrePoint.Y + halfHeight);
            BottomLeftPoint  = new MarkGeometryPoint(CentrePoint.X - halfWidth, CentrePoint.Y - halfHeight);
            BottomRightPoint = new MarkGeometryPoint(CentrePoint.X + halfWidth, CentrePoint.Y - halfHeight);

            IsClosed = true;
            Points   = new List <MarkGeometryPoint>()
            {
                TopLeftPoint, TopRightPoint, BottomRightPoint, BottomLeftPoint, (MarkGeometryPoint)TopLeftPoint.Clone()
            };
        }
Пример #11
0
        /// <summary>
        /// Add point to the end of the path
        /// </summary>
        /// <param name="point"></param>
        /// <param name="deferUpdate"></param>
        public void Append(MarkGeometryPoint point, bool deferUpdate = false)
        {
            if (
                Points.Count > 0 &&
                GeometricArithmeticModule.Compare(EndPoint, point, ClosureTolerance) == 0
                )
            {
                return; // ignore existing points
            }
            Points.Add(point);

            if (!deferUpdate)
            {
                Update();
            }
        }
Пример #12
0
        public MarkGeometryPath(params MarkGeometryLine[] lines)
            : base()
        {
            if (lines != null && lines.Length > 0)
            {
                Points.Add(lines[0].StartPoint);
                for (int i = 0; i < lines.Length; i++)
                {
                    Points.Add(lines[i].EndPoint);
                }
            }

            // TODO : Calculate centroid
            CentrePoint = new MarkGeometryPoint();
            Update();
        }
Пример #13
0
        public override void ReadXml(XmlReader reader)
        {
            reader.Read();// Skip ahead to next node
            base.ReadXml(reader);

            StartPoint = new MarkGeometryPoint();
            StartPoint.ReadXml(reader);

            EndPoint = new MarkGeometryPoint();
            EndPoint.ReadXml(reader);

            ReferencePoint = new MarkGeometryPoint();
            ReferencePoint.ReadXml(reader);

            Update();
        }
Пример #14
0
        //public MarkGeometryPath(LwPolyline lwPolyline)
        //    : base()
        //{
        //    foreach (var entity in lwPolyline.Explode())
        //    {
        //        if (entity is Line lineEntity)
        //        {
        //            Points.Add(new MarkGeometryPoint(lineEntity.StartPoint));
        //            Points.Add(new MarkGeometryPoint(lineEntity.EndPoint));
        //        }
        //        else if (entity is Arc arcEntity)
        //        {
        //            arcEntity.PolygonalVertexes
        //        }
        //    }
        //    Points.AddRange(
        //        lwPolyline.Vertexes.ConvertAll(v => new MarkGeometryPoint(v))
        //    );

        //    if (
        //        lwPolyline.IsClosed &&
        //        GeometricArithmeticModule.Compare(StartPoint, EndPoint, ClosureTolerance) != 0)
        //    {
        //        Points.Add((MarkGeometryPoint)StartPoint.Clone());
        //    }

        //    // TODO : Calculate centroid
        //    CentrePoint = new MarkGeometryPoint();
        //    Update();
        //}

        public MarkGeometryPath(Polyline polyline)
            : base()
        {
            Points.AddRange(
                polyline.Vertexes.Select(v => new MarkGeometryPoint(v.Position))
                );

            if (
                polyline.IsClosed &&
                GeometricArithmeticModule.Compare(StartPoint, EndPoint, ClosureTolerance) != 0)
            {
                Points.Add((MarkGeometryPoint)StartPoint.Clone());
            }

            // TODO : Calculate centroid
            CentrePoint = new MarkGeometryPoint();
            Update();
        }
Пример #15
0
        public MarkGeometryRectangle(MarkGeometryPoint pointA, MarkGeometryPoint pointB)
            : base()
        {
            MarkGeometryRectangle rect = new MarkGeometryLine(pointA, pointB).Extents.Boundary;

            Points.AddRange(rect.Points);
            CentrePoint = rect.CentrePoint;
            Width       = rect.Width;
            Height      = rect.Height;
            IsClosed    = true;

            double halfWidth  = Width / 2.0;
            double halfHeight = Height / 2.0;

            TopLeftPoint     = new MarkGeometryPoint(CentrePoint.X - halfWidth, CentrePoint.Y + halfHeight);
            TopRightPoint    = new MarkGeometryPoint(CentrePoint.X + halfWidth, CentrePoint.Y + halfHeight);
            BottomLeftPoint  = new MarkGeometryPoint(CentrePoint.X - halfWidth, CentrePoint.Y - halfHeight);
            BottomRightPoint = new MarkGeometryPoint(CentrePoint.X + halfWidth, CentrePoint.Y - halfHeight);

            Update();
        }
Пример #16
0
        /// <summary>
        /// Adapted from CSharp's netdxf library.
        /// </summary>
        /// <param name="position">A double representing a position on the spline</param>
        /// <returns>A point at the specified location on the Spline</returns>
        public MarkGeometryPoint C(double position)
        {
            double denominatorSum = 0.0;
            var    _point         = new MarkGeometryPoint();

            for (int i = 0; i < ControlPoints.Count; i++)
            {
                // optional use n * controlPoint's weight - in this case it's 1.0
                double n = N(i, Degree, position);
                denominatorSum += n;
                _point         += n * ControlPoints[i];
            }

            // avoid possible divided by zero error, this should never happen
            if (Math.Abs(denominatorSum) < double.Epsilon)
            {
                return(new MarkGeometryPoint());
            }

            return((1.0 / denominatorSum) * _point);
        }
Пример #17
0
        public override void ReadXml(XmlReader reader)
        {
            reader.Read();// Skip ahead to next node
            ReadXmlBaseImpl(reader);

            reader.ReadStartElement();
            Width = double.Parse(reader.ReadElementString(nameof(Width)));
            reader.Read();

            Height = double.Parse(reader.ReadElementString(nameof(Height)));
            Points = new List <MarkGeometryPoint>();

            CentrePoint = new MarkGeometryPoint();
            CentrePoint.ReadXml(reader);

            reader.Read();
            reader.ReadEndElement();

            GenerateView();
            Update();
        }
Пример #18
0
        /// <summary>
        /// see: http://www.lee-mac.com/bulgeconversion.html
        /// The curvature of a Polyline Arc segment is defined using a quantity known as bulge.
        /// This unit measures the deviation of the curve from the straight line (chord) joining the two vertices of the segment.
        /// It is defined as the ratio of the arc sagitta (versine) to half the length of
        /// the chord between the two vertices; this ratio is equal to the tangent of a
        /// quarter of the included arc angle between the two polyline vertices.
        /// </summary>
        /// <param name="startPoint"></param>
        /// <param name="endPoint"></param>
        /// <param name="bulge"></param>
        public MarkGeometryArc(MarkGeometryPoint startPoint, MarkGeometryPoint endPoint, double bulge)
        {
            var d  = GeometricArithmeticModule.ABSMeasure(startPoint, endPoint) / 2d;
            var r  = (d * ((Math.Pow(bulge, 2)) + 1)) / (2 * bulge);
            var th = GeometricArithmeticModule.CalculateAngle(startPoint, endPoint) + Math.Acos(d / r);

            Radius      = Math.Abs(r);
            CentrePoint = MarkGeometryPoint.FromPolar(startPoint, th, r);

            if (bulge < 0)
            {
                StartAngle = GeometricArithmeticModule.CalculateAngle(CentrePoint, endPoint);
                EndAngle   = GeometricArithmeticModule.CalculateAngle(CentrePoint, startPoint);
            }
            else
            {
                StartAngle = GeometricArithmeticModule.CalculateAngle(CentrePoint, startPoint);
                EndAngle   = GeometricArithmeticModule.CalculateAngle(CentrePoint, endPoint);
            }

            Update();
        }
Пример #19
0
        public override void ReadXml(XmlReader reader)
        {
            reader.Read(); // Skip ahead to next node
            base.ReadXml(reader);

            IsClosed = bool.Parse(reader.GetAttribute(nameof(IsClosed)));

            CentrePoint = new MarkGeometryPoint();
            CentrePoint.ReadXml(reader);

            Points = new List <MarkGeometryPoint>();

            if (reader.MoveToContent() == XmlNodeType.Element && reader.LocalName == nameof(Points))
            {
                while (reader.MoveToContent() == XmlNodeType.Element)
                {
                    var point = new MarkGeometryPoint();
                    point.ReadXml(reader);
                    Points.Add(point);
                }
            }

            Update();
        }
Пример #20
0
        public override void SetExtents()
        {
            Extents.MinX = double.MaxValue;
            Extents.MaxX = double.MinValue;

            Extents.MinY = double.MaxValue;
            Extents.MaxY = double.MinValue;

            Extents.MinZ = double.MaxValue;
            Extents.MaxZ = double.MinValue;

            int[] ns =
            {
                Points.Count(),
                Arcs.Count(),
                Circles.Count(),
                Lines.Count(),
                Paths.Count()
            };

            int n = GeometricArithmeticModule.Max <int>(ns);

            for (int i = 0; i < n; i++)
            {
                if (i < Points.Count())
                {
                    Extents.MaxX = Math.Max(Extents.MaxX, Points[i].Extents.MaxX);
                    Extents.MaxY = Math.Max(Extents.MaxY, Points[i].Extents.MaxY);
                    Extents.MaxZ = Math.Max(Extents.MaxZ, Points[i].Extents.MaxZ);

                    Extents.MinX = Math.Min(Extents.MinX, Points[i].Extents.MinX);
                    Extents.MinY = Math.Min(Extents.MinY, Points[i].Extents.MinY);
                    Extents.MinZ = Math.Min(Extents.MinZ, Points[i].Extents.MinZ);
                }

                if (i < Arcs.Count())
                {
                    Extents.MaxX = Math.Max(Extents.MaxX, Arcs[i].Extents.MaxX);
                    Extents.MaxY = Math.Max(Extents.MaxY, Arcs[i].Extents.MaxY);
                    Extents.MaxZ = Math.Max(Extents.MaxZ, Arcs[i].Extents.MaxZ);

                    Extents.MinX = Math.Min(Extents.MinX, Arcs[i].Extents.MinX);
                    Extents.MinY = Math.Min(Extents.MinY, Arcs[i].Extents.MinY);
                    Extents.MinZ = Math.Min(Extents.MinZ, Arcs[i].Extents.MinZ);
                }

                if (i < Circles.Count())
                {
                    Extents.MaxX = Math.Max(Extents.MaxX, Circles[i].Extents.MaxX);
                    Extents.MaxY = Math.Max(Extents.MaxY, Circles[i].Extents.MaxY);
                    Extents.MaxZ = Math.Max(Extents.MaxZ, Circles[i].Extents.MaxZ);

                    Extents.MinX = Math.Min(Extents.MinX, Circles[i].Extents.MinX);
                    Extents.MinY = Math.Min(Extents.MinY, Circles[i].Extents.MinY);
                    Extents.MinZ = Math.Min(Extents.MinZ, Circles[i].Extents.MinZ);
                }

                if (i < Lines.Count())
                {
                    Extents.MaxX = Math.Max(Extents.MaxX, Lines[i].Extents.MaxX);
                    Extents.MaxY = Math.Max(Extents.MaxY, Lines[i].Extents.MaxY);
                    Extents.MaxZ = Math.Max(Extents.MaxZ, Lines[i].Extents.MaxZ);

                    Extents.MinX = Math.Min(Extents.MinX, Lines[i].Extents.MinX);
                    Extents.MinY = Math.Min(Extents.MinY, Lines[i].Extents.MinY);
                    Extents.MinZ = Math.Min(Extents.MinZ, Lines[i].Extents.MinZ);
                }

                if (i < Paths.Count())
                {
                    Extents.MaxX = Math.Max(Extents.MaxX, Paths[i].Extents.MaxX);
                    Extents.MaxY = Math.Max(Extents.MaxY, Paths[i].Extents.MaxY);
                    Extents.MaxZ = Math.Max(Extents.MaxZ, Paths[i].Extents.MaxZ);

                    Extents.MinX = Math.Min(Extents.MinX, Paths[i].Extents.MinX);
                    Extents.MinY = Math.Min(Extents.MinY, Paths[i].Extents.MinY);
                    Extents.MinZ = Math.Min(Extents.MinZ, Paths[i].Extents.MinZ);
                }
            }

            GridWidth  = Extents.MaxX - Extents.MinX;
            GridHeight = Extents.MaxY - Extents.MinY;
            GridDepth  = Extents.MaxZ - Extents.MinZ;

            Origin = new MarkGeometryPoint(
                Extents.MinX + (0.5 * GridWidth),
                Extents.MinY + (0.5 * GridHeight),
                Extents.MinZ + (0.5 * GridDepth)
                );
        }
Пример #21
0
        public MarkGeometryQuadraticBezier(MarkGeometryPoint startPointIn, MarkGeometryPoint endPointIn, MarkGeometryPoint controlPointIn)
            : base()
        {
            StartPoint   = startPointIn;
            EndPoint     = endPointIn;
            ControlPoint = controlPointIn;

            Update();
        }
Пример #22
0
 public void Add(MarkGeometryPoint points)
 {
     Points.Add(points);
     Update();
 }