예제 #1
0
    private void RenderCollision2D <T>(Type type) where T : Collider2D
    {
        T[]   colliders = UnityEngine.Object.FindObjectsOfType <T>();
        Color color     = ColliderColor(type);

        AddToRenderList2D(colliders);

        switch (type)
        {
        case Type.Boxes:
            Box2D.Render(colliderList2D, color, EdgeAlpha, color, FaceAlpha, IsSet(Flags.NoDepth));
            Box2D.Render(triggerList2D, triggerColor, EdgeAlpha, triggerColor, FaceAlpha, IsSet(Flags.NoDepth));
            break;

        case Type.Spheres:
            Circle2D.Render(colliderList2D, color, EdgeAlpha, color, FaceAlpha, IsSet(Flags.NoDepth));
            Circle2D.Render(triggerList2D, triggerColor, EdgeAlpha, triggerColor, FaceAlpha, IsSet(Flags.NoDepth));
            break;

        case Type.Meshes:
            if (typeof(T) == typeof(EdgeCollider2D))
            {
                Edge2D.Render(colliderList2D, color, EdgeAlpha, color, FaceAlpha, IsSet(Flags.NoDepth));
                Edge2D.Render(triggerList2D, triggerColor, EdgeAlpha, triggerColor, FaceAlpha, IsSet(Flags.NoDepth));
            }
            else
            {
                Mesh2D.Render(colliderList2D, color, EdgeAlpha, color, FaceAlpha, IsSet(Flags.NoDepth));
                Mesh2D.Render(triggerList2D, triggerColor, EdgeAlpha, triggerColor, FaceAlpha, IsSet(Flags.NoDepth));
            }
            break;
        }

        guiColliderCount[(int)type] += colliderList2D.Count + triggerList2D.Count;
    }
예제 #2
0
    public override bool Equals(object obj)
    {
        if (!(obj is Edge2D))
        {
            return(false);
        }

        Edge2D other = (Edge2D)obj;

        return(a.Equals(other.a) && b.Equals(other.b));
    }
예제 #3
0
        Dictionary <Edge2D, int> BuildEdgesFromMesh()
        {
            var mesh = filter.sharedMesh;

            if (mesh == null)
            {
                return(null);
            }

            var verts = mesh.vertices;
            var tris  = mesh.triangles;
            var edges = new Dictionary <Edge2D, int>();

            for (int i = 0; i < tris.Length - 2; i += 3)
            {
                var faceVert1 = verts[tris[i]];
                var faceVert2 = verts[tris[i + 1]];
                var faceVert3 = verts[tris[i + 2]];

                if (Math.Round(faceVert1.z, 3) != 0 || Math.Round(faceVert2.z, 3) != 0 || Math.Round(faceVert3.z, 3) != 0)
                {
                    continue;
                }

                Edge2D[] faceEdges;
                faceEdges = new Edge2D[] {
                    new Edge2D {
                        a = faceVert1, b = faceVert2
                    },
                    new Edge2D {
                        a = faceVert2, b = faceVert3
                    },
                    new Edge2D {
                        a = faceVert3, b = faceVert1
                    },
                };

                foreach (var edge in faceEdges)
                {
                    if (edges.ContainsKey(edge))
                    {
                        edges[edge]++;
                    }
                    else
                    {
                        edges[edge] = 1;
                    }
                }
            }

            return(edges);
        }
예제 #4
0
        private void AddEdge(Edge2D e)
        {
            if (e != null)
            {
                _edge.Add(e);

                IPrimitive prim = new Tube();
                (prim as Tube).StartVector = e.V1.q;
                (prim as Tube).EndVector   = e.V2.q;

                AddPrimitive(prim);
            }
        }
예제 #5
0
        public double LinearCut(Edge2D e)
        {
            double x0 = e.V1.X;
            double y0 = e.V1.Y;

            double x1 = e.V2.X;
            double y1 = e.V2.Y;

            Func <double, double> Lin = (t) =>
            {
                Vertex2D v = e.Verteces2LinCut(t);
                return(Calc(v.X, v.Y));
            };

            return(Dihotomy(Lin, 0.0, 1.0, 1e-3));
        }
        /// <summary>
        /// 通过SpriteRenderer去找所有的边,存到一个字典里
        /// 如果 int = 1 则证明是边缘的边,如果 int = 2 则证明则是公用的(不是边缘)
        /// </summary>
        /// <returns>返回存Edge2D的字典</returns>
        private static Dictionary <Edge2D, int> BuildEdgesFromSprite(SpriteRenderer spriteRenderer)
        {
            if (spriteRenderer == null)
            {
                return(null);
            }

            var verts = spriteRenderer.sprite.vertices;
            var tris  = spriteRenderer.sprite.triangles;
            var edges = new Dictionary <Edge2D, int>();

            for (int i = 0; i < tris.Length - 2; i += 3)
            {
                var faceVert1 = verts[tris[i]];
                var faceVert2 = verts[tris[i + 1]];
                var faceVert3 = verts[tris[i + 2]];

                Edge2D[] faceEdges;
                faceEdges = new Edge2D[] {
                    new Edge2D {
                        a = faceVert1, b = faceVert2
                    },
                    new Edge2D {
                        a = faceVert2, b = faceVert3
                    },
                    new Edge2D {
                        a = faceVert3, b = faceVert1
                    },
                };

                foreach (var edge in faceEdges)
                {
                    if (edges.ContainsKey(edge))
                    {
                        edges[edge]++;
                    }
                    else
                    {
                        edges[edge] = 1;
                    }
                }
            }

            return(edges);
        }
