コード例 #1
0
        public static Surface2D <T> Build(List <Vector3> Points, double meshSize)
        {
            var boundingBox = BoundingBoxBuilder.FromPtArray(Points.ToArray());
            var surface     = new Surface2D <T>(boundingBox, meshSize);

            return(surface);
        }
コード例 #2
0
        public void Drawing_CreateBoundingBox_0Points()
        {
            var doubles = new double[] { };
            var points  = VA.Drawing.Point.FromDoubles(doubles);
            var bb      = BoundingBoxBuilder.FromPoints(points);

            Assert.IsFalse(bb.HasValue);
        }
コード例 #3
0
        public static BoundingBox BuildBoundingBox(List <CylData> dataSetList)
        {
            var bblist = new List <BoundingBox>();

            foreach (CylData set in dataSetList)
            {
                bblist.Add(set.BoundingBox);
            }
            return(BoundingBoxBuilder.Union(bblist.ToArray()));
        }
コード例 #4
0
        public static VisioAutomation.Geometry.Rectangle GetBoundingBox(IEnumerable <ShapeXFormData> xfrms)
        {
            var bb = BoundingBoxBuilder.FromRectangles(xfrms.Select(x => x.GetRectangle()));

            if (!bb.HasValue)
            {
                throw new System.ArgumentException("Could not calculate bounding box");
            }
            return(bb.Value);
        }
コード例 #5
0
        private void getExtents()
        {
            List <Vector3> points = new List <Vector3>();

            foreach (SurfacePoint sp in this)
            {
                points.Add(sp.Position);
            }
            _boundingBox = BoundingBoxBuilder.FromPtArray(points.ToArray());
        }
コード例 #6
0
        void getBoundingBox()
        {
            var points = new List <Vector3>();

            foreach (Triangle tri in this)
            {
                points.AddRange(tri.Vertices);
            }
            boundingBox = BoundingBoxBuilder.FromPtArray(points.ToArray());
        }
コード例 #7
0
        public void Drawing_CreateBoundingBox_4Points()
        {
            var doubles = new[] { 0.0, 0.0, 1.0, -2.0 };
            var points  = VA.Drawing.Point.FromDoubles(doubles);
            var bb      = BoundingBoxBuilder.FromPoints(points);

            Assert.IsTrue(bb.HasValue);
            Assert.AreEqual(0, bb.Value.Left);
            Assert.AreEqual(0, bb.Value.Top);
            Assert.AreEqual(1, bb.Value.Right);
            Assert.AreEqual(-2, bb.Value.Bottom);
        }
コード例 #8
0
        public void BoundingBoxB_buildfromPts_returnsCorrectVals()
        {
            Vector3[] ptArray = new Vector3[3];
            ptArray[0] = new Vector3(-1, -2, -3);
            ptArray[1] = new Vector3(4, -4, 4);
            ptArray[2] = new Vector3(1, 2, 3);
            BoundingBox ext = BoundingBoxBuilder.FromPtArray(ptArray);

            Assert.AreEqual(4d, ext.Max.X);
            Assert.AreEqual(-4d, ext.Min.Y);
            Assert.AreEqual(4d, ext.Max.Z);
        }
コード例 #9
0
        public BoundingBox getBoundingBox(ToolPath5Axis inputPath)
        {
            var pointList = new List <Vector3>();

            foreach (PathEntity5Axis ent in inputPath)
            {
                pointList.Add(new Vector3(ent.Position.X, ent.Position.Y, ent.Position.Z));
            }

            BoundingBox ext = BoundingBoxBuilder.FromPtArray(pointList.ToArray());

            return(ext);
        }
コード例 #10
0
        double getMinDepth(ModelPathEntity mpe, double searchRadius)
        {
            List <AbmachPoint> jetIntersectList = surface.GetPointsInsideBox(BoundingBoxBuilder.GetSearchBox(mpe.PositionAsVector3, searchRadius));
            double             minDepth         = 1e16;

            foreach (AbmachPoint pt in jetIntersectList)
            {
                double depth = getPointDepth(pt);
                if (depth < minDepth)
                {
                    minDepth = depth;
                }
            }
            return(minDepth);
        }
コード例 #11
0
        public void BoundingBoxB_union_returnsCorrectVals()
        {
            Vector3[] ptArray = new Vector3[3];
            ptArray[0] = new Vector3(-1, -2, -3);
            ptArray[1] = new Vector3(4, -4, 4);
            ptArray[2] = new Vector3(1, 2, 3);
            Vector3[] ptArray2 = new Vector3[3];
            ptArray2[0] = new Vector3(4, 5, -3);
            ptArray2[1] = new Vector3(4, -4, 6);
            ptArray2[2] = new Vector3(-8, 2, 3);
            BoundingBox ext1 = BoundingBoxBuilder.FromPtArray(ptArray);
            BoundingBox ext2 = BoundingBoxBuilder.FromPtArray(ptArray2);
            BoundingBox ext  = BoundingBoxBuilder.Union(ext1, ext2);

            Assert.AreEqual(-8d, ext.Min.X);
            Assert.AreEqual(4d, ext.Max.X);
            Assert.AreEqual(5d, ext.Max.Y);
        }
コード例 #12
0
        public Drawing.Rectangle GetBoundingBoxOfTree()
        {
            if (this.Root.ChildCount < 1)
            {
                throw new System.InvalidOperationException("There are no Nodes in the tree");
            }
            var nodes = this.Nodes.ToList();

            var bb = BoundingBoxBuilder.FromRectangles(nodes.Select(n => n.Rect));

            if (!bb.HasValue)
            {
                throw new System.InvalidOperationException("Internal Error: Could not compute bounding box");
            }
            else
            {
                return(bb.Value);
            }
        }
