public static TriangleInfoList ConvertStringToTriangles(string text, FontStyle fontStyle, float glyphFontSize = 10f)
        {
            FontFamily fontFamily = FontFamily.GenericSansSerif;

            var triangles = new TriangleInfoList();

            try {
                var textAsPolygons = GeneratePolygonsFromGlyph(fontFamily, fontStyle, text, glyphFontSize, false);
                var polygonSet     = CreateSetFromList(textAsPolygons);
                P2T.Triangulate(polygonSet);

                foreach (var polygon in polygonSet.Polygons)
                {
                    foreach (var polyTriangle in polygon.Triangles)
                    {
                        var triangle      = new Triangle();
                        var triangleIndex = 0;
                        foreach (var trianglePoint in polyTriangle.Points)
                        {
                            triangle.Vectors [triangleIndex].Position.X = (float)trianglePoint.X;
                            triangle.Vectors [triangleIndex].Position.Y = (float)trianglePoint.Y;

                            triangleIndex++;
                        }

                        triangles[0].Add(triangle);
                    }
                }
            } catch (Exception exc) {
                Debug.WriteLine(exc);
            }

            return(triangles);
        }
Example #2
0
        private void Rotate(float angleY, float angleZ, TriangleInfoList triangles)
        {
            Matrix4 rotationMatrix = Matrix4.CreateRotationY(OpenTK.MathHelper.DegreesToRadians(angleY));

            for (var arrayIndex = 0; arrayIndex < triangles.Count; arrayIndex++)
            {
                for (var triangleIndex = 0; triangleIndex < triangles[arrayIndex].Count; triangleIndex++)
                {
                    for (var vectorIndex = 0; vectorIndex < 3; vectorIndex++)
                    {
                        var rotatedVector = Vector3Class.Transform(triangles[arrayIndex][triangleIndex].Vectors[vectorIndex].Position, rotationMatrix);
                        triangles[arrayIndex][triangleIndex].Vectors[vectorIndex].Position = rotatedVector;
                    }
                }
            }

            rotationMatrix = Matrix4.CreateRotationZ(OpenTK.MathHelper.DegreesToRadians(angleZ));

            for (var arrayIndex = 0; arrayIndex < triangles.Count; arrayIndex++)
            {
                for (var triangleIndex = 0; triangleIndex < triangles[arrayIndex].Count; triangleIndex++)
                {
                    for (var vectorIndex = 0; vectorIndex < 3; vectorIndex++)
                    {
                        var rotatedVector = Vector3Class.Transform(triangles[arrayIndex][triangleIndex].Vectors[vectorIndex].Position, rotationMatrix);
                        triangles[arrayIndex][triangleIndex].Vectors[vectorIndex].Position = rotatedVector;
                    }
                }
            }
        }
Example #3
0
 internal MeshOverhangSliceInfo()
 {
     this.OuterPathContourSegmentVectors      = new List <List <IntPoint> >();
     this.OuterPathIntersectionPlaneTriangles = new TriangleInfoList();
     this.InnerIntersectedSplitTrianges       = new List <MeshOverhangTriangleIntersection>();
     this.InnerIntersectedTriangesOrg         = new List <MeshOverhangTriangleIntersection>();
 }
        public static TriangleInfoList ConvertStringToTrianglesWithOuterPath(string text, FontStyle fontStyle, Polygon outerPath, out PolygonSet textAsPolygonSet, float glyphFontSize = 50f)
        {
            FontFamily fontFamily = FontFamily.GenericSansSerif;

            textAsPolygonSet = new PolygonSet();

            var triangles = new TriangleInfoList();

            try
            {
                var textAsPolygons = GeneratePolygonsFromGlyph(fontFamily, fontStyle, text, glyphFontSize, true);
                textAsPolygonSet = CreateSetFromList(textAsPolygons);
                var polygonSetWithOuterPath = new PolygonSet();
                foreach (var t in textAsPolygonSet.Polygons)
                {
                    foreach (var hole in t.Holes)
                    {
                        polygonSetWithOuterPath.Add(hole);
                    }
                    //t.Holes.Clear();
                    outerPath.Holes.Add(t);
                }
                polygonSetWithOuterPath.Add(outerPath);


                P2T.Triangulate(polygonSetWithOuterPath);

                foreach (var polygon in polygonSetWithOuterPath.Polygons)
                {
                    foreach (var polyTriangle in polygon.Triangles)
                    {
                        var triangle      = new Triangle();
                        var triangleIndex = 0;
                        foreach (var trianglePoint in polyTriangle.Points)
                        {
                            triangle.Vectors[triangleIndex].Position.X = (float)trianglePoint.X;
                            triangle.Vectors[triangleIndex].Position.Y = (float)trianglePoint.Y;

                            triangleIndex++;
                        }

                        triangles[0].Add(triangle);
                    }
                }
            }
            catch (Exception exc)
            {
                Debug.WriteLine(exc);
            }

            return(triangles);
        }
        internal Vector3Class CalcAvgNormal(TriangleInfoList triangles)
        {
            var avgNormal = new Vector3Class();

            foreach (var triangleConnection in this.Keys)
            {
                avgNormal += triangles[triangleConnection.ArrayIndex][triangleConnection.TriangleIndex].Normal;
            }

            avgNormal /= this.Count;

            return(avgNormal);
        }