예제 #7
0
        private Edge2D AddEdgeIfNotExist(Vertex2D v1, Vertex2D v2)
        {
            Edge2D e1 = _edge.Find(item => (item.V1.ID == v1.ID) & (item.V2.ID == v2.ID));
            Edge2D e2 = _edge.Find(item => (item.V1.ID == v2.ID) & (item.V2.ID == v1.ID));

            if (e1 != null)
            {
                return(e1);
            }

            if (e2 != null)
            {
                return(e2);
            }

            Edge2D e = new Edge2D(v1, v2);

            AddEdge(e);
            return(e);
        }
    public void InsertPointAt(_Block block, Vector3 position)
    {
        //_Block block = blockObj.GetComponent<_Block>();
        Edge2D edge = block.Edge;

        block.Recycle();
        blocks.Remove(block);

        _Vertex vertex = vertexPrefab.Spawn();

        vertex.transform.SetParent(transform);
        vertex.transform.position = position;
        vertex.Border             = this;

        edge.MiddlePoint = vertex.Point;

        Edge2D e0 = new Edge2D(edge.Points[0], vertex.Point);
        Edge2D e1 = new Edge2D(vertex.Point, edge.Points[1]);

        _Block b0 = blockPrefab.Spawn();
        _Block b1 = blockPrefab.Spawn();

        b0.transform.SetParent(transform);
        b1.transform.SetParent(transform);
        b0.Border = this;
        b1.Border = this;
        b0.Edge   = e0;
        b1.Edge   = e1;

        blocks.Add(b0);
        blocks.Add(b1);

        vertexs.Add(vertex);

        _lazyAllVertices.isValeChanged = true;

        //Debug.Log("Border Vertices Count : " + Vertices.Count);
    }
            private static EdgeIntersection[] MergeIslandSprtSegmentsSprtIntersections(int polygonIndex, Edge2D edge, EdgeIntersection[] intersections)
            {
                List<EdgeIntersection> retVal = new List<EdgeIntersection>();

                foreach (EdgeIntersection intersection in intersections)
                {
                    if (intersection.Poly1Index == polygonIndex)        //  polygon match (1)
                    {
                        if (MergeIslandSprtSegmentsSprtIntersectionsSprtIsSame(edge.Index0, edge.Index1.Value, intersection.Poly1Edge.Index0, intersection.Poly1Edge.Index1.Value))     // edge match (1)
                        {
                            retVal.Add(intersection);
                        }
                    }
                    else if (intersection.Poly2Index == polygonIndex)       //  polygon match (2)
                    {
                        if (MergeIslandSprtSegmentsSprtIntersectionsSprtIsSame(edge.Index0, edge.Index1.Value, intersection.Poly2Edge.Index0, intersection.Poly2Edge.Index1.Value))     // edge match (2)
                        {
                            retVal.Add(intersection);
                        }
                    }
                }

                return retVal.ToArray();
            }
예제 #10
0
        private static Canvas DrawVoronoi_Tiled(VoronoiResult2D voronoi, SOMNode[] nodes, ISOMInput[][] images, int imageWidth, int imageHeight, int tileWidth, int tileHeight, Action <DrawTileArgs> drawTile, BlobEvents events)
        {
            #region transform

            var aabb = Math2D.GetAABB(voronoi.EdgePoints);

            TransformGroup transform = new TransformGroup();
            transform.Children.Add(new TranslateTransform(-aabb.Item1.X, -aabb.Item1.Y));
            transform.Children.Add(new ScaleTransform(imageWidth / (aabb.Item2.X - aabb.Item1.X), imageHeight / (aabb.Item2.Y - aabb.Item1.Y)));

            #endregion

            Canvas retVal = new Canvas();

            for (int cntr = 0; cntr < voronoi.ControlPoints.Length; cntr++)
            {
                #region polygon

                Polygon polygon = new Polygon();

                if (voronoi.EdgesByControlPoint[cntr].Length < 3)
                {
                    throw new ApplicationException("Expected at least three edge points");
                }

                Edge2D[] edges      = voronoi.EdgesByControlPoint[cntr].Select(o => voronoi.Edges[o]).ToArray();
                Point[]  edgePoints = Edge2D.GetPolygon(edges, 1d);

                edgePoints = edgePoints.
                             Select(o => transform.Transform(o)).
                             ToArray();

                foreach (Point point in edgePoints)
                {
                    polygon.Points.Add(point);
                }

                polygon.Fill            = GetTiledSamples(edgePoints, images[cntr], nodes[cntr], tileWidth, tileHeight, drawTile);
                polygon.Stroke          = new SolidColorBrush(UtilityWPF.GetRandomColor(64, 192));
                polygon.StrokeThickness = 2;

                polygon.Tag = Tuple.Create(nodes[cntr], images[cntr]);

                if (events != null)
                {
                    if (events.MouseMove != null && events.MouseLeave != null)
                    {
                        polygon.MouseMove  += Polygon2D_MouseMove;
                        polygon.MouseLeave += Polygon2D_MouseLeave;
                    }

                    if (events.Click != null)
                    {
                        polygon.MouseUp += Polygon_MouseUp;
                    }
                }

                retVal.Children.Add(polygon);

                #endregion
            }

            return(retVal);
        }