コード例 #13
0
        double getAveDepth(ModelPathEntity mpe, double searchRadius)
        {
            double depth = 0;

            List <AbmachPoint> jetIntersectList = surface.GetPointsInsideBox(BoundingBoxBuilder.GetSearchBox(mpe.PositionAsVector3, searchRadius));
            int pointCount = 0;

            foreach (AbmachPoint pt in jetIntersectList)
            {
                if (pt.JetHit)
                {
                    depth += getPointDepth(pt);
                    pointCount++;
                }
            }

            depth = pointCount > 0 ? depth / pointCount : 0;

            return(depth);
        }
コード例 #14
0
        static public Octree <T> Build(List <Vector3> points, double minPointSpacing)
        {
            try
            {
                BoundingBox boundingBox = BoundingBoxBuilder.CubeFromPtArray(points);
                Octree <T>  octree      = new Octree <T>(boundingBox, minPointSpacing);
                // int index = 0;
                foreach (Vector3 pt in points)
                {
                    T octpt = new T();
                    //octpt.Index = index++;
                    octpt.Position = pt;
                    octree.Insert(octpt);
                }

                return(octree);
            }
            catch (Exception)
            {
                throw;
            }
        }
コード例 #15
0
        public void triangle_asPointGrid_gridOK()
        {
            var v0 = new Vector3(2, 1, 0);
            var v1 = new Vector3(4, 2, 0);
            var v2 = new Vector3(2, 4, 0);

            Triangle        tri          = new Triangle(v0, v1, v2);
            List <IVector3> points       = tri.AsPointGrid(.1);
            bool            areContained = false;

            foreach (IVector3 pt in points)
            {
                areContained = tri.Contains(pt);
                Assert.IsTrue(areContained);
            }
            IBoundingBox bb = BoundingBoxBuilder.FromPtArray(points.ToArray());

            Assert.AreEqual(4.0, bb.Max.X, .001);
            Assert.AreEqual(1.0, bb.Min.Y, .001);
            Assert.AreEqual(4.0, bb.Max.Y, .001);
            Assert.IsTrue(areContained);
        }
コード例 #16
0
        static public QuadTree <T> Build(List <Vector3> points, double minPointSpacing)
        {
            try
            {
                BoundingBox  boundingBox = BoundingBoxBuilder.CubeFromPtArray(points);
                QuadTree <T> tree        = new QuadTree <T>(boundingBox, minPointSpacing);
                foreach (Vector3 pt in points)
                {
                    T octpt = new T
                    {
                        Position = pt
                    };
                    tree.Insert(octpt);
                }

                return(tree);
            }
            catch (Exception)
            {
                throw;
            }
        }
コード例 #17
0
        public void Octree_getpointsInboxfromSearchBox_pointsOK()
        {
            List <Vector3> vectorList = new List <Vector3>();

            for (int i = 0; i <= 100; i++)
            {
                for (int j = 0; j <= 100; j++)
                {
                    vectorList.Add(new Vector3(i * .1, j * .1, 1.0));
                }
            }
            Octree <SurfacePoint> Octree = OctreeBuilder <SurfacePoint> .Build(vectorList, .1);

            Vector3             searchPoint  = new Vector3(5, 6, 3);
            Vector3             direction    = new Vector3(0, 0, 1);
            Ray                 ray          = new Ray(searchPoint, direction);
            double              searchRadius = Octree.MeshSize * 3;
            var                 searchBox    = BoundingBoxBuilder.GetSearchCylinder(Octree.BoundingBox, searchPoint, direction, searchRadius);
            List <SurfacePoint> points       = Octree.GetPointsInsideBox(searchBox);

            Assert.AreNotEqual(0, points.Count);
        }
コード例 #18
0
ファイル: XSection.cs プロジェクト: 1907931256/MasterProject
        BoundingBox getBoundingBox(List <DwgEntity> entities)
        {
            BoundingBox ext             = new BoundingBox();
            var         boundingBoxList = new List <BoundingBox>();

            foreach (DwgEntity entity in entities)
            {
                if (entity is Line)
                {
                    Line line = entity as Line;

                    boundingBoxList.Add(line.BoundingBox());
                }
                if (entity is Arc)
                {
                    Arc arc = entity as Arc;

                    boundingBoxList.Add(arc.BoundingBox());
                }
            }
            ext = BoundingBoxBuilder.Union(boundingBoxList.ToArray());
            return(ext);
        }
コード例 #19
0
        public void triangle_asPointGrid_countOK()
        {
            var v0 = new Vector3(5, 0, 0);
            var v1 = new Vector3(0, 5, 0);
            var v2 = new Vector3(5, 5, 0);

            Triangle       tri          = new Triangle(v0, v1, v2);
            List <Vector3> points       = tri.AsPointGrid(.1);
            bool           areContained = false;

            foreach (Vector3 pt in points)
            {
                areContained = tri.Contains(pt);
                Assert.IsTrue(areContained);
            }
            BoundingBox bb = BoundingBoxBuilder.FromPtArray(points.ToArray());

            Assert.AreEqual(1300, points.Count, 40);
            Assert.AreEqual(5.0, bb.Max.X, .001);
            Assert.AreEqual(0.0, bb.Min.Y, .001);
            Assert.AreEqual(5.0, bb.Max.Y, .001);
            Assert.IsTrue(areContained);
        }