Example #6
0
        internal STLModel3D AsSTLModel3D(System.Drawing.Color modelColor)
        {
            var triangle  = new Triangle();
            var triangles = new TriangleInfoList();

            for (var vertexIndex = 0; vertexIndex < this.VertexArray.Length; vertexIndex += 3)
            {
                var currentVertexIndex = vertexIndex % 3;
                triangle = new Triangle();
                triangle.Vectors[currentVertexIndex].Position     = new Vector3Class(this.VertexArray[vertexIndex].Position) + new Vector3Class(0, 0, 1);
                triangle.Vectors[currentVertexIndex + 1].Position = new Vector3Class(this.VertexArray[vertexIndex + 1].Position) + new Vector3Class(0, 0, 1);
                triangle.Vectors[currentVertexIndex + 2].Position = new Vector3Class(this.VertexArray[vertexIndex + 2].Position) + new Vector3Class(0, 0, 1);
                triangle.CalcMinMaxZ();

                triangles[0].Add(triangle);
            }

            var stlModel = new STLModel3D(STLModel3D.TypeObject.Model, ObjectView.BindingSupported);

            stlModel.Open(null, false, modelColor, ObjectView.NextObjectIndex, triangles, false, false);
            return(stlModel);
        }
Example #7
0
        public void CalcOuterSupportPoints(STLModel3D stlModel)
        {
            if (this.SupportPoints == null)
            {
                this.SupportPoints = new List <Vector3>();
            }

            this.SupportPoints.Clear();

            if (this.OutlineDistanceFactor > 0)
            {
                var currentDistance  = 0f;
                var previousDistance = 0f;

                if (this.DebugPoints == null)
                {
                    this.DebugPoints = new List <Vector3>();
                }
                this.DebugPoints.Clear();

                for (var correctedContourPartIndex = 0; correctedContourPartIndex < this.OuterPoints.Count; correctedContourPartIndex++)
                {
                    var contourLine             = this.OuterPoints[correctedContourPartIndex];
                    var intersectionPointsBelow = new TriangleInfoList();

                    var contourLineVector = (contourLine.SecondPoint - contourLine.FirstPoint);
                    var contourLineLength = contourLineVector.Length;
                    currentDistance += contourLineLength;

                    var startOffsetDistance = this.OutlineDistanceFactor - previousDistance;

                    while (currentDistance >= this.OutlineDistanceFactor)
                    {
                        var startOffsetVectorPercentage = (startOffsetDistance / contourLineLength);
                        var startOffsetVector           = startOffsetVectorPercentage * contourLineVector;
                        this.SupportPoints.Add(contourLine.FirstPoint + startOffsetVector);

                        currentDistance     -= this.OutlineDistanceFactor;
                        startOffsetDistance += this.OutlineDistanceFactor;
                    }

                    previousDistance = currentDistance;
                }

                //outside inner points
                for (var innerPointIndex = 0; innerPointIndex < this.InnerPoints.Count; innerPointIndex++)
                {
                    currentDistance  = 0f;
                    previousDistance = 0f;

                    for (var correctedContourPartIndex = 0; correctedContourPartIndex < this.InnerPoints[innerPointIndex].Count; correctedContourPartIndex++)
                    {
                        var contourLineStart        = this.InnerPoints[innerPointIndex][correctedContourPartIndex];
                        var intersectionPointsBelow = new TriangleInfoList();

                        Vector3 contourLineEnd = new Vector3();
                        if (correctedContourPartIndex == this.InnerPoints[innerPointIndex].Count - 1)
                        {
                            contourLineEnd = this.InnerPoints[innerPointIndex][0];
                        }
                        else
                        {
                            contourLineEnd = this.InnerPoints[innerPointIndex][correctedContourPartIndex + 1];
                        }
                        var contourLineVector = (contourLineEnd - contourLineStart);
                        var contourLineLength = contourLineVector.Length;
                        currentDistance += contourLineLength;

                        var startOffsetDistance = this.OutlineDistanceFactor - previousDistance;

                        while (currentDistance >= this.OutlineDistanceFactor)
                        {
                            var startOffsetVectorPercentage = (startOffsetDistance / contourLineLength);
                            var startOffsetVector           = startOffsetVectorPercentage * contourLineVector;
                            this.SupportPoints.Add(contourLineStart + startOffsetVector);

                            currentDistance     -= this.OutlineDistanceFactor;
                            startOffsetDistance += this.OutlineDistanceFactor;
                        }

                        previousDistance = currentDistance;
                    }
                }
            }
        }