예제 #11
0
        private static Canvas DrawVoronoi_Blobs(VoronoiResult2D voronoi, Color[] colors, SOMNode[] nodes, ISOMInput[][] inputsByNode, int imageWidth, int imageHeight, BlobEvents events)
        {
            const double MARGINPERCENT = 1.05;

            // Analyze size ratios
            double[] areas = AnalyzeVoronoiCellSizes(voronoi, inputsByNode);

            #region transform

            var aabb = Math2D.GetAABB(voronoi.EdgePoints);
            aabb = Tuple.Create((aabb.Item1.ToVector() * MARGINPERCENT).ToPoint(), (aabb.Item2.ToVector() * MARGINPERCENT).ToPoint());

            TransformGroup transform = new TransformGroup();
            transform.Children.Add(new TranslateTransform(-aabb.Item1.X, -aabb.Item1.Y));
            transform.Children.Add(new ScaleTransform(imageWidth / (aabb.Item2.X - aabb.Item1.X), imageHeight / (aabb.Item2.Y - aabb.Item1.Y)));

            #endregion

            Canvas retVal = new Canvas();
            retVal.Effect = new DropShadowEffect()
            {
                Color       = Colors.Gray,
                Opacity     = .2,
                BlurRadius  = 5,
                Direction   = 0,
                ShadowDepth = 0,
            };

            for (int cntr = 0; cntr < voronoi.ControlPoints.Length; cntr++)
            {
                #region polygon

                Polygon polygon = new Polygon();

                if (voronoi.EdgesByControlPoint[cntr].Length < 3)
                {
                    throw new ApplicationException("Expected at least three edge points");
                }

                Edge2D[] edges      = voronoi.EdgesByControlPoint[cntr].Select(o => voronoi.Edges[o]).ToArray();
                Point[]  edgePoints = Edge2D.GetPolygon(edges, 1d);

                // Resize to match the desired area
                edgePoints = ResizeConvexPolygon(edgePoints, areas[cntr]);

                // Convert into a smooth blob
                BezierSegment3D[] bezier = BezierUtil.GetBezierSegments(edgePoints.Select(o => o.ToPoint3D()).ToArray(), .25, true);
                edgePoints = BezierUtil.GetPath(75, bezier).
                             Select(o => o.ToPoint2D()).
                             ToArray();

                // Transform to canvas coords
                edgePoints = edgePoints.
                             Select(o => transform.Transform(o)).
                             ToArray();

                foreach (Point point in edgePoints)
                {
                    polygon.Points.Add(point);
                }

                polygon.Fill            = new SolidColorBrush(colors[cntr]);
                polygon.Stroke          = null; // new SolidColorBrush(UtilityWPF.OppositeColor(colors[cntr], false));
                polygon.StrokeThickness = 1;

                polygon.Tag = Tuple.Create(events, nodes[cntr], inputsByNode[cntr]);

                if (events != null)
                {
                    if (events.MouseMove != null && events.MouseLeave != null)
                    {
                        polygon.MouseMove  += Polygon2D_MouseMove;
                        polygon.MouseLeave += Polygon2D_MouseLeave;
                    }

                    if (events.Click != null)
                    {
                        polygon.MouseUp += Polygon_MouseUp;
                    }
                }

                retVal.Children.Add(polygon);

                #endregion
            }

            return(retVal);
        }
