Exemplo n.º 1
0
        public override Vec Error(CMesh cm)
        {
            List <double> err = new List <double>();
            Vec           ans = new Vec(err);

            // 等長拘束をかける辺の数取得
            int n = equal_edge_ids.Count;

            // メッシュの TopologyEdges 取得
            MeshTopologyEdgeList topo_edge = cm.mesh.TopologyEdges;
            List <int>           edges_id  = cm.inner_boundary_edges;

            // 辺長一定拘束 On の時
            if (is_set_length)
            {
                for (int i = 0; i < n; i++)
                {
                    int    edge_id       = edges_id[equal_edge_ids[i]];
                    double edge_length_i = topo_edge.EdgeLine(edge_id).Length;
                    err.Add((edge_length_i * edge_length_i - edge_length * edge_length) / (2 * edge_avarage_length * edge_avarage_length));
                }
                ans = new Vec(err);
            }

            // 辺長一定拘束 Off の時
            else
            {
                // 等長拘束の誤差取得
                for (int i = 0; i < n - 1; i++)
                {
                    int edge_id_i  = edges_id[equal_edge_ids[i]];
                    int edge_id_i1 = edges_id[equal_edge_ids[i + 1]];

                    double edge_length_i  = topo_edge.EdgeLine(edge_id_i).Length;
                    double edge_length_i1 = topo_edge.EdgeLine(edge_id_i1).Length;
                    err.Add((edge_length_i * edge_length_i - edge_length_i1 * edge_length_i1) / (2 * edge_avarage_length * edge_avarage_length));
                }

                ans = new Vec(err);
            }


            return(ans);
        }
Exemplo n.º 2
0
        public Graph(Mesh mesh)
        {
            Vertices = mesh.Vertices.ToPoint3dArray().ToList();

            int numberOfCurves = mesh.TopologyEdges.Count * 2;

            Edges         = new Curve[numberOfCurves];
            EdgesWeights  = new double[numberOfCurves];
            GraphArray    = new int[2, numberOfCurves];
            AdjacencyList = new AdjacencyList(Vertices.Count);

            MeshTopologyEdgeList topologyEdgeList = mesh.TopologyEdges;

            int currentEdgeCount = 0;

            for (int i = 0; i < topologyEdgeList.Count; i++)
            {
                int firstVertexIndex  = topologyEdgeList.GetTopologyVertices(i).I;
                int secondVertexIndex = topologyEdgeList.GetTopologyVertices(i).J;

                double currentEdgeWeight = topologyEdgeList.EdgeLine(i).Length;

                Curve currentEdge = topologyEdgeList.EdgeLine(i).ToNurbsCurve();
                Edges[currentEdgeCount]         = currentEdge;
                EdgesWeights[currentEdgeCount]  = currentEdgeWeight;
                GraphArray[0, currentEdgeCount] = firstVertexIndex;
                GraphArray[1, currentEdgeCount] = secondVertexIndex;

                AdjacencyList.Vertices[firstVertexIndex].Add(secondVertexIndex);
                AdjacencyList.Edges[firstVertexIndex].Add(currentEdgeCount);
                currentEdgeCount += 1;

                Curve duplicateReversedEdge = currentEdge.DuplicateCurve();
                duplicateReversedEdge.Reverse();
                Edges[currentEdgeCount]         = duplicateReversedEdge;
                EdgesWeights[currentEdgeCount]  = currentEdgeWeight;
                GraphArray[0, currentEdgeCount] = secondVertexIndex;
                GraphArray[1, currentEdgeCount] = firstVertexIndex;

                AdjacencyList.Vertices[secondVertexIndex].Add(firstVertexIndex);
                AdjacencyList.Edges[secondVertexIndex].Add(currentEdgeCount);
                currentEdgeCount += 1;
            }
        }