private void SetNodeTypeRec(DendriteNode node, DendriteNode parent) { //連結しているノードの数でノードのタイプを判定 if (node.GetConnectedNodeNum() == 1) // 他の一つのクラスターにしか繋がっていないクラスターはEdgeクラスターである { node.NodeType = DendriteNodeType.EDGE; edge++; } else if (node.GetConnectedNodeNum() >= 3) // 他の3つのクラスターに繋がっているクラスターはBranchクラスターである { node.NodeType = DendriteNodeType.BRANCH; branch++; } else { node.NodeType = DendriteNodeType.CONNECT; // 他の2つのクラスターに繋がっているクラスターはEdgeクラスターでもBranchクラスターでもない } foreach (var child in node.ConnectedNodes) { if (child != parent) { SetNodeTypeRec(child, node); } } }
private bool ShavingNodeChecker(DendriteNode node, DendriteNode parent, int level) { if (level > 0) { if (node.NodeType == DendriteNodeType.EDGE && node != root) { // 端点が見つかればそこからノードを削除 // ConnectedNodes[0]はnodeのparent??? ← その通り // 基本的にはそうだが、補間によって接続されると、そうとも限らないかもしれない // ChangeRootNodeしたときにうまく動いているかもしれないけど ShavingRec(node.ConnectedNodes[0], node); return(true); } else if (node.NodeType == DendriteNodeType.CONNECT) { // 通過点の場合 探索続行 // foreachを使うと動かない (ShavingRecの中でConnectedNodesが削除されるから // // removeされたものが1つでもあったらi--しないといけないかも?? for (int i = 0; i < node.GetConnectedNodeNum(); i++) { var next = node.ConnectedNodes[i]; if (next != parent) { if (ShavingNodeChecker(next, node, level - 1)) { i--; } } } } } return(false); }
//径の平滑化 private static void SmoothRadius(DendriteNode node, DendriteNode parent) { node.tmpr = node.Radius + node.ConnectedNodes.Sum(cobj => cobj.Radius); int count = node.GetConnectedNodeNum() + 1; node.tmpr /= count; foreach (var next in node.ConnectedNodes) { if (next != parent) { SmoothRadius(next, node); } } }
//重心座標の平滑化 private static void SmoothGravityLine(DendriteNode node, DendriteNode parent) { //接続ノードの重心座標の平均をとる node.tmpx = node.gx + node.ConnectedNodes.Sum(cobj => cobj.gx); node.tmpy = node.gy + node.ConnectedNodes.Sum(cobj => cobj.gy); node.tmpz = node.gz + node.ConnectedNodes.Sum(cobj => cobj.gz); int count = node.GetConnectedNodeNum() + 1; node.tmpx /= count; node.tmpy /= count; node.tmpz /= count; /* * else if(node.nodetype == DendriteNodeType.BRANCH) * { * for(int i=0;i<node.GetConnectedNodeNum();i++) * { * if(node.cnodes[i] != parent) * { * double tx,ty,tz; * * tx = parent.gx+node.gx+node.cnodes[i].gx; * ty = parent.gy+node.gy+node.cnodes[i].gy; * tz = parent.gz+node.gz+node.cnodes[i].gz; * * node.gx = tx/3.0; * node.gy = ty/3.0; * node.gz = tz/3.0; * } * } * } */ //node.CalcRadius0(resox,resoz); //node.CalcRadius(this.volunit); foreach (var next in node.ConnectedNodes) { if (next != parent) { SmoothGravityLine(next, node); } } }
//重心座標の平滑化 private static void SmoothGravityLine(DendriteNode node, DendriteNode parent) { //接続ノードの重心座標の平均をとる node.tmpx = node.gx + node.ConnectedNodes.Sum(cobj => cobj.gx); node.tmpy = node.gy + node.ConnectedNodes.Sum(cobj => cobj.gy); node.tmpz = node.gz + node.ConnectedNodes.Sum(cobj => cobj.gz); int count = node.GetConnectedNodeNum() + 1; node.tmpx /= count; node.tmpy /= count; node.tmpz /= count; /* else if(node.nodetype == DendriteNodeType.BRANCH) { for(int i=0;i<node.GetConnectedNodeNum();i++) { if(node.cnodes[i] != parent) { double tx,ty,tz; tx = parent.gx+node.gx+node.cnodes[i].gx; ty = parent.gy+node.gy+node.cnodes[i].gy; tz = parent.gz+node.gz+node.cnodes[i].gz; node.gx = tx/3.0; node.gy = ty/3.0; node.gz = tz/3.0; } } } */ //node.CalcRadius0(resox,resoz); //node.CalcRadius(this.volunit); foreach (var next in node.ConnectedNodes) { if (next != parent) { SmoothGravityLine(next, node); } } }
private bool ShavingNodeChecker(DendriteNode node, DendriteNode parent, int level) { if (level > 0) { if (node.NodeType == DendriteNodeType.EDGE && node != root) { // 端点が見つかればそこからノードを削除 // ConnectedNodes[0]はnodeのparent??? ← その通り // 基本的にはそうだが、補間によって接続されると、そうとも限らないかもしれない // ChangeRootNodeしたときにうまく動いているかもしれないけど ShavingRec(node.ConnectedNodes[0], node); return true; } else if (node.NodeType == DendriteNodeType.CONNECT) { // 通過点の場合 探索続行 // foreachを使うと動かない (ShavingRecの中でConnectedNodesが削除されるから // // removeされたものが1つでもあったらi--しないといけないかも?? for (int i = 0; i < node.GetConnectedNodeNum(); i++) { var next = node.ConnectedNodes[i]; if (next != parent) { if (ShavingNodeChecker(next, node, level - 1)) { i--; } } } } } return false; }