예제 #12
0
        public bool UpdateCadTopologyGeometry(CadObject2D cad2D)
        {
            SutableRotMode = RotMode.RotMode2D;
            IList <CadObject2DDrawPart> oldDrawParts = new List <CadObject2DDrawPart>();

            for (int i = 0; i < DrawParts.Count; i++)
            {
                oldDrawParts.Add(new CadObject2DDrawPart(DrawParts[i]));
            }

            for (int idp = 0; idp < oldDrawParts.Count; idp++)
            {
                oldDrawParts[idp].MeshId   = 0;
                oldDrawParts[idp].ShowMode = 0;
            }
            DrawParts.Clear();

            int minLayer;
            int maxLayer;

            cad2D.GetLayerMinMax(out minLayer, out maxLayer);
            double layerHeight = 1.0 / (maxLayer - minLayer + 1);

            {
                // 面をセット
                IList <uint> lIds = cad2D.GetElementIds(CadElementType.Loop);
                for (int iLId = 0; iLId < lIds.Count; iLId++)
                {
                    uint   lId    = lIds[iLId];
                    double height = 0;
                    {
                        int layer = cad2D.GetLayer(CadElementType.Loop, lId);
                        height = (layer - minLayer) * layerHeight;
                    }
                    int idp0 = 0;
                    for (; idp0 < oldDrawParts.Count; idp0++)
                    {
                        CadObject2DDrawPart olddp = oldDrawParts[idp0];
                        if (olddp.Type == CadElementType.Loop && olddp.CadId == lId)
                        {
                            olddp.MeshId = 1;
                            olddp.Height = height;
                            double[] color = cad2D.GetLoopColor(lId);
                            for (int iTmp = 0; iTmp < 3; iTmp++)
                            {
                                olddp.Color[iTmp] = (float)color[iTmp];
                            }
                            DrawParts.Add(oldDrawParts[idp0]);
                            break;
                        }
                    }
                    if (idp0 == oldDrawParts.Count)
                    {
                        CadObject2DDrawPart dp = new CadObject2DDrawPart();
                        dp.CadId  = lId;
                        dp.Type   = CadElementType.Loop;
                        dp.Height = height;
                        double[] color = cad2D.GetLoopColor(lId);
                        for (int iTmp = 0; iTmp < 3; iTmp++)
                        {
                            dp.Color[iTmp] = (float)color[iTmp];
                        }
                        DrawParts.Add(dp);
                    }
                }
            }

            {
                // set edge
                IList <uint> eIds = cad2D.GetElementIds(CadElementType.Edge);
                for (int iEId = 0; iEId < eIds.Count; iEId++)
                {
                    uint   eId    = eIds[iEId];
                    double height = 0;
                    {
                        int layer = cad2D.GetLayer(CadElementType.Edge, eId);
                        height += (layer - minLayer + 0.01) * layerHeight;
                    }
                    int idp0 = 0;
                    for (; idp0 < oldDrawParts.Count; idp0++)
                    {
                        CadObject2DDrawPart olddp = oldDrawParts[idp0];
                        if (olddp.Type == CadElementType.Edge && olddp.CadId == eId)
                        {
                            olddp.MeshId = 1;
                            olddp.Height = height;
                            DrawParts.Add(olddp);
                            break;
                        }
                    }
                    if (idp0 == oldDrawParts.Count)
                    {
                        CadObject2DDrawPart dp = new CadObject2DDrawPart();
                        dp.CadId  = eId;
                        dp.Type   = CadElementType.Edge;
                        dp.Height = height;
                        DrawParts.Add(dp);
                    }
                    {
                        CadObject2DDrawPart dp = DrawParts[DrawParts.Count - 1];
                        Edge2D edge            = cad2D.GetEdge(eId);
                        dp.CtrlPoints.Clear();
                        dp.CurveType = edge.CurveType;
                        if (edge.CurveType == CurveType.CurveArc)
                        {
                            OpenTK.Vector2d cPt;
                            double          radius;
                            edge.GetCenterRadius(out cPt, out radius);
                            dp.CtrlPoints.Add(cPt);
                        }
                        else if (edge.CurveType == CurveType.CurveBezier)
                        {
                            IList <OpenTK.Vector2d> cos = edge.GetCurvePoint();
                            dp.CtrlPoints.Add(cos[0]);
                            dp.CtrlPoints.Add(cos[1]);
                        }
                    }
                }
            }

            {
                // set vertex
                IList <uint> vIds = cad2D.GetElementIds(CadElementType.Vertex);
                for (int iVId = 0; iVId < vIds.Count; iVId++)
                {
                    uint   vCadId = vIds[iVId];
                    int    layer  = cad2D.GetLayer(CadElementType.Vertex, vCadId);
                    double height = (layer - minLayer + 0.1) * layerHeight;
                    int    idp0   = 0;
                    for (; idp0 < oldDrawParts.Count; idp0++)
                    {
                        CadObject2DDrawPart olddp = oldDrawParts[idp0];
                        if (olddp.Type == CadElementType.Vertex && olddp.CadId == vCadId)
                        {
                            olddp.MeshId = 1;
                            olddp.Height = height;
                            DrawParts.Add(olddp);
                            break;
                        }
                    }
                    if (idp0 == oldDrawParts.Count)
                    {
                        CadObject2DDrawPart dp = new CadObject2DDrawPart();
                        dp.CadId  = vCadId;
                        dp.Type   = CadElementType.Vertex;
                        dp.Height = height;
                        DrawParts.Add(dp);
                    }
                }
            }

            oldDrawParts.Clear();

            UpdateCadGeometry(cad2D);
            return(true);
        }