コード例 #20
0
        static public Octree <T> Build(List <T> Points, double minPointSpacing)
        {
            try
            {
                List <Vector3> points = new List <Vector3>();
                foreach (T pt in Points)
                {
                    points.Add(pt.Position);
                }
                BoundingBox boundingBox = BoundingBoxBuilder.CubeFromPtArray(points);


                Octree <T> octree = new Octree <T>(boundingBox, minPointSpacing);

                octree.Insert(Points);

                return(octree);
            }
            catch (Exception)
            {
                throw;
            }
        }
コード例 #21
0
        private void getBoundingBox()
        {
            List <BoundingBox> extentList = new List <BoundingBox>();

            foreach (DwgEntity entity in entities)
            {
                if (entity is Line)
                {
                    Line line = entity as Line;
                    extentList.Add(line.BoundingBox());
                }
                if (entity is Arc)
                {
                    Arc arc = entity as Arc;
                    extentList.Add(arc.BoundingBox());
                }
                if (entity is Vector3)
                {
                    Vector3 pt = entity as Vector3;
                    extentList.Add(pt.BoundingBox());
                }
            }
            boundingBox = BoundingBoxBuilder.Union(extentList.ToArray());
        }
コード例 #22
0
        public IBoundingBox BoundingBox()
        {
            var bbList = new List <IBoundingBox>();

            foreach (DwgEntity entity in Entities)
            {
                if (entity is Line3)
                {
                    Line3 line = entity as Line3;
                    bbList.Add(line.BoundingBox());
                }
                if (entity is Arc)
                {
                    Arc arc = entity as Arc;
                    bbList.Add(arc.BoundingBox());
                }
                if (entity is Vector3)
                {
                    Vector3 pt = entity as Vector3;
                    bbList.Add(pt.BoundingBox());
                }
            }
            return(BoundingBoxBuilder.Union(bbList));
        }
コード例 #23
0
        //public List<T> GetKNearestPoints(Vector3 searchPoint, int searchQty)
        //{
        //    try
        //    {
        //        int resultCount = 0;
        //        var results = new List<T>();

        //        if (searchQty == 0)
        //        {
        //            return results;
        //        }

        //        double initSearchWidth = minSeparation * Math.Min(searchQty, 3);

        //        double searchSize = 1;
        //        double maxSearchDim = 2 * Math.Max((searchPoint - _boundingBox.Min).Length, (_boundingBox.Max - searchPoint).Length);
        //        Vector3 searchHalfDimension = new Vector3(initSearchWidth, initSearchWidth, initSearchWidth);
        //        // search and expand search box until point count is >= k
        //        do
        //        {
        //            var box = new BoundingBox(searchPoint - searchHalfDimension, searchPoint + searchHalfDimension);

        //            results = new List<T>();
        //            getPointsInBox(box, ref results);

        //            resultCount = results.Count;
        //            if (resultCount == 0)
        //            {
        //                searchSize *= 2;
        //            }
        //            else
        //            {
        //                searchSize *= ((double)searchQty / (double)resultCount);
        //            }

        //            searchHalfDimension = new Vector3(searchSize * initSearchWidth, searchSize * initSearchWidth, searchSize * initSearchWidth);
        //        } while (resultCount < searchQty && searchHalfDimension.Length < maxSearchDim);

        //        double[] distances = new double[resultCount];
        //        T[] resultArray = results.ToArray();

        //        // find closest k points to search point and add to output
        //        if (resultCount > searchQty)
        //        {
        //            for (int i = 0; i < resultCount; i++)
        //            {
        //                distances[i] = searchPoint.Distance2To(resultArray[i].Position);
        //            }
        //            Array.Sort(distances, resultArray);

        //            return resultArray.ToList();

        //        }
        //        else
        //        {
        //            return results;
        //        }
        //    }
        //    catch (Exception)
        //    {

        //        throw;
        //    }


        //}
        public IntersectionRecord GetIntersection(Ray ray)
        {
            try
            {
                var searchBox = BoundingBoxBuilder.GetSearchCylinder(_boundingBox, ray.Origin, ray.Direction, minSeparation * 3);

                List <T> points = GetPointsInsideBox(searchBox);
                Vector3  intPt  = new Vector3();

                double  denom  = (ray.Direction - ray.Origin).Length;
                Vector3 rayEnd = ray.Direction - ray.Origin;
                if (denom > 0 && points.Count == 1)
                {
                    return(new IntersectionRecord(points[0].Position, true));
                }
                if (denom > 0 && points.Count > 1)
                {
                    double[]  distArr = new double[points.Count];
                    Vector3[] ptArr   = new Vector3[points.Count];
                    int       i       = 0;
                    foreach (T pt in points)
                    {
                        distArr[i] = GeomUtilities.RayPointDistance(ray, pt.Position);
                        ptArr[i]   = pt.Position;
                        i++;
                    }
                    Array.Sort(distArr, ptArr);
                    return(new IntersectionRecord(ptArr[0], true));
                }
                return(new IntersectionRecord());
            }
            catch (Exception)
            {
                throw;
            }
        }