Example #8
0
        internal static void CreateXYZAxis()
        {
            _xTriangles = new TriangleInfoList();
            _yTriangles = new TriangleInfoList();
            _zTriangles = new TriangleInfoList();

            var xAxis = new XYZAxisCone(60, 15f, 1.5f, 1.5f, 0f, 0f, 26, new Vector3(), Color.Red, 0, 0, null, false);

            xAxis.RotateByAxis(0, 90, 0, RotationEventArgs.TypeAxis.Y);
            _xTriangles[0].AddRange(xAxis.Triangles[0]);
            var yAxis = new XYZAxisCone(60, 15f, 1.5f, 1.5f, 0f, 0f, 26, new Vector3(), Color.Green, 0, 0, null, false);

            yAxis.RotateByAxis(-90, 0, 0, RotationEventArgs.TypeAxis.X);
            _yTriangles[0].AddRange(yAxis.Triangles[0]);
            var zAxis = new XYZAxisCone(60, 15f, 1.5f, 1.5f, 0f, 0f, 26, new Vector3(), Color.Blue, 0, 0, null, false);

            _zTriangles[0].AddRange(zAxis.Triangles[0]);

            if (DAL.OS.OSProvider.IsWindows)
            {
                //xLabel
                _xLabel = new OrientationGizmoFaceText();
                var xLabelOffset = new Vector3(60, -7.5f, 0);
                _xLabel.Triangles = Engines.FontTessellationEngine.ConvertStringToTriangles("X", FontStyle.Regular, 15f);
                var xLabelClone = (STLModel3D)_xLabel.Clone();
                foreach (var triangle in xLabelClone.Triangles[0])
                {
                    triangle.Flip();
                    _xLabel.Triangles[0].Add(triangle);
                }
                foreach (var triangle in _xLabel.Triangles[0])
                {
                    triangle.Vectors[0].Position += xLabelOffset;
                    triangle.Vectors[1].Position += xLabelOffset;
                    triangle.Vectors[2].Position += xLabelOffset;
                }

                //yLabel
                _yLabel           = new OrientationGizmoFaceText();
                _yLabel.Triangles = Engines.FontTessellationEngine.ConvertStringToTriangles("Y", FontStyle.Regular, 15f);
                _yLabel.RotateText(0, 0, 180, RotationEventArgs.TypeAxis.Z);
                _yLabel.UpdateBoundries();
                _yLabel.UpdateDefaultCenter(true);
                //_yLabel._rotationAngleX = 0;
                var yLabelClone = (STLModel3D)_yLabel.Clone();
                foreach (var triangle in yLabelClone.Triangles[0])
                {
                    triangle.Flip();
                    _yLabel.Triangles[0].Add(triangle);
                }

                //zLabel
                _zLabel           = new OrientationGizmoFaceText();
                _zLabel.Triangles = Engines.FontTessellationEngine.ConvertStringToTriangles("Z", FontStyle.Regular, 15f);
                _zLabel.RotateText(180, 0, 0, RotationEventArgs.TypeAxis.X);
                _zLabel.UpdateBoundries();
                _zLabel.UpdateDefaultCenter(true);
                _zLabel._rotationAngleX = 0;
                var zLabelClone = (STLModel3D)_zLabel.Clone();
                foreach (var triangle in zLabelClone.Triangles[0])
                {
                    triangle.Flip();
                    _zLabel.Triangles[0].Add(triangle);
                }
            }
        }