예제 #13
0
        public void UpdateCadGeometry(CadObject2D cad2D)
        {
            Mesher2D mesh = new Mesher2D(cad2D);

            for (int idp = 0; idp < DrawParts.Count; idp++)
            {
                CadObject2DDrawPart dp = DrawParts[idp];
                dp.Clear();
                uint           cadId   = dp.CadId;
                CadElementType cadType = dp.Type;
                if (!cad2D.IsElementId(cadType, cadId))
                {
                    continue;
                }
                uint meshId = mesh.GetIdFromCadId(cadId, cadType);
                if (meshId == 0)
                {
                    continue;
                }
                MeshType meshType;
                uint     elemCnt;
                int      loc;
                uint     cadId0;
                mesh.GetMeshInfo(meshId, out elemCnt, out meshType, out loc, out cadId0);
                System.Diagnostics.Debug.Assert(cadId0 == cadId);
                if (meshType == MeshType.Tri)
                {
                    dp.SetTriArray(mesh.GetTriArrays()[loc]);
                    double[] color = cad2D.GetLoopColor(cadId0);
                    for (int iTmp = 0; iTmp < 3; iTmp++)
                    {
                        dp.Color[iTmp] = (float)color[iTmp];
                    }
                }
                else if (meshType == MeshType.Bar)
                {
                    dp.SetBarArray(mesh.GetBarArrays()[loc]);
                    System.Diagnostics.Debug.Assert(cadType == CadElementType.Edge);
                    Edge2D edge = cad2D.GetEdge(cadId);
                    dp.CurveType = edge.CurveType;
                    dp.CtrlPoints.Clear();
                    // 2019-03-11 エッジの色 FIX
                    double[] color = edge.Color;
                    for (int iTmp = 0; iTmp < 3; iTmp++)
                    {
                        dp.Color[iTmp] = (float)color[iTmp];
                    }
                    if (edge.CurveType == CurveType.CurveArc)
                    {
                        OpenTK.Vector2d cPt;
                        double          radius;
                        edge.GetCenterRadius(out cPt, out radius);
                        dp.CtrlPoints.Add(cPt);
                    }
                    else if (edge.CurveType == CurveType.CurveBezier)
                    {
                        IList <OpenTK.Vector2d> cos = edge.GetCurvePoint();
                        dp.CtrlPoints.Add(cos[0]);
                        dp.CtrlPoints.Add(cos[1]);
                    }
                }
                else if (meshType == MeshType.Vertex)
                {
                    dp.SetVertex(mesh.GetVertexs()[loc]);
                }
            }

            {
                // 座標をセット
                IList <OpenTK.Vector2d> vec2Ds = mesh.GetVectors();
                uint ptCnt = (uint)vec2Ds.Count;
                uint ndim  = 2;
                VertexArray.SetSize(ptCnt, ndim);
                for (int iPt = 0; iPt < ptCnt; iPt++)
                {
                    VertexArray.VertexCoordArray[iPt * ndim]     = vec2Ds[iPt].X;
                    VertexArray.VertexCoordArray[iPt * ndim + 1] = vec2Ds[iPt].Y;
                }
                if (VertexArray.UVCoordArray != null)
                {
                    for (int iPt = 0; iPt < ptCnt; iPt++)
                    {
                        VertexArray.UVCoordArray[iPt * ndim]     = vec2Ds[iPt].X * TexScale;
                        VertexArray.UVCoordArray[iPt * ndim + 1] = vec2Ds[iPt].Y * TexScale;
                    }
                }
            }
        }
 public PolygonOverlay(Edge2D[] polygonEdges, Point[] polygonPoints, Tuple<int, int, double>[] pixels)
 {
     this.PolygonEdges = polygonEdges;
     this.PolygonPoints = polygonPoints;
     this.Pixels = pixels;
 }
예제 #15
0
                public EdgeIntersection(int poly1Index, Edge2D poly1Edge, int poly2Index, Edge2D poly2Edge, Point intersectionPoint)
                {
                    this.Poly1Index = poly1Index;
                    this.Poly1Edge = poly1Edge;

                    this.Poly2Index = poly2Index;
                    this.Poly2Edge = poly2Edge;

                    this.IntersectionPoint = intersectionPoint;
                }
예제 #16
0
        public bool SmoothingPolylineEdge(uint eId, uint nIter, OpenTK.Vector2d pos, double radius)
        {
            if (!this.IsElementId(CadElementType.Edge, eId))
            {
                return(false);
            }
            if (GetEdgeCurveType(eId) != CurveType.CurvePolyline)
            {
                return(true);
            }
            if (nIter == 0)
            {
                return(true);
            }
            Edge2D         edge = GetEdge(eId);
            IList <double> axys = edge.GetCurveRelPoint();

            System.Diagnostics.Debug.Assert(axys.Count % 2 == 0);
            uint         nno    = (uint)axys.Count / 2;
            IList <uint> aIndNo = new List <uint>();

            if (radius > 0)
            {
                uint[] tmp = new uint[nno];
                for (int i = 0; i < nno; i++)
                {
                    if (i < aIndNo.Count)
                    {
                        tmp[i] = aIndNo[i];
                    }
                    else
                    {
                        tmp[i] = 0;
                    }
                }
                aIndNo.Clear();
                aIndNo = tmp.ToList();

                OpenTK.Vector2d sPt = edge.GetVertex(true);
                OpenTK.Vector2d ePt = edge.GetVertex(false);
                var             v0  = ePt - sPt;
                OpenTK.Vector2d v1  = new OpenTK.Vector2d(-v0.Y, v0.X);
                for (int ino = 0; ino < nno; ino++)
                {
                    var p = sPt + v0 * axys[ino * 2 + 0] + v1 * axys[ino * 2 + 1];
                    if (CadUtils.SquareLength(p - pos) < radius * radius)
                    {
                        aIndNo.Add((uint)ino);
                    }
                }
            }
            else
            {
                aIndNo = new List <uint>();
                for (int ino = 0; ino < nno; ino++)
                {
                    aIndNo[ino] = (uint)ino;
                }
            }

            // strength of smoothing(0から1)
            double w = 0.8;

            for (uint iiter = 0; iiter < nIter; iiter++)
            {
                for (int iIndNo = 0; iIndNo < aIndNo.Count; iIndNo++)
                {
                    int      ino = (int)aIndNo[iIndNo];
                    double[] po0 = new double[2];
                    double[] po1 = new double[2];
                    double[] po2 = new double[2];
                    if (ino == 0)
                    {
                        po0[0] = 0;
                        po0[1] = 0;
                    }
                    else
                    {
                        po0[0] = axys[ino * 2 - 2];
                        po0[1] = axys[ino * 2 - 1];
                    }
                    po1[0] = axys[ino * 2 + 0];
                    po1[1] = axys[ino * 2 + 1];
                    if (ino == nno - 1)
                    {
                        po2[0] = 1; po2[1] = 0;
                    }
                    else
                    {
                        po2[0] = axys[ino * 2 + 2];
                        po2[1] = axys[ino * 2 + 3];
                    }
                    ////////////////
                    double[] mPt = { (po0[0] + po2[0]) * 0.5, (po0[1] + po2[1]) * 0.5 };
                    double[] dPt = { (1.0 - w) * po1[0] + w * mPt[0], (1.0 - w) * po1[1] + w * mPt[1] };
                    axys[ino * 2 + 0] = dPt[0];
                    axys[ino * 2 + 1] = dPt[1];
                }
            }
            edge.SetCurveRelPoint(axys);
            return(true);
        }
        /// <summary>
        /// 骨骼动画直接是找最大的区域
        /// </summary>
        /// <returns>返回存Edge2D的字典</returns>
        private static Dictionary <Edge2D, int> BuildEdgesFromSkeletonAnim(MeshFilter filter)
        {
            var mesh = filter.sharedMesh;

            if (mesh == null)
            {
                return(null);
            }


            var verts = mesh.vertices;
            var tris  = mesh.triangles;
            var edges = new Dictionary <Edge2D, int>();

            Vector3 vert    = verts[0];
            float   minXPos = vert.x;
            float   maxXPos = vert.x;
            float   minYPos = vert.y;
            float   maxYPos = vert.y;

            for (int i = 1; i < verts.Length; i++)
            {
                Vector3 checkVert = verts[i];
                if (checkVert.x < minXPos)
                {
                    minXPos = checkVert.x;
                }
                if (checkVert.x > maxXPos)
                {
                    maxXPos = checkVert.x;
                }

                if (checkVert.y < minYPos)
                {
                    minYPos = checkVert.y;
                }
                if (checkVert.y > maxYPos)
                {
                    maxYPos = checkVert.y;
                }
            }

            //修复偏移
            minYPos = 0;

            Edge2D[] faceEdges;
            faceEdges = new Edge2D[] {
                new Edge2D {
                    a = new Vector2(minXPos, minYPos), b = new Vector2(minXPos, maxYPos)
                },
                new Edge2D {
                    a = new Vector2(minXPos, maxYPos), b = new Vector2(maxXPos, maxYPos)
                },
                new Edge2D {
                    a = new Vector2(maxXPos, maxYPos), b = new Vector2(maxXPos, minYPos)
                },
                new Edge2D {
                    a = new Vector2(maxXPos, minYPos), b = new Vector2(minXPos, minYPos)
                },
            };

            foreach (var edge in faceEdges)
            {
                if (edges.ContainsKey(edge))
                {
                    edges[edge]++;
                }
                else
                {
                    edges[edge] = 1;
                }
            }
            return(edges);
        }