コード例 #24
0
        public void DrawPath(IEnumerable<PathOperation> ops, Pen pen = null, BaseBrush brush = null)
        {
            var bb = new BoundingBoxBuilder ();
            var s = new D2D1.PathGeometry (factories.D2DFactory);
            var figureDepth = 0;
            using (var sink = s.Open ()) {
                foreach (var op in ops) {
                    if (op is MoveTo) {
                        while (figureDepth > 0) {
                            sink.EndFigure (D2D1.FigureEnd.Open);
                            figureDepth--;
                        }
                        var mt = ((MoveTo)op);
                        sink.BeginFigure (Conversions.ToVector2 (mt.Start), D2D1.FigureBegin.Filled);
                        figureDepth++;
                        bb.Add (mt.Start);
                    }
                    else if (op is LineTo) {
                        var lt = ((LineTo)op);
                        sink.AddLine (lt.Start.ToVector2());
                        sink.AddLine (lt.End.ToVector2());
                        bb.Add (lt.Start);
                        bb.Add (lt.End);
                    }
                    else if (op is ArcTo) {
                        var ar = ((ArcTo)op);
                        // TODO: Direct2D Arcs
                        //sink.AddArc (new D2D1.ArcSegment {
                        //	Size = Conversions.ToSize2F (ar.Radius),
                        //	Point = Conversions.ToVector2 (ar.Point),
                        //	SweepDirection = ar.SweepClockwise ? D2D1.SweepDirection.Clockwise : D2D1.SweepDirection.CounterClockwise,
                        //});
                        sink.AddLine (Conversions.ToVector2 (ar.Point));
                        bb.Add (ar.Point);
                    }
                    else if (op is CurveTo) {
                        var ct = ((CurveTo)op);
                        sink.AddBezier (new D2D1.BezierSegment {
                            Point1 = Conversions.ToVector2 (ct.FirstControlPoint),
                            Point2 = Conversions.ToVector2 (ct.SecondControlPoint),
                            Point3 = Conversions.ToVector2 (ct.End),
                        });
            bb.Add(ct.FirstControlPoint);
            bb.Add(ct.SecondControlPoint);
            bb.Add(ct.End);
              }
                    else if (op is ClosePath) {
                        sink.EndFigure (D2D1.FigureEnd.Closed);
                        figureDepth--;
                    }
                    else {
                        // TODO: More path operations
                    }
                }
                while (figureDepth > 0) {
                    sink.EndFigure (D2D1.FigureEnd.Open);
                    figureDepth--;
                }
                sink.Close ();
            }

            var p = GetBrush (pen);
            var b = GetBrush (bb.BoundingBox, brush);

            if (b != null) {
                renderTarget.FillGeometry (s, b);
            }
            if (p != null) {
                renderTarget.DrawGeometry (s, p, (float)pen.Width, GetStrokeStyle (pen));
            }
        }
コード例 #25
0
        public void DrawPath(IEnumerable<PathOperation> ops, Pen pen = null, BaseBrush baseBrush = null)
        {
            if (pen == null && baseBrush == null)
                return;

            DrawElement (() => {

                var bb = new BoundingBoxBuilder ();

                var lines = new List<CGPoint>();

                foreach (var op in ops) {
                    var moveTo = op as MoveTo;
                    if (moveTo != null) {
                        var start = moveTo.Start;
                        var end = moveTo.End;
                        context.MoveTo ((nfloat)start.X, (nfloat)start.Y);
                        context.MoveTo ((nfloat)end.X, (nfloat)end.Y);
                        bb.Add (start);
                        bb.Add (end);
                        continue;
                    }
                    var lt = op as LineTo;
                    if (lt != null) {
                        var start = lt.Start;
                        var end = lt.End;

                        context.AddLineToPoint((float)start.X, (float)start.Y);
                        context.AddLineToPoint((float)end.X, (float)end.Y);

                        bb.Add (start);
                        bb.Add (end);
                        continue;
                    }
                    var at = op as ArcTo;
                    if (at != null) {
                        var p = at.Point;
                        var pp = Conversions.GetPoint (context.GetPathCurrentPoint ());
                        Point c1, c2;
                        at.GetCircles (pp, out c1, out c2);
                        context.AddLineToPoint ((nfloat)p.X, (nfloat)p.Y);
                        bb.Add (p);
                        continue;
                    }
                    var curveTo = op as CurveTo;
                    if (curveTo != null) {
                        var end = curveTo.End;
                        var control1 = curveTo.FirstControlPoint;
                        var control2 = curveTo.SecondControlPoint;

                        context.AddCurveToPoint ((nfloat)control1.X, (nfloat)control1.Y, (nfloat)control2.X, (nfloat)control2.Y, (nfloat)end.X, (nfloat)end.Y);

                        bb.Add (control1);
                        bb.Add (control2);
                        bb.Add (end);
                        continue;
                    }
                    var cp = op as ClosePath;

                    if (cp != null) {
                        context.ClosePath ();
                        continue;
                    }

                    throw new NotSupportedException ("Path Op " + op);
                }

                return bb.BoundingBox;

            }, pen, baseBrush);
        }