Example #9
0
        internal static List <MeshOverhangTriangleIntersection> FindTrianglesOnSliceLine(List <Triangle> mesh, MeshOverhangSliceInfo overhangSlice)
        {
            if (overhangSlice.OuterPathSourcePoint == new Vector3(-17.0105343f, -14.94091f, 0.332000017f))
            {
            }

            //create intersection plate to determine intersecting triangles
            var intersectionPlanes = new TriangleInfoList();

            intersectionPlanes.Add(new List <Triangle>());

            var firstPlaneTriangle = new Triangle();

            firstPlaneTriangle.Vectors[0].Position = overhangSlice.OuterPathSourcePoint;
            firstPlaneTriangle.Vectors[1].Position = new Vector3(overhangSlice.OuterPathSourcePoint.X, overhangSlice.OuterPathSourcePoint.Y, overhangSlice.OuterPathIntersectionPoint.Z);
            firstPlaneTriangle.Vectors[2].Position = overhangSlice.OuterPathIntersectionPoint + (overhangSlice.OuterPathSourcePointEdgeNormal * 10);
            firstPlaneTriangle.CalcNormal();
            firstPlaneTriangle.CalcMinMaxX();
            firstPlaneTriangle.CalcMinMaxY();
            firstPlaneTriangle.CalcMinMaxZ();

            intersectionPlanes[0].Add(firstPlaneTriangle);

            var secondPlaneTriangle = new Triangle();

            secondPlaneTriangle = new Triangle();
            secondPlaneTriangle.Vectors[0].Position = new Vector3(overhangSlice.OuterPathSourcePoint.X, overhangSlice.OuterPathSourcePoint.Y, overhangSlice.OuterPathIntersectionPoint.Z);
            secondPlaneTriangle.Vectors[1].Position = overhangSlice.OuterPathSourcePoint;
            secondPlaneTriangle.Vectors[2].Position = overhangSlice.OuterPathIntersectionPoint + (overhangSlice.OuterPathSourcePointEdgeNormal * 10);
            secondPlaneTriangle.CalcNormal();
            secondPlaneTriangle.CalcMinMaxX();
            secondPlaneTriangle.CalcMinMaxY();
            secondPlaneTriangle.CalcMinMaxZ();

            intersectionPlanes[0].Add(secondPlaneTriangle);

            //result.AddRange(intersectionTriangles);
            var intersectedTriangles = new List <MeshOverhangTriangleIntersection>();


            //find all triangles that intersect with intersection plate

            foreach (var triangle in mesh)
            {
                var intersectionWithPlane = new MeshOverhangTriangleIntersection();



                var triangleIntersectionsCount = 0;
                for (var vectorIndex = 0; vectorIndex < 3; vectorIndex++)
                {
                    var lineStartPoint = triangle.Vectors[vectorIndex].Position;
                    var lineEndPoint   = triangle.Vectors[0].Position;

                    if (vectorIndex < 2)
                    {
                        lineEndPoint = triangle.Vectors[vectorIndex + 1].Position;
                    }

                    if (lineStartPoint == new Vector3(-12.507534f, -9.86491f, 5.96000051f) || lineEndPoint == new Vector3(-12.507534f, -9.86491f, 5.96000051f))
                    {
                    }


                    if (lineStartPoint == overhangSlice.OuterPathSourcePoint)
                    {
                        intersectionWithPlane.Vectors = triangle.Vectors;
                        if (intersectionWithPlane.IntersectionPoint1Properties.IntersectionPoint == Vector3.Zero)
                        {
                            intersectionWithPlane.IntersectionPoint1Properties.IntersectionPoint          = lineStartPoint;
                            intersectionWithPlane.IntersectionPoint1Properties.IntersectionPointLineStart = lineStartPoint;
                            intersectionWithPlane.IntersectionPoint1Properties.IntersectionPointLineEnd   = lineEndPoint;
                        }
                        else if (intersectionWithPlane.IntersectionPoint2Properties.IntersectionPoint == Vector3.Zero && intersectionWithPlane.IntersectionPoint1Properties.IntersectionPoint != lineStartPoint)
                        {
                            intersectionWithPlane.IntersectionPoint2Properties.IntersectionPoint          = lineStartPoint;
                            intersectionWithPlane.IntersectionPoint2Properties.IntersectionPointLineStart = lineStartPoint;
                            intersectionWithPlane.IntersectionPoint2Properties.IntersectionPointLineEnd   = lineEndPoint;
                        }
                        triangleIntersectionsCount++;
                    }
                    else if (lineStartPoint == overhangSlice.OuterPathIntersectionPoint)
                    {
                        intersectionWithPlane.Vectors = triangle.Vectors;
                        if (intersectionWithPlane.IntersectionPoint1Properties.IntersectionPoint == Vector3.Zero)
                        {
                            intersectionWithPlane.IntersectionPoint1Properties.IntersectionPoint          = lineStartPoint;
                            intersectionWithPlane.IntersectionPoint1Properties.IntersectionPointLineStart = lineStartPoint;
                            intersectionWithPlane.IntersectionPoint1Properties.IntersectionPointLineEnd   = lineEndPoint;
                        }
                        else if (intersectionWithPlane.IntersectionPoint2Properties.IntersectionPoint == Vector3.Zero && intersectionWithPlane.IntersectionPoint1Properties.IntersectionPoint != lineStartPoint)
                        {
                            intersectionWithPlane.IntersectionPoint2Properties.IntersectionPoint          = lineStartPoint;
                            intersectionWithPlane.IntersectionPoint2Properties.IntersectionPointLineStart = lineStartPoint;
                            intersectionWithPlane.IntersectionPoint2Properties.IntersectionPointLineEnd   = lineEndPoint;
                        }

                        triangleIntersectionsCount++;
                    }
                    else
                    {
                        var intersectionPoints = Utils.IntersectionProvider.IntersectTriangles(lineStartPoint, lineEndPoint - lineStartPoint, intersectionPlanes, Utils.IntersectionProvider.typeDirection.OneWay);
                        if (intersectionPoints.Count > 0)
                        {
                            foreach (var intersectionPoint in intersectionPoints)
                            {
                                var validIntersectionPoint = false;
                                if (lineEndPoint.Z >= lineStartPoint.Z && intersectionPoint.Z >= lineStartPoint.Z && intersectionPoint.Z <= lineEndPoint.Z)
                                {
                                    validIntersectionPoint = true;
                                }
                                else if (lineEndPoint.Z <= lineStartPoint.Z && intersectionPoint.Z <= lineStartPoint.Z && intersectionPoint.Z >= lineEndPoint.Z)
                                {
                                    validIntersectionPoint = true;
                                }

                                if (validIntersectionPoint && intersectionPoint != Vector3.Zero)
                                {
                                    var currentLineLength            = (lineEndPoint - lineStartPoint).Length;
                                    var intersectionPointStartLength = (intersectionPoint - lineStartPoint).Length;
                                    var intersectionPointEndLength   = (intersectionPoint - lineEndPoint).Length;

                                    if (currentLineLength >= intersectionPointStartLength && currentLineLength >= intersectionPointEndLength)
                                    {
                                        intersectionWithPlane.Vectors = triangle.Vectors;
                                        if (intersectionWithPlane.IntersectionPoint1Properties.IntersectionPoint == Vector3.Zero)
                                        {
                                            intersectionWithPlane.IntersectionPoint1Properties.IntersectionPoint          = intersectionPoint;
                                            intersectionWithPlane.IntersectionPoint1Properties.IntersectionPointLineStart = lineStartPoint;
                                            intersectionWithPlane.IntersectionPoint1Properties.IntersectionPointLineEnd   = lineEndPoint;
                                        }
                                        else if (intersectionWithPlane.IntersectionPoint2Properties.IntersectionPoint == Vector3.Zero && intersectionWithPlane.IntersectionPoint1Properties.IntersectionPoint != intersectionPoint)
                                        {
                                            intersectionWithPlane.IntersectionPoint2Properties.IntersectionPoint          = intersectionPoint;
                                            intersectionWithPlane.IntersectionPoint2Properties.IntersectionPointLineStart = lineStartPoint;
                                            intersectionWithPlane.IntersectionPoint2Properties.IntersectionPointLineEnd   = lineEndPoint;
                                        }
                                        else
                                        {
                                            //override intersectionpoint2 if previous points are sub same
                                            var intersectionPoint1 = new Vector3((int)(intersectionWithPlane.IntersectionPoint1Properties.IntersectionPoint.X * 1000), (int)(intersectionWithPlane.IntersectionPoint1Properties.IntersectionPoint.Y * 1000), (int)(intersectionWithPlane.IntersectionPoint1Properties.IntersectionPoint.Z * 1000));
                                            var intersectionPoint2 = new Vector3((int)(intersectionWithPlane.IntersectionPoint2Properties.IntersectionPoint.X * 1000), (int)(intersectionWithPlane.IntersectionPoint2Properties.IntersectionPoint.Y * 1000), (int)(intersectionWithPlane.IntersectionPoint2Properties.IntersectionPoint.Z * 1000));

                                            if (intersectionPoint1 == intersectionPoint2)
                                            {
                                                intersectionWithPlane.IntersectionPoint2Properties.IntersectionPoint          = intersectionPoint;
                                                intersectionWithPlane.IntersectionPoint2Properties.IntersectionPointLineStart = lineStartPoint;
                                                intersectionWithPlane.IntersectionPoint2Properties.IntersectionPointLineEnd   = lineEndPoint;
                                            }
                                        }

                                        triangleIntersectionsCount++;
                                        //break;
                                    }
                                }
                            }
                        }
                    }
                }

                //only save the triangles which contains 2 intersectionpoints
                if (triangleIntersectionsCount >= 2 && intersectionWithPlane.IntersectionPoint2Properties.IntersectionPoint != Vector3.Zero && intersectionWithPlane.IntersectionPoint1Properties.IntersectionPoint != Vector3.Zero)
                {
                    intersectedTriangles.Add(intersectionWithPlane);
                    overhangSlice.InnerIntersectedTriangesOrg.Add(intersectionWithPlane);
                }
            }



            //clean up intersected triangle which have same intersection points
            for (var intersectedTriangleIndex = intersectedTriangles.Count - 1; intersectedTriangleIndex >= 0; intersectedTriangleIndex--)
            {
                var intersectedTriangle = intersectedTriangles[intersectedTriangleIndex];
                var intersectedTrianglePoint1Simplified = new Vector3((int)(intersectedTriangle.IntersectionPoint1Properties.IntersectionPoint.X * 10000), (int)(intersectedTriangle.IntersectionPoint1Properties.IntersectionPoint.Y * 10000), (int)(intersectedTriangle.IntersectionPoint1Properties.IntersectionPoint.Z * 10000));
                var intersectedTrianglePoint2Simplified = new Vector3((int)(intersectedTriangle.IntersectionPoint2Properties.IntersectionPoint.X * 10000), (int)(intersectedTriangle.IntersectionPoint2Properties.IntersectionPoint.Y * 10000), (int)(intersectedTriangle.IntersectionPoint2Properties.IntersectionPoint.Z * 10000));
                if (intersectedTrianglePoint1Simplified == intersectedTrianglePoint2Simplified)
                {
                    if ((intersectedTriangle.IntersectionPoint1Properties.IntersectionPoint == overhangSlice.OuterPathSourcePoint || intersectedTriangle.IntersectionPoint2Properties.IntersectionPoint == overhangSlice.OuterPathSourcePoint))
                    {
                    }
                    else
                    {
                        intersectedTriangles.RemoveAt(intersectedTriangleIndex);
                    }
                }
                else if (intersectedTriangle.IntersectionPoint1Properties.IntersectionPoint.Z <= overhangSlice.OuterPathSourcePoint.Z && intersectedTriangle.IntersectionPoint2Properties.IntersectionPoint.Z <= overhangSlice.OuterPathSourcePoint.Z)
                {
                    intersectedTriangles.RemoveAt(intersectedTriangleIndex);
                }
            }

            //sort triangles by connected points (down -> up)
            var currentPoint               = overhangSlice.OuterPathSourcePoint;
            var connectedTriangles         = new List <MeshOverhangTriangleIntersection>();
            var sortedIntersectedTriangles = new List <MeshOverhangTriangleIntersection>();


            //find edges that are connected to lowest point
            var connectedIntersectionPointFound = true;

            for (var intersectedTriangleIndex = intersectedTriangles.Count - 1; intersectedTriangleIndex >= 0; intersectedTriangleIndex--)
            {
                var intersectedTriangle = intersectedTriangles[intersectedTriangleIndex];
                if (intersectedTriangle.Points[0] == currentPoint ||
                    intersectedTriangle.Points[1] == currentPoint ||
                    intersectedTriangle.Points[2] == currentPoint)
                {
                    if (intersectedTriangle.IntersectionPoint1Properties.IntersectionPoint != overhangSlice.OuterPathSourcePoint &&
                        intersectedTriangle.IntersectionPoint2Properties.IntersectionPoint != overhangSlice.OuterPathIntersectionPoint)
                    {
                        if (intersectedTriangle.IntersectionPoint1Properties.IntersectionPoint.Z < intersectedTriangle.IntersectionPoint2Properties.IntersectionPoint.Z)
                        {
                            intersectedTriangle.IntersectionPoint1Properties.IntersectionPoint = overhangSlice.OuterPathSourcePoint;
                        }
                        else if (intersectedTriangle.IntersectionPoint1Properties.IntersectionPoint.Z > intersectedTriangle.IntersectionPoint2Properties.IntersectionPoint.Z)
                        {
                            intersectedTriangle.IntersectionPoint2Properties.IntersectionPoint = overhangSlice.OuterPathSourcePoint;
                        }
                    }

                    intersectedTriangles.RemoveAt(intersectedTriangleIndex);
                    sortedIntersectedTriangles.Add(intersectedTriangle);

                    connectedTriangles.Add(intersectedTriangle);
                }
            }


            //when multiple found find the one that is ONLY connected to the outerpath
            if (sortedIntersectedTriangles.Count > 1)
            {
                var currentSourcePointDistance         = 0f;
                var longestDistanceIntersectedTriangle = sortedIntersectedTriangles[0];

                foreach (var sortedIntersectedTriangle in sortedIntersectedTriangles)
                {
                    if (sortedIntersectedTriangle.IntersectionPoint1Properties.IntersectionPoint == overhangSlice.OuterPathSourcePoint)
                    {
                        var newSourcePointDistance = (sortedIntersectedTriangle.IntersectionPoint2Properties.IntersectionPoint - overhangSlice.OuterPathSourcePoint).Length;
                        if (newSourcePointDistance > currentSourcePointDistance)
                        {
                            currentSourcePointDistance         = newSourcePointDistance;
                            longestDistanceIntersectedTriangle = sortedIntersectedTriangle;
                        }
                    }
                    if (sortedIntersectedTriangle.IntersectionPoint2Properties.IntersectionPoint == overhangSlice.OuterPathSourcePoint)
                    {
                        var newSourcePointDistance = (sortedIntersectedTriangle.IntersectionPoint1Properties.IntersectionPoint - overhangSlice.OuterPathSourcePoint).Length;

                        if (newSourcePointDistance > currentSourcePointDistance)
                        {
                            currentSourcePointDistance         = newSourcePointDistance;
                            longestDistanceIntersectedTriangle = sortedIntersectedTriangle;
                        }
                    }
                }

                sortedIntersectedTriangles.Clear();
                sortedIntersectedTriangles.Add(longestDistanceIntersectedTriangle);
            }

            while (connectedIntersectionPointFound && intersectedTriangles.Count > 0)
            {
                //find intersectedTriangles which contains 2 connected points
                connectedIntersectionPointFound = false;
                var newConnectedTriangles = new List <MeshOverhangTriangleIntersection>();
                for (var intersectedTriangleIndex = intersectedTriangles.Count - 1; intersectedTriangleIndex >= 0; intersectedTriangleIndex--)
                {
                    var intersectedTriangle = intersectedTriangles[intersectedTriangleIndex];
                    foreach (var previousIntersectedTriangle in connectedTriangles)
                    {
                        var connectedPointsCount = 0;

                        foreach (var previousVectorPoint in previousIntersectedTriangle.Points)
                        {
                            foreach (var vectorPoint in intersectedTriangle.Points)
                            {
                                if (vectorPoint == previousVectorPoint)
                                {
                                    connectedPointsCount++;
                                    break;
                                }
                            }
                        }

                        if (connectedPointsCount == 2)
                        {
                            intersectedTriangles.RemoveAt(intersectedTriangleIndex);
                            sortedIntersectedTriangles.Add(intersectedTriangle);
                            newConnectedTriangles.Add(intersectedTriangle);
                            break;
                        }
                    }
                }

                if (newConnectedTriangles.Count > 0)
                {
                    connectedIntersectionPointFound = true;
                    connectedTriangles = newConnectedTriangles;
                }
            }

            //remove triangles which contain same intersections
            for (var intersectedTriangleIndex = sortedIntersectedTriangles.Count - 1; intersectedTriangleIndex >= 0; intersectedTriangleIndex--)
            {
                var intersectedTriangle = sortedIntersectedTriangles[intersectedTriangleIndex];
                var intersectedTrianglePoint1Simplified = new Vector3((int)(intersectedTriangle.IntersectionPoint1Properties.IntersectionPoint.X * 1000), (int)(intersectedTriangle.IntersectionPoint1Properties.IntersectionPoint.Y * 1000), (int)(intersectedTriangle.IntersectionPoint1Properties.IntersectionPoint.Z * 1000));
                var intersectedTrianglePoint2Simplified = new Vector3((int)(intersectedTriangle.IntersectionPoint2Properties.IntersectionPoint.X * 1000), (int)(intersectedTriangle.IntersectionPoint2Properties.IntersectionPoint.Y * 1000), (int)(intersectedTriangle.IntersectionPoint2Properties.IntersectionPoint.Z * 1000));
                if (intersectedTrianglePoint1Simplified == intersectedTrianglePoint2Simplified)
                {
                    sortedIntersectedTriangles.RemoveAt(intersectedTriangleIndex);
                }
            }

            overhangSlice.InnerIntersectedTrianges = sortedIntersectedTriangles;

            return(sortedIntersectedTriangles);
        }