예제 #18
0
        public static int CheckEdgeIntersection(IList <Edge2D> edges)
        {
            uint edgeCnt = (uint)edges.Count;

            for (int iedge = 0; iedge < edgeCnt; iedge++)
            {
                Edge2D iE = edges[iedge];
                if (iE.IsCrossEdgeSelf())
                {
                    return(1);
                }
                uint          iPt0 = iE.GetVertexId(true);
                uint          iPt1 = iE.GetVertexId(false);
                BoundingBox2D iBB  = iE.GetBoundingBox();
                for (int jedge = iedge + 1; jedge < edgeCnt; jedge++)
                {
                    Edge2D jE   = edges[jedge];
                    uint   jPt0 = jE.GetVertexId(true);
                    uint   jPt1 = jE.GetVertexId(false);
                    if ((iPt0 - jPt0) * (iPt0 - jPt1) * (iPt1 - jPt0) * (iPt1 - jPt1) != 0)
                    {
                        BoundingBox2D jBB = jE.GetBoundingBox();
                        if (jBB.MinX > iBB.MaxX || jBB.MaxX < iBB.MinX)
                        {
                            continue;
                        }
                        if (jBB.MinY > iBB.MaxY || jBB.MaxY < iBB.MinY)
                        {
                            continue;
                        }
                        if (!iE.IsCrossEdge(jE))
                        {
                            continue;
                        }
                        return(1);
                    }
                    if (iPt0 == jPt0 && iPt1 == jPt1)
                    {
                        if (iE.IsCrossEdgeShareBothPoints(jE, true))
                        {
                            return(1);
                        }
                    }
                    else if (iPt0 == jPt1 && iPt1 == jPt0)
                    {
                        if (iE.IsCrossEdgeShareBothPoints(jE, false))
                        {
                            return(1);
                        }
                    }
                    else if (iPt0 == jPt0)
                    {
                        if (iE.IsCrossEdgeShareOnePoint(jE, true, true))
                        {
                            return(1);
                        }
                    }
                    else if (iPt0 == jPt1)
                    {
                        if (iE.IsCrossEdgeShareOnePoint(jE, true, false))
                        {
                            return(1);
                        }
                    }
                    else if (iPt1 == jPt0)
                    {
                        if (iE.IsCrossEdgeShareOnePoint(jE, false, true))
                        {
                            return(1);
                        }
                    }
                    else if (iPt1 == jPt1)
                    {
                        if (iE.IsCrossEdgeShareOnePoint(jE, false, false))
                        {
                            return(1);
                        }
                    }
                    continue;
                }
            }
            return(0);
        }
예제 #19
0
        public void SetCadEdge(CadObject2D cad2D, uint eId, OpenTK.Vector2d pickPos)
        {
            this.PickPos = pickPos;
            this.ECadId  = eId;
            ClearMemory();
            IList <double> relCoPolys = new List <double>();
            {
                System.Diagnostics.Debug.Assert(cad2D.IsElementId(CadElementType.Edge, eId));
                Edge2D e = cad2D.GetEdge(eId);
                relCoPolys = e.GetCurveRelPoint();
            }
            IList <double> xys  = new List <double>();
            uint           ndiv = (uint)(relCoPolys.Count / 2 + 1);

            No = ndiv + 1;
            for (int i = 0; i < No * 2; i++)
            {
                xys.Add(0);
            }
            uint sVId = cad2D.GetEdgeVertexId(eId, true);
            uint eVId = cad2D.GetEdgeVertexId(eId, false);

            OpenTK.Vector2d sV  = cad2D.GetVertexCoord(sVId);
            OpenTK.Vector2d eV  = cad2D.GetVertexCoord(eVId);
            OpenTK.Vector2d hse = eV - sV;
            OpenTK.Vector2d vse = new OpenTK.Vector2d(-hse.Y, hse.X);
            xys.Add(sV.X);
            xys.Add(sV.Y);
            for (int i = 0; i < ndiv - 1; i++)
            {
                OpenTK.Vector2d v = sV + relCoPolys[i * 2 + 0] * hse + relCoPolys[i * 2 + 1] * vse;
                xys.Add(v.X);
                xys.Add(v.Y);
            }
            xys.Add(eV.X);
            xys.Add(eV.Y);
            //////////////////////////////////////
            Mat    = new TriDiaMat3(No);
            IniX   = new double[No * 2];
            Ut     = new double[No * 3];
            Res    = new double[No * 3];
            Dut    = new double[No * 3];
            BCFlag = new int[No * 3];
            ////
            for (int i = 0; i < No * 2; i++)
            {
                IniX[i] = xys[i];
            }
            for (int i = 0; i < No * 3; i++)
            {
                Ut[i] = 0;
            }
            for (int i = 0; i < No * 3; i++)
            {
                BCFlag[i] = 0;
            }
            //////////////////////////////////////
            SetFixedBoundaryFlag(0, 0);
            SetFixedBoundaryFlag(0, 1);
            SetFixedBoundaryFlag(No - 1, 0);
            SetFixedBoundaryFlag(No - 1, 1);
            double alpha;
            double ndist;
            double normX;
            double normY;

            ProjectPoint(pickPos.X, pickPos.Y, ref PickedDivIndex,
                         out alpha, out ndist, out normX, out normY);
            if (PickedDivIndex == -1)
            {
                return;
            }
            SetFixedBoundaryFlag((uint)PickedDivIndex, 0);
            SetFixedBoundaryFlag((uint)PickedDivIndex, 1);
            SetFixedBoundaryFlag((uint)PickedDivIndex + 1, 0);
            SetFixedBoundaryFlag((uint)PickedDivIndex + 1, 1);
        }
예제 #20
0
        public bool MoveEdgeCtrl(uint eId, uint iCtrl, OpenTK.Vector2d deltaVec)
        {
            if (!IsElementId(CadElementType.Edge, eId))
            {
                return(false);
            }

            IList <double> oldRelCos = null;
            {
                Edge2D e = GetEdge(eId);
                oldRelCos = e.GetCurveRelPoint();
            }

            Edge2D edge = GetEdge(eId);

            if (iCtrl >= edge.GetCurvePoint().Count)
            {
                return(true);
            }
            {
                OpenTK.Vector2d sPt    = edge.GetVertex(true);
                OpenTK.Vector2d ePt    = edge.GetVertex(false);
                double          sqLen  = CadUtils.SquareLength(ePt - sPt);
                var             eh     = (ePt - sPt) * (1 / sqLen);
                OpenTK.Vector2d ev     = new OpenTK.Vector2d(-eh.Y, eh.X);
                var             p0     = edge.GetCurvePoint()[(int)iCtrl] + deltaVec;
                IList <double>  aRelCo = edge.GetCurveRelPoint();
                aRelCo[(int)(iCtrl * 2 + 0)] = OpenTK.Vector2d.Dot(p0 - sPt, eh);
                aRelCo[(int)(iCtrl * 2 + 1)] = OpenTK.Vector2d.Dot(p0 - sPt, ev);
                edge.SetCurveRelPoint(aRelCo);
            }

            HashSet <uint> setLId = new HashSet <uint>();

            for (VertexEdgeItr vItr = this.BRep.GetVertexEdgeItr(edge.GetVertexId(true)); !vItr.IsEnd(); vItr++)
            {
                uint tmpLId = vItr.GetLoopId();
                if (!setLId.Contains(tmpLId))
                {
                    setLId.Add(tmpLId);
                }
            }
            for (VertexEdgeItr vItr = this.BRep.GetVertexEdgeItr(edge.GetVertexId(false)); !vItr.IsEnd(); vItr++)
            {
                uint tmpLId = vItr.GetLoopId();
                if (!setLId.Contains(tmpLId))
                {
                    setLId.Add(tmpLId);
                }
            }

            foreach (uint lId in setLId)
            {
                if (!this.BRep.IsElementId(CadElementType.Loop, lId))
                {
                    continue;
                }
                if (CheckLoop(lId) != 0)
                {
                    // fail
                    edge.SetCurveRelPoint(oldRelCos);
                    return(true);
                }
            }
            return(true);
        }
예제 #21
0
    private void processPoint(Point2D point)
    {
        badTriangles.Clear();
        foreach (Triangle2D tri in triangles)
        {
            if (tri.HasPoint(point))
            {
                // Don't need to process this triangle further
                return;
            }
            if (tri.CircumcircleContains(point))
            {
                badTriangles.Add(tri);
            }
        }

        polygon.Clear();
        foreach (Triangle2D tri in badTriangles)
        {
            if (!triangles.Remove(tri))
            {
                Debug.Log("Didn't remove triangle!: " + tri);
            }

            Edge2D ab = new Edge2D(tri.a, tri.b);
            if (polygon.ContainsKey(ab))
            {
                polygon[ab] = 2;
            }
            else
            {
                polygon[ab] = 1;
            }

            Edge2D bc = new Edge2D(tri.b, tri.c);
            if (polygon.ContainsKey(bc))
            {
                polygon[bc] = 2;
            }
            else
            {
                polygon[bc] = 1;
            }

            Edge2D ca = new Edge2D(tri.c, tri.a);
            if (polygon.ContainsKey(ca))
            {
                polygon[ca] = 2;
            }
            else
            {
                polygon[ca] = 1;
            }
        }

        foreach (KeyValuePair <Edge2D, int> edge in polygon)
        {
            if (edge.Value == 1)
            {
                Triangle2D tri = new Triangle2D(edge.Key.a, edge.Key.b, point);
                triangles.Add(tri);
            }
        }
    }
예제 #22
0
            private static IEnumerable<Tuple<Point, Point>> MergeIslandSprtSegmentsSprtDivide_OLD(int polyCntr, Edge2D edge, EdgeIntersection[] intersections)
            {
                // Build vectors from edge.p0 to each intersection, sort by length
                var distances = Enumerable.Range(0, intersections.Length).
                    Select(o => new { Index = o, Distance = (intersections[o].IntersectionPoint - edge.Point0).LengthSquared }).
                    OrderBy(o => o.Distance).
                    ToArray();

                List<Tuple<Point, Point>> retVal = new List<Tuple<Point, Point>>();

                // Point0 to first intersect
                retVal.Add(Tuple.Create(
                    edge.Point0,
                    intersections[distances[0].Index].IntersectionPoint));

                // Intersect to Intersect
                for (int cntr = 0; cntr < distances.Length - 1; cntr++)
                {
                    retVal.Add(Tuple.Create(
                        intersections[distances[cntr].Index].IntersectionPoint,
                        intersections[distances[cntr + 1].Index].IntersectionPoint));
                }

                // Last intersect to Point1
                retVal.Add(Tuple.Create(
                    intersections[distances[distances.Length - 1].Index].IntersectionPoint,
                    edge.Point1Ext));

                return retVal;
            }
예제 #23
0
        public bool DragArc(uint eId, OpenTK.Vector2d vec)
        {
            if (!IsElementId(CadElementType.Edge, eId))
            {
                return(false);
            }
            if (GetEdgeCurveType(eId) != CurveType.CurveArc)
            {
                return(true);
            }

            bool   oldIsLeftSide;
            double oldDist;
            {
                Edge2D e = GetEdge(eId);
                e.GetCurveArc(out oldIsLeftSide, out oldDist);
            }

            Edge2D edge = GetEdge(eId);

            System.Diagnostics.Debug.Assert(edge.CurveType == CurveType.CurveArc);
            {
                OpenTK.Vector2d sPt     = edge.GetVertex(true);
                OpenTK.Vector2d ePt     = edge.GetVertex(false);
                double          edgeLen = Math.Sqrt(CadUtils.SquareLength(sPt, ePt));
                if (Math.Abs(CadUtils.TriHeight(vec, sPt, ePt)) > edgeLen * 0.02)
                {
                    OpenTK.Vector2d cPt;
                    bool            ret = CadUtils.CenterCircumcircle(sPt, ePt, vec, out cPt);
                    System.Diagnostics.Debug.Assert(ret);
                    double dist      = CadUtils.TriHeight(cPt, sPt, ePt);
                    double distRatio = dist / edgeLen;
                    edge.SetCurveArc(CadUtils.TriArea(sPt, ePt, vec) > 0, distRatio);
                }
                else
                {
                    return(true);
                }
            }

            HashSet <uint> setLId = new HashSet <uint>();

            for (VertexEdgeItr vItr = this.BRep.GetVertexEdgeItr(edge.GetVertexId(true)); !vItr.IsEnd(); vItr++)
            {
                uint tmpLId = vItr.GetLoopId();
                if (!setLId.Contains(tmpLId))
                {
                    setLId.Add(tmpLId);
                }
            }
            for (VertexEdgeItr vItr = this.BRep.GetVertexEdgeItr(edge.GetVertexId(false)); !vItr.IsEnd(); vItr++)
            {
                uint tmpLId = vItr.GetLoopId();
                if (!setLId.Contains(tmpLId))
                {
                    setLId.Add(tmpLId);
                }
            }

            foreach (uint lId in setLId)
            {
                if (!this.BRep.IsElementId(CadElementType.Loop, lId))
                {
                    continue;
                }
                if (CheckLoop(lId) != 0)
                {
                    // fail
                    edge.SetCurveArc(oldIsLeftSide, oldDist);
                    return(true);
                }
            }
            return(true);
        }