// Partition. return partition_info, a new node R and a list of // MBRs in S internal virtual Partition_info partition(node N, int fillfactor) { Partition_info result; Cut_info xsweep, ysweep; Cut_info select; CELL tmp, cur, cur_cell; result = new Partition_info(); result.R.parent = N.parent; if (N.getlength() <= fillfactor) { result.R.head = N.head; return result; } xsweep = N.sweep('x', fillfactor); ysweep = N.sweep('y', fillfactor); cur = new CELL(); select = new Cut_info(); if (xsweep.cost == - 1 && ysweep.cost == - 1) { System.Console.Out.WriteLine("ERROR : Cannot Split node!!"); System.Environment.Exit(1); } else if (xsweep.cost == - 1 || (xsweep.cost > ysweep.cost && ysweep.cost != - 1)) { select = ysweep; result.xy = 'y'; } else { select = xsweep; result.xy = 'x'; } // create the new node R cur = select.S1.head; while (cur != null) { cur_cell = new CELL(cur.current); // find the child node tmp = N.head; if (tmp != null) { while (tmp.current.mbr.low[0] != cur_cell.current.mbr.low[0] || tmp.current.mbr.low[1] != cur_cell.current.mbr.low[1] || tmp.current.mbr.high[0] != cur_cell.current.mbr.high[0] || tmp.current.mbr.high[1] != cur_cell.current.mbr.high[1]) { tmp = tmp.next; } cur_cell.child = tmp.child; cur_cell.current = tmp.current; // insert into the node if (result.R.head != null) { result.R.head.prev = cur_cell; cur_cell.next = result.R.head; } result.R.head = cur_cell; } cur = cur.next; } // create the list S cur = select.S2.head; while (cur != null) { cur_cell = new CELL(cur.current); cur_cell.child = cur.child; result.S.insertList(cur_cell); cur = cur.next; } if (result.xy == 'x') { result.xcut = select.cut; } else if (result.xy == 'y') { result.ycut = select.cut; } return result; }