Example #10
0
        public static TriangleInfoList InsersectTriangleByCenterPoint(Vector3Class center, Vector3Class centerNormal, object model3d)
        {
            var intersectedTriangles = new TriangleInfoList();

            if (model3d is TriangleInfoList)
            {
                var triangles = (TriangleInfoList)model3d;
                for (var triangleIndex = 0; triangleIndex < triangles.Count; triangleIndex++)
                {
                    foreach (var triangle in triangles[triangleIndex])
                    {
                        var p1 = new Vector3Class(triangle.Vectors[0].Position.X, triangle.Vectors[0].Position.Y, 0);
                        var p2 = new Vector3Class(triangle.Vectors[1].Position.X, triangle.Vectors[1].Position.Y, 0);
                        var p3 = new Vector3Class(triangle.Vectors[2].Position.X, triangle.Vectors[2].Position.Y, 0);

                        var movedTriangle = new TriangleIntersection();
                        movedTriangle.Vectors[0].Position = p1;
                        movedTriangle.Vectors[1].Position = p2;
                        movedTriangle.Vectors[2].Position = p3;

                        if (PointInsideTriangle(new Vector3Class(center.X, center.Y, 0), movedTriangle))
                        {
                            movedTriangle.Vectors[0].Position.Z = triangle.Vectors[0].Position.Z;
                            movedTriangle.Vectors[1].Position.Z = triangle.Vectors[1].Position.Z;
                            movedTriangle.Vectors[2].Position.Z = triangle.Vectors[2].Position.Z;
                            movedTriangle.CalcCenter();
                            movedTriangle.CalcNormal();
                            movedTriangle.Flip();

                            //if (!directionUP) { movedTriangle.Flip(); }

                            var   edge1        = movedTriangle.Vectors[1].Position - movedTriangle.Vectors[0].Position;
                            var   edge2        = movedTriangle.Vectors[2].Position - movedTriangle.Vectors[0].Position;
                            var   originNormal = Vector3Class.Cross(centerNormal, edge2);
                            float det          = Vector3Class.Dot(edge1, originNormal); //determined of matrix
                            if (det == 0)
                            {
                                break;
                            }
                            float invDet = 1 / det; //invert matrix
                            var   s      = center - movedTriangle.Vectors[0].Position;

                            var u = Vector3Class.Dot(s, originNormal) * invDet; //barycentric coordinates
                            if (u < 0 || u > 1)
                            {
                                break;
                            }
                            var qvec = Vector3Class.Cross(s, edge1);
                            var v    = Vector3Class.Dot(centerNormal, qvec) * invDet; //barycentric coordinates
                            if (v < 0 || u + v > 1)
                            {
                                break;
                            }
                            var t = Vector3Class.Dot(edge2, qvec) * invDet; //distince of intersection point

                            movedTriangle.IntersectionPoint.Z = t;

                            intersectedTriangles[0].Add(movedTriangle);
                        }
                    }
                }
            }

            return(intersectedTriangles);
        }
Example #11
0
        public static List <Vector3Class> IntersectTriangles(Vector3Class origin, Vector3Class direction, TriangleInfoList triangles, typeDirection directionType)
        {
            var intersectionPoints = new List <Vector3Class>();

            for (var arrayIndex = 0; arrayIndex < triangles.Count; arrayIndex++)
            {
                for (var triangleIndex = 0; triangleIndex < triangles[arrayIndex].Count; triangleIndex++)
                {
                    var triangle = triangles[arrayIndex][triangleIndex];

                    if (triangle.Center != origin)
                    {
                        if (direction.Z == 1 || direction.Z == -1)
                        {
                            if (!((triangle.Left <= origin.X && triangle.Right >= origin.X) && (triangle.Back <= origin.Y && triangle.Front >= origin.Y)))
                            {
                                continue;
                            }
                        }

                        //do translation off vector
                        var p1 = triangle.Vectors[0].Position;
                        var p2 = triangle.Vectors[1].Position;
                        var p3 = triangle.Vectors[2].Position;

                        float nDotD = Vector3Class.Dot(triangle.Normal, direction);
                        if (nDotD != 0)
                        {
                            //    if (nDotD < 0)nDotD = 0 - nDotD;

                            float        d = Vector3Class.Dot(triangle.Normal, p1);
                            float        t = -(Vector3Class.Dot(triangle.Normal, origin) + d) / nDotD;
                            Vector3Class planeIntersection = new Vector3Class();
                            if (nDotD < 0)
                            {
                                t = -(Vector3Class.Dot(-triangle.Normal, origin) + d) / -nDotD;
                                planeIntersection = origin + (direction * t);
                            }
                            else if (directionType == typeDirection.TwoWay)
                            {
                                planeIntersection = origin + (direction * t);
                            }

                            for (var i = 0; i < 2; i++)
                            {
                                //pass 1
                                if (i == 0)
                                {
                                    if (Vector3Class.Dot(Vector3Class.Cross(p1 - p3, planeIntersection - p3), direction) > 0)
                                    {
                                        continue;
                                    }
                                    if (Vector3Class.Dot(Vector3Class.Cross(p2 - p1, planeIntersection - p1), direction) > 0)
                                    {
                                        continue;
                                    }
                                    if (Vector3Class.Dot(Vector3Class.Cross(p3 - p2, planeIntersection - p2), direction) > 0)
                                    {
                                        continue;
                                    }
                                }
                                else
                                {
                                    if (Vector3Class.Dot(Vector3Class.Cross(p1 - p3, planeIntersection - p3), direction) < 0)
                                    {
                                        continue;
                                    }
                                    if (Vector3Class.Dot(Vector3Class.Cross(p2 - p1, planeIntersection - p1), direction) < 0)
                                    {
                                        continue;
                                    }
                                    if (Vector3Class.Dot(Vector3Class.Cross(p3 - p2, planeIntersection - p2), direction) < 0)
                                    {
                                        continue;
                                    }
                                }

                                if (intersectionPoints == null)
                                {
                                    intersectionPoints = new List <Vector3Class>();
                                }
                                intersectionPoints.Add(planeIntersection);
                            }
                        }
                    }
                }
            }


            return(intersectionPoints);
        }
Example #12
0
        internal static Dictionary <TriangleConnectionInfo, bool> GetConnectedMesh(TriangleConnectionInfo parentTriangle, Dictionary <TriangleConnectionInfo, bool> availableConnections, TriangleInfoList triangles)
        {
            var connectedTriangles = new Dictionary <TriangleConnectionInfo, bool>();

            //if (triangles.Connections.Count == 0)
            //{
            //    triangles.UpdateConnections();
            //}

            if (availableConnections.Count == 1)
            {
                connectedTriangles.Add(availableConnections.ElementAt(0).Key, false);
            }
            else
            {
                var foundChildConnections = GetConnectedTriangles(new List <TriangleConnectionInfo>()
                {
                    parentTriangle
                }, availableConnections, triangles, connectedTriangles);
                while (foundChildConnections.Count > 0)
                {
                    foundChildConnections = GetConnectedTriangles(foundChildConnections, availableConnections, triangles, connectedTriangles);
                }
            }

            return(connectedTriangles);
        }
Example #13
0
        internal static List <TriangleConnectionInfo> GetConnectedTriangles(List <TriangleConnectionInfo> parentConnections, Dictionary <TriangleConnectionInfo, bool> availableConnections, TriangleInfoList triangles, Dictionary <TriangleConnectionInfo, bool> connectedTriangles)
        {
            var foundChildConnections = new List <TriangleConnectionInfo>();

            try
            {
                foreach (var parentConnection in parentConnections)
                {
                    var childConnections = triangles.GetConnectedTriangles(parentConnection);
                    foreach (var childConnection in childConnections)
                    {
                        if (availableConnections.ContainsKey(childConnection))
                        {
                            if (!connectedTriangles.ContainsKey(childConnection))
                            {
                                connectedTriangles.Add(childConnection, false);
                                availableConnections.Remove(childConnection);
                                foundChildConnections.Add(childConnection);
                            }
                        }
                    }
                }
            }
            catch (Exception exc)
            {
                LoggingManager.WriteToLog("Exception Manager", "GetConnectedTriangles", exc.StackTrace);
            }

            return(foundChildConnections);
        }