コード例 #26
0
        public void DrawPath(IEnumerable <PathOperation> ops, Pen pen = null, BaseBrush baseBrush = null)
        {
            using (var path = new GraphicsPath())
            {
                var bb = new BoundingBoxBuilder();

                var position = Point.Zero;

                foreach (var op in ops)
                {
                    var start = op as StartFigure;

                    if (start != null)
                    {
                        path.StartFigure();
                        continue;
                    }

                    var moveTo = op as MoveTo;
                    if (moveTo != null)
                    {
                        path.StartFigure();
                        continue;
                    }
                    var lineTo = op as LineTo;
                    if (lineTo != null)
                    {
                        var p = lineTo.Start;
                        path.AddLine(Conversions.GetPointF(lineTo.Start), Conversions.GetPointF(lineTo.End));
                        position = p;
                        bb.Add(p);
                        continue;
                    }
                    var arcTo = op as ArcTo;
                    if (arcTo != null)
                    {
                        var p = arcTo.Point;
                        path.AddLine(Conversions.GetPointF(position), Conversions.GetPointF(p));
                        position = p;
                        bb.Add(p);
                        continue;
                    }
                    var curveTo = op as CurveTo;
                    if (curveTo != null)
                    {
                        path.AddBezier(Conversions.GetPointF(curveTo.Start), Conversions.GetPointF(curveTo.FirstControlPoint),
                                       Conversions.GetPointF(curveTo.SecondControlPoint), Conversions.GetPointF(curveTo.End));
                        bb.Add(curveTo.Start);
                        bb.Add(curveTo.FirstControlPoint);
                        bb.Add(curveTo.SecondControlPoint);
                        bb.Add(curveTo.End);
                        continue;
                    }
                    var closePath = op as ClosePath;
                    if (closePath != null)
                    {
                        path.CloseFigure();
                        continue;
                    }

                    throw new NotSupportedException("Path Op " + op);
                }

                var frame = bb.BoundingBox;
                if (baseBrush != null)
                {
                    graphics.FillPath(baseBrush.GetBrush(frame), path);
                }
                if (pen != null)
                {
                    var r = Conversions.GetRectangleF(frame);
                    graphics.DrawPath(pen.GetPen(), path);
                }
            }
        }
コード例 #27
0
        public void DrawPath(IEnumerable <PathOperation> ops, Pen pen = null, BaseBrush brush = null)
        {
            using (var path = new Path())
            {
                var bb = new BoundingBoxBuilder();

                foreach (var op in ops)
                {
                    var moveTo = op as MoveTo;
                    if (moveTo != null)
                    {
                        var start = moveTo.Start;
                        var end   = moveTo.End;

                        path.MoveTo((float)start.X, (float)start.Y);

                        bb.Add(start);
                        bb.Add(end);
                        continue;
                    }
                    var lineTo = op as LineTo;
                    if (lineTo != null)
                    {
                        var start = lineTo.Start;
                        var end   = lineTo.End;
                        path.LineTo((float)start.X, (float)start.Y);
                        path.LineTo((float)end.X, (float)end.Y);
                        bb.Add(start);
                        bb.Add(end);
                        continue;
                    }
                    var at = op as ArcTo;
                    if (at != null)
                    {
                        var p = at.Point;
                        path.LineTo((float)p.X, (float)p.Y);
                        bb.Add(p);
                        continue;
                    }
                    var curveTo = op as CurveTo;
                    if (curveTo != null)
                    {
                        var end = curveTo.End;
                        var firstControlPoint  = curveTo.FirstControlPoint;
                        var secondControlPoint = curveTo.SecondControlPoint;

                        path.CubicTo((float)firstControlPoint.X, (float)firstControlPoint.Y, (float)secondControlPoint.X,
                                     (float)secondControlPoint.Y, (float)end.X, (float)end.Y);

                        bb.Add(firstControlPoint);
                        bb.Add(secondControlPoint);
                        bb.Add(end);
                        continue;
                    }
                    var cp = op as ClosePath;
                    if (cp != null)
                    {
                        path.Close();
                        continue;
                    }

                    throw new NotSupportedException("Path Op " + op);
                }

                var frame = bb.BoundingBox;

                if (brush != null)
                {
                    var solidBrush = brush as SolidBrush;

                    if (solidBrush != null)
                    {
                        path.SetFillType(GetPathFillType(((SolidBrush)brush).FillMode));
                    }

                    var brushPaint = GetBrushPaint(brush, frame);
                    graphics.DrawPath(path, brushPaint);
                }
                if (pen != null)
                {
                    var penPaint = GetPenPaint(pen);
                    graphics.DrawPath(path, penPaint);
                }
            }
        }
コード例 #28
0
        public void DrawPath(IEnumerable <PathOperation> ops, Pen pen = null, BaseBrush brush = null)
        {
            var bb          = new BoundingBoxBuilder();
            var s           = new D2D1.PathGeometry(factories.D2DFactory);
            var figureDepth = 0;

            using (var sink = s.Open()) {
                foreach (var op in ops)
                {
                    if (op is MoveTo)
                    {
                        while (figureDepth > 0)
                        {
                            sink.EndFigure(D2D1.FigureEnd.Open);
                            figureDepth--;
                        }
                        var mt = ((MoveTo)op);
                        sink.BeginFigure(Conversions.ToVector2(mt.Start), D2D1.FigureBegin.Filled);
                        figureDepth++;
                        bb.Add(mt.Start);
                    }
                    else if (op is LineTo)
                    {
                        var lt = ((LineTo)op);
                        sink.AddLine(lt.Start.ToVector2());
                        sink.AddLine(lt.End.ToVector2());
                        bb.Add(lt.Start);
                        bb.Add(lt.End);
                    }
                    else if (op is ArcTo)
                    {
                        var ar = ((ArcTo)op);
                        // TODO: Direct2D Arcs
                        //sink.AddArc (new D2D1.ArcSegment {
                        //	Size = Conversions.ToSize2F (ar.Radius),
                        //	Point = Conversions.ToVector2 (ar.Point),
                        //	SweepDirection = ar.SweepClockwise ? D2D1.SweepDirection.Clockwise : D2D1.SweepDirection.CounterClockwise,
                        //});
                        sink.AddLine(Conversions.ToVector2(ar.Point));
                        bb.Add(ar.Point);
                    }
                    else if (op is CurveTo)
                    {
                        var ct = ((CurveTo)op);
                        sink.AddBezier(new D2D1.BezierSegment {
                            Point1 = Conversions.ToVector2(ct.FirstControlPoint),
                            Point2 = Conversions.ToVector2(ct.SecondControlPoint),
                            Point3 = Conversions.ToVector2(ct.End),
                        });
                        bb.Add(ct.FirstControlPoint);
                        bb.Add(ct.SecondControlPoint);
                        bb.Add(ct.End);
                    }
                    else if (op is ClosePath)
                    {
                        sink.EndFigure(D2D1.FigureEnd.Closed);
                        figureDepth--;
                    }
                    else
                    {
                        // TODO: More path operations
                    }
                }
                while (figureDepth > 0)
                {
                    sink.EndFigure(D2D1.FigureEnd.Open);
                    figureDepth--;
                }
                sink.Close();
            }

            var p = GetBrush(pen);
            var b = GetBrush(bb.BoundingBox, brush);

            if (b != null)
            {
                renderTarget.FillGeometry(s, b);
            }
            if (p != null)
            {
                renderTarget.DrawGeometry(s, p, (float)pen.Width, GetStrokeStyle(pen));
            }
        }
コード例 #29
0
        public void Run(CancellationToken ct, IProgress <int> progress)
        {
            try
            {
                double searchRadius = jetRadius + surface.MeshSize;

                int           pcount    = path.Count * runInfo.Runs * runInfo.Iterations;
                int           count     = 0;
                List <string> pointlist = new List <string>();
                pointlist.Add("run,Nx,Ny,Nz,x,z,pointradius,jetfactor,incidentangle,slopefactor");

                double spFactor      = spacingFactor();
                double testJetRadius = jetRadius + surface.MeshSize;
                for (int iteration = 1; iteration <= runInfo.Iterations; iteration++)
                {
                    runInfo.CurrentIteration = iteration;


                    for (int run = 1; run <= runInfo.Runs; run++)
                    {
                        runInfo.CurrentRun = run;
                        int pathCount = 0;
                        foreach (ModelPathEntity mpe in path)
                        {
                            if (!ct.IsCancellationRequested)
                            {
                                double feedFactor = currentRemovalRate.DepthPerPass * spFactor * feedrateFactor(mpe.Feedrate.Value, currentRemovalRate);
                                pathCount++;
                                if (mpe.JetOn && feedFactor != 0)
                                {
                                    BoundingBox        searchBox        = BoundingBoxBuilder.GetSearchCylinder(surface.BoundingBox, mpe.PositionAsVector3, mpe.JetVector, searchRadius);
                                    List <AbmachPoint> jetIntersectList = surface.GetPointsInsideBox(searchBox);

                                    Octree <AbmachPoint> localSurface = OctreeBuilder <AbmachPoint> .Build(jetIntersectList, surface.MeshSize);// OctreeBuilder<AbmachPoint>.Build(jetIntersectList, searchBox, surface.MeshSize);

                                    var newPts = new List <AbmachPoint>();
                                    var mpeV   = new Vector3(mpe.Position.X, mpe.Position.Y, 0);
                                    var jetRay = new Ray(mpe.PositionAsVector3, mpe.JetVector);

                                    foreach (AbmachPoint jetPt in localSurface.GetAllPoints())
                                    {
                                        if (jetPt != null)
                                        {
                                            //var jetV = new Vector3(jetPt.Position.X, jetPt.Position.Y, 0);

                                            //double pointRadius = jetV.DistanceTo(mpeV);
                                            double pointRadius = GeomUtilities.RayPointDistance(jetRay, jetPt.Position);
                                            if (pointRadius <= testJetRadius)
                                            {
                                                double jFactor = jetFactor(pointRadius);
                                                if (jFactor > 0)
                                                {
                                                    Vector3 localNormal = new Vector3(0, 0, 1); // localSurface.GetNormalAt(jetPt.Position);
                                                    if (localNormal.Length == 0)
                                                    {
                                                        localNormal = new Vector3(mpe.JetVector);
                                                    }
                                                    double angle    = incidentAngle(mpe.JetVector, localNormal);
                                                    double slFactor = slopeFactor(angle);
                                                    //debug


                                                    if (jetPt.Position.X > 0.006 && jetPt.Position.X < .1 && jetPt.Position.Y > .072 && jetPt.Position.Y < .102)
                                                    {
                                                        pointlist.Add(run.ToString() + "," + jetPt.Position.X.ToString("f5") + "," + jetPt.Position.Y.ToString("f5") + "," + jetPt.Position.Z.ToString("f5") + "," + pointRadius.ToString("f5") + "," + jFactor.ToString("F5") + "," + angle.ToString("F5") + "," + slFactor.ToString("F5"));
                                                    }
                                                    //debug

                                                    Vector3 materialRemoved = (feedFactor * slFactor * jFactor) * mpe.JetVector;

                                                    Vector3 newPosition = jetPt.Position - materialRemoved;

                                                    jetPt.Position         = newPosition;
                                                    jetPt.Normal           = localNormal;
                                                    jetPt.OriginalPosition = jetPt.OriginalPosition;
                                                    jetPt.JetHit           = true;
                                                    newPts.Add(jetPt);
                                                }
                                            }
                                            else
                                            {
                                                newPts.Add(jetPt);
                                            }
                                        }    //end foreach jetPt
                                    }
                                    surface.Insert(newPts);
                                }//endif jeton
                            }
                            progress.Report(100 * ++count / pcount);
                        }//next path entity
                        if (runInfo.RunType == ModelRunType.NewMRR)
                        {
                            currentRemovalRate = newRemovalRate(path, runInfo, currentRemovalRate, depthInfo);
                        }
                    } //next run

                    if (runInfo.RunType == ModelRunType.NewFeedrates && runInfo.CurrentIteration < runInfo.Iterations)
                    {
                        path = newFeedrates(path, depthInfo);
                        resetSurface();
                    }
                }//next iteration
                FileIOLib.FileIO.Save(pointlist, "slopefactor.csv");
            }
            catch (Exception)
            {
                throw;
            }
        }
コード例 #30
0
 private void getBoundingBox()
 {
     boundingBox = BoundingBoxBuilder.FromPtArray(new Vector3[] { Vert0, Vert1, Vert2 });
 }
コード例 #31
0
ファイル: ApplePlatform.cs プロジェクト: pdbeckwith/NGraphics
        public void DrawPath(IEnumerable <PathOperation> ops, Pen pen = null, BaseBrush baseBrush = null)
        {
            if (pen == null && baseBrush == null)
            {
                return;
            }

            DrawElement(() => {
                var bb = new BoundingBoxBuilder();

                var lines = new List <CGPoint>();

                foreach (var op in ops)
                {
                    var moveTo = op as MoveTo;
                    if (moveTo != null)
                    {
                        var start = moveTo.Start;
                        var end   = moveTo.End;
                        context.MoveTo((nfloat)start.X, (nfloat)start.Y);
                        context.MoveTo((nfloat)end.X, (nfloat)end.Y);
                        bb.Add(start);
                        bb.Add(end);
                        continue;
                    }
                    var lt = op as LineTo;
                    if (lt != null)
                    {
                        var start = lt.Start;
                        var end   = lt.End;

                        context.AddLineToPoint((float)start.X, (float)start.Y);
                        context.AddLineToPoint((float)end.X, (float)end.Y);

                        bb.Add(start);
                        bb.Add(end);
                        continue;
                    }
                    var at = op as ArcTo;
                    if (at != null)
                    {
                        var p  = at.Point;
                        var pp = Conversions.GetPoint(context.GetPathCurrentPoint());
                        Point c1, c2;
                        at.GetCircles(pp, out c1, out c2);
                        context.AddLineToPoint((nfloat)p.X, (nfloat)p.Y);
                        bb.Add(p);
                        continue;
                    }
                    var curveTo = op as CurveTo;
                    if (curveTo != null)
                    {
                        var end      = curveTo.End;
                        var control1 = curveTo.FirstControlPoint;
                        var control2 = curveTo.SecondControlPoint;

                        context.AddCurveToPoint((nfloat)control1.X, (nfloat)control1.Y, (nfloat)control2.X, (nfloat)control2.Y, (nfloat)end.X, (nfloat)end.Y);

                        bb.Add(control1);
                        bb.Add(control2);
                        bb.Add(end);
                        continue;
                    }
                    var cp = op as ClosePath;

                    if (cp != null)
                    {
                        context.ClosePath();
                        continue;
                    }

                    throw new NotSupportedException("Path Op " + op);
                }


                return(bb.BoundingBox);
            }, pen, baseBrush);
        }
コード例 #32
0
        public void DrawPath(IEnumerable<PathOperation> ops, Pen pen = null, BaseBrush brush = null)
        {
            using (var path = new Path())
              {
            var bb = new BoundingBoxBuilder();

            foreach (var op in ops)
            {
              var moveTo = op as MoveTo;
              if (moveTo != null)
              {
            var start = moveTo.Start;
            var end = moveTo.End;

            path.MoveTo((float) start.X, (float) start.Y);

            bb.Add(start);
            bb.Add(end);
            continue;
              }
              var lineTo = op as LineTo;
              if (lineTo != null)
              {
            var start = lineTo.Start;
            var end = lineTo.End;
            path.LineTo((float) start.X, (float) start.Y);
            path.LineTo((float) end.X, (float) end.Y);
            bb.Add(start);
            bb.Add(end);
            continue;
              }
              var at = op as ArcTo;
              if (at != null)
              {
            var p = at.Point;
            path.LineTo((float) p.X, (float) p.Y);
            bb.Add(p);
            continue;
              }
              var curveTo = op as CurveTo;
              if (curveTo != null)
              {
            var end = curveTo.End;
            var firstControlPoint = curveTo.FirstControlPoint;
            var secondControlPoint = curveTo.SecondControlPoint;

            path.CubicTo((float) firstControlPoint.X, (float) firstControlPoint.Y, (float) secondControlPoint.X,
              (float) secondControlPoint.Y, (float) end.X, (float) end.Y);

            bb.Add(firstControlPoint);
            bb.Add(secondControlPoint);
            bb.Add(end);
            continue;
              }
              var cp = op as ClosePath;
              if (cp != null)
              {
            path.Close();
            continue;
              }

              throw new NotSupportedException("Path Op " + op);
            }

            var frame = bb.BoundingBox;

            if (brush != null)
            {
              var solidBrush = brush as SolidBrush;

              if (solidBrush != null)
              {
            path.SetFillType(GetPathFillType(((SolidBrush)brush).FillMode));
              }

              var brushPaint = GetBrushPaint(brush, frame);
              graphics.DrawPath(path, brushPaint);
            }
            if (pen != null)
            {
              var penPaint = GetPenPaint(pen);
              graphics.DrawPath(path, penPaint);
            }
              }
        }
コード例 #33
0
ファイル: GeoJSONHandler.cs プロジェクト: zhnc/npgsql
        async ValueTask <GeoJSONObject> ReadGeometryCore(NpgsqlReadBuffer buf, bool async, BoundingBoxBuilder boundingBox)
        {
            await buf.Ensure(SizeOfHeader, async);

            var littleEndian = buf.ReadByte() > 0;
            var type         = (EwkbGeometryType)buf.ReadUInt32(littleEndian);

            GeoJSONObject geometry;
            NamedCRS      crs = null;

            if (HasSrid(type))
            {
                await buf.Ensure(4, async);

                crs = GetCrs(buf.ReadInt32(littleEndian));
            }

            switch (type & EwkbGeometryType.BaseType)
            {
            case EwkbGeometryType.Point:
            {
                await buf.Ensure(SizeOfPoint(type), async);

                var position = ReadPosition(buf, type, littleEndian);
                boundingBox?.Accumulate(position);
                geometry = new Point(position);
                break;
            }

            case EwkbGeometryType.LineString:
            {
                await buf.Ensure(SizeOfLength, async);

                var coordinates = new Position[buf.ReadInt32(littleEndian)];
                for (var i = 0; i < coordinates.Length; ++i)
                {
                    await buf.Ensure(SizeOfPoint(type), async);

                    var position = ReadPosition(buf, type, littleEndian);
                    boundingBox?.Accumulate(position);
                    coordinates[i] = position;
                }
                geometry = new LineString(coordinates);
                break;
            }

            case EwkbGeometryType.Polygon:
            {
                await buf.Ensure(SizeOfLength, async);

                var lines = new LineString[buf.ReadInt32(littleEndian)];
                for (var i = 0; i < lines.Length; ++i)
                {
                    var coordinates = new Position[buf.ReadInt32(littleEndian)];
                    for (var j = 0; j < coordinates.Length; ++j)
                    {
                        await buf.Ensure(SizeOfPoint(type), async);

                        var position = ReadPosition(buf, type, littleEndian);
                        boundingBox?.Accumulate(position);
                        coordinates[j] = position;
                    }
                    lines[i] = new LineString(coordinates);
                }
                geometry = new Polygon(lines);
                break;
            }

            case EwkbGeometryType.MultiPoint:
            {
                await buf.Ensure(SizeOfLength, async);

                var points = new Point[buf.ReadInt32(littleEndian)];
                for (var i = 0; i < points.Length; ++i)
                {
                    await buf.Ensure(SizeOfHeader + SizeOfPoint(type), async);

                    await buf.Skip(SizeOfHeader, async);

                    var position = ReadPosition(buf, type, littleEndian);
                    boundingBox?.Accumulate(position);
                    points[i] = new Point(position);
                }
                geometry = new MultiPoint(points);
                break;
            }

            case EwkbGeometryType.MultiLineString:
            {
                await buf.Ensure(SizeOfLength, async);

                var lines = new LineString[buf.ReadInt32(littleEndian)];
                for (var i = 0; i < lines.Length; ++i)
                {
                    await buf.Ensure(SizeOfHeaderWithLength, async);

                    await buf.Skip(SizeOfHeader, async);

                    var coordinates = new Position[buf.ReadInt32(littleEndian)];
                    for (var j = 0; j < coordinates.Length; ++j)
                    {
                        await buf.Ensure(SizeOfPoint(type), async);

                        var position = ReadPosition(buf, type, littleEndian);
                        boundingBox?.Accumulate(position);
                        coordinates[j] = position;
                    }
                    lines[i] = new LineString(coordinates);
                }
                geometry = new MultiLineString(lines);
                break;
            }

            case EwkbGeometryType.MultiPolygon:
            {
                await buf.Ensure(SizeOfLength, async);

                var polygons = new Polygon[buf.ReadInt32(littleEndian)];
                for (var i = 0; i < polygons.Length; ++i)
                {
                    await buf.Ensure(SizeOfHeaderWithLength, async);

                    await buf.Skip(SizeOfHeader, async);

                    var lines = new LineString[buf.ReadInt32(littleEndian)];
                    for (var j = 0; j < lines.Length; ++j)
                    {
                        var coordinates = new Position[buf.ReadInt32(littleEndian)];
                        for (var k = 0; k < coordinates.Length; ++k)
                        {
                            await buf.Ensure(SizeOfPoint(type), async);

                            var position = ReadPosition(buf, type, littleEndian);
                            boundingBox?.Accumulate(position);
                            coordinates[k] = position;
                        }
                        lines[j] = new LineString(coordinates);
                    }
                    polygons[i] = new Polygon(lines);
                }
                geometry = new MultiPolygon(polygons);
                break;
            }

            case EwkbGeometryType.GeometryCollection:
            {
                await buf.Ensure(SizeOfLength, async);

                var elements = new IGeometryObject[buf.ReadInt32(littleEndian)];
                for (var i = 0; i < elements.Length; ++i)
                {
                    elements[i] = (IGeometryObject) await ReadGeometryCore(buf, async, boundingBox);
                }
                geometry = new GeometryCollection(elements);
                break;
            }

            default:
                throw new NpgsqlSafeReadException(UnknownPostGisType());
            }

            geometry.CRS = crs;
            return(geometry);
        }