public List <int[]> plotOneTrace(GridPoint[] trace, String bidirection) { //因为点最多5个,变成线段也最多10个 //GridPoint[] trace = new GridPoint[20]; //判断是否是拐点并记录下来 GridPoint[] line = new GridPoint[20]; line = trace; //int n = 0; //int[][] lineTxt = new int[line.Length / 2][]; List <int[]> lineLong = new List <int[]>(); //for (int i = 0; i < line.Length / 2; i++) //{ // lineTxt[i] = new int[5]; //} //line[0] = trace[0]; //n++; //for (int m = 1; m < trace.Length; m++) //{ // if (!(trace[m] == null)) // { // if (trace[m + 1] == null) // { // line[n] = trace[m]; // n++; // break; // } // bool k0 = (trace[m - 1].getPosx() == trace[m].getPosx()) // && (trace[m + 1].getPosx() == trace[m].getPosx()); // bool k1 = (trace[m - 1].getPosy() == trace[m].getPosy()) // && (trace[m + 1].getPosy() == trace[m].getPosy()); // if (k0 || k1) // { // continue; // } // else // { // line[n] = trace[m]; // n++; // } // } //} //////////////////////////////对于第一条线段和最后一条线段需要标明有没有箭头, if (line[2] == null) { if (int.Parse(bidirection) == 1) { int[] lineOne = new int[5]; lineOne[0] = line[0].getPosx(); lineOne[1] = line[0].getPosy(); lineOne[2] = line[0 + 1].getPosx(); lineOne[3] = line[0 + 1].getPosy(); lineOne[4] = 3; //双向 lineLong.Add(lineOne); } else { int[] lineOne = new int[5]; lineOne[0] = line[0].getPosx(); lineOne[1] = line[0].getPosy(); lineOne[2] = line[0 + 1].getPosx(); lineOne[3] = line[0 + 1].getPosy(); lineOne[4] = GetDirectionInfo(lineOne[0], lineOne[1], lineOne[2], lineOne[3], 0);//终止点有箭头 lineLong.Add(lineOne); } } else { if (int.Parse(bidirection) == 1) { int[] lineOne = new int[5]; lineOne[0] = line[0].getPosx(); lineOne[1] = line[0].getPosy(); lineOne[2] = line[0 + 1].getPosx(); lineOne[3] = line[0 + 1].getPosy(); lineOne[4] = GetDirectionInfo(lineOne[0], lineOne[1], lineOne[2], lineOne[3], 1);//起始点有箭头 lineLong.Add(lineOne); } else { int[] lineOne = new int[5]; lineOne[0] = line[0].getPosx(); lineOne[1] = line[0].getPosy(); lineOne[2] = line[0 + 1].getPosx(); lineOne[3] = line[0 + 1].getPosy(); lineOne[4] = 0; lineLong.Add(lineOne); } int index = 0; for (int i = 1; i < line.Length - 1; i++) { if (!(line[i + 2] == null)) { int[] lineOne = new int[5]; lineOne[0] = line[i].getPosx(); lineOne[1] = line[i].getPosy(); lineOne[2] = line[i + 1].getPosx(); lineOne[3] = line[i + 1].getPosy(); lineOne[4] = 0; lineLong.Add(lineOne); } else { index = i; break; } } int[] lineOneIndex = new int[5]; lineOneIndex[0] = line[index].getPosx(); lineOneIndex[1] = line[index].getPosy(); lineOneIndex[2] = line[index + 1].getPosx(); lineOneIndex[3] = line[index + 1].getPosy(); lineOneIndex[4] = GetDirectionInfo(lineOneIndex[0], lineOneIndex[1], lineOneIndex[2], lineOneIndex[3], 0);//终止点有箭头 lineLong.Add(lineOneIndex); } return(lineLong); }
public void setRouteForModules(ModuleOne[] modules, List <RelationOperator.relation> relation, int[] rows, int[] columns, List <ModuleOne.LineInfo> allLine) { ModuleOne.gapy = ModuleOne.mody - ModuleOne.getHeight(); ModuleOne.gapx = ModuleOne.modx - ModuleOne.getWidth(); int[] step_column = new int[columns.Length]; //记录每个区域的划分间隔 int[] step_row = new int[rows.Length]; int[] r = new int[rows.Length]; //记录每个区域已被划分的线的数量 int[] c = new int[columns.Length]; for (int m = 0; m < rows.Length; m++) { step_column[m] = ModuleOne.gapy / (rows[m] + 1); step_row[m] = ModuleOne.gapx / (columns[m] + 1); } step_column[0] = ModuleOne.gapy / (2 * rows[0] + 1); //最上面区域的划分间隔适当减小 step_row[columns.Length - 1] = ModuleOne.gapx / (2 * columns[columns.Length - 1] + 1); //最右边区域的划分间隔减小 GridPoint start = null; GridPoint target = null; foreach (RelationOperator.relation relationOne in relation) { ModuleOne moduleSource = modules[ModuleOne.GetIndex(modules, relationOne.sourceName)]; ModuleOne moduleTarget = modules[ModuleOne.GetIndex(modules, relationOne.targetName)]; string bidirection = relationOne.bidirection; string relationName = relationOne.relationName; string comment = relationOne.comment; int show = relationOne.show; int com = moduleSource.compareModuleAdd(moduleTarget); int numMax = 0; //记录上下或左右有直连关系时,模块的引脚数量的最大值 //根据模块的位置关系分配引脚 switch (com) { case 1: numMax = Math.Max(moduleSource.getNumNorth(), moduleTarget.getNumSouth()); start = moduleSource.northPin(GridPoint.myGrid, com, numMax); target = moduleTarget.southPin(GridPoint.myGrid, com, numMax); break; case 2: case 8: start = moduleSource.northPin(GridPoint.myGrid, com, numMax); target = moduleTarget.southPin(GridPoint.myGrid, com, numMax); break; case 3: numMax = Math.Max(moduleSource.getNumEast(), moduleTarget.getNumWest()); start = moduleSource.eastPin(GridPoint.myGrid, com, numMax); target = moduleTarget.westPin(GridPoint.myGrid, com, numMax); break; case 11: case 13: start = moduleSource.eastPin(GridPoint.myGrid, com, numMax); target = moduleTarget.westPin(GridPoint.myGrid, com, numMax); break; case 5: numMax = Math.Max(moduleSource.getNumSouth(), moduleTarget.getNumNorth()); start = moduleSource.southPin(GridPoint.myGrid, com, numMax); target = moduleTarget.northPin(GridPoint.myGrid, com, numMax); break; case 6: case 4: start = moduleSource.southPin(GridPoint.myGrid, com, numMax); target = moduleTarget.northPin(GridPoint.myGrid, com, numMax); break; case 7: numMax = Math.Max(moduleSource.getNumWest(), moduleTarget.getNumEast()); start = moduleSource.westPin(GridPoint.myGrid, com, numMax); target = moduleTarget.eastPin(GridPoint.myGrid, com, numMax); break; case 9: case 15: start = moduleSource.westPin(GridPoint.myGrid, com, numMax); target = moduleTarget.eastPin(GridPoint.myGrid, com, numMax); break; case 10: case 14: start = moduleSource.eastPin(GridPoint.myGrid, com, numMax); target = moduleTarget.eastPin(GridPoint.myGrid, com, numMax); break; case 12: case 16: start = moduleSource.northPin(GridPoint.myGrid, com, numMax); target = moduleTarget.northPin(GridPoint.myGrid, com, numMax); break; case 17: start = moduleSource.northPin(GridPoint.myGrid, com, numMax); target = moduleTarget.eastPin(GridPoint.myGrid, com, numMax); break; case 18: start = moduleSource.northPin(GridPoint.myGrid, com, numMax); target = moduleTarget.westPin(GridPoint.myGrid, com, numMax); break; case 19: start = moduleSource.southPin(GridPoint.myGrid, com, numMax); target = moduleTarget.westPin(GridPoint.myGrid, com, numMax); break; case 20: start = moduleSource.southPin(GridPoint.myGrid, com, numMax); target = moduleTarget.eastPin(GridPoint.myGrid, com, numMax); break; default: Console.WriteLine("no left pin"); break; } List <int[]> lineOnePath = Route(start, target, com, rows, columns, r, c, step_row, step_column, moduleSource, moduleTarget, bidirection); saveLine(lineOnePath, allLine, relationName, comment, show); } }
public List <int[]> Route(GridPoint start, GridPoint target, int com, int[] rows, int[] columns, int[] r, int[] c, int[] step_row, int[] step_column, ModuleOne mi, ModuleOne mj, string bidirection) {//返回一条路径所对应的线段 //if (start == null || target == null) // return -1; GridPoint[] trace = new GridPoint[6]; //记录一条路径的拐点,根据已有的布线算法,拐点最多3个,点有5个,最后的记录为null int x = 0; //根据模块的位置求出模块所属区域 int y = 0; int delta_x = 0; int delta_y = 0; List <int[]> line = new List <int[]>(); if (start == target) { Console.WriteLine("start and target are the same!"); } else { trace[0] = start; switch (com) { case 1: case 3: case 5: case 7: trace[1] = target; break; case 2: case 8: y = start.getPosy() / ModuleOne.mody; trace[1] = start.northStepVertex(r[y], step_column[y]); r[y] += 1; delta_x = target.getPosx() - start.getPosx(); trace[2] = trace[1].horizontalStepVertex(delta_x); trace[3] = target; break; case 4: case 6: y = start.getPosy() / ModuleOne.mody + 1; trace[1] = start.southStepVertex(r[y], step_column[y]); r[y] += 1; delta_x = target.getPosx() - start.getPosx(); trace[2] = trace[1].horizontalStepVertex(delta_x); trace[3] = target; break; case 9: case 15: x = start.getPosx() / ModuleOne.modx - 1; trace[1] = trace[0].westStepVertex(c[x], step_row[x]); c[x] += 1; delta_y = target.getPosy() - start.getPosy(); trace[2] = trace[1].verticalStepVertex(delta_y); trace[3] = target; break; case 10: case 14: x = start.getPosx() / ModuleOne.modx; trace[1] = start.eastStepVertex(c[x], step_row[x]); c[x] += 1; delta_y = target.getPosy() - start.getPosy(); trace[2] = trace[1].verticalStepVertex(delta_y); trace[3] = target; break; case 12: case 16: y = start.getPosy() / ModuleOne.mody; trace[1] = start.northStepVertex(r[y], step_column[y]); r[y] += 1; delta_x = target.getPosx() - start.getPosx(); trace[2] = trace[1].horizontalStepVertex(delta_x); trace[3] = target; break; case 13: case 11: x = start.getPosx() / ModuleOne.modx; trace[1] = trace[0].eastStepVertex(c[x], step_row[x]); c[x] += 1; delta_y = target.getPosy() - start.getPosy(); trace[2] = trace[1].verticalStepVertex(delta_y); trace[3] = target; break; case 17: y = start.getPosy() / ModuleOne.mody; trace[1] = start.northStepVertex(r[y], step_column[y]); r[y] += 1; trace[4] = target; x = target.getPosx() / ModuleOne.modx; trace[3] = trace[4].eastStepVertex(c[x], step_row[x]); c[x] += 1; delta_y = trace[1].getPosy() - trace[3].getPosy(); trace[2] = trace[3].verticalStepVertex(delta_y); break; case 18: y = start.getPosy() / ModuleOne.mody; trace[1] = start.northStepVertex(r[y], step_column[y]); r[y] += 1; trace[4] = target; x = target.getPosx() / ModuleOne.modx - 1; trace[3] = trace[4].westStepVertex(c[x], step_row[x]); c[x] += 1; delta_y = trace[1].getPosy() - trace[3].getPosy(); trace[2] = trace[3].verticalStepVertex(delta_y); break; case 19: y = start.getPosy() / ModuleOne.mody + 1; trace[1] = start.southStepVertex(r[y], step_column[y]); r[y] += 1; trace[4] = target; x = target.getPosx() / ModuleOne.modx - 1; trace[3] = trace[4].westStepVertex(c[x], step_row[x]); c[x] += 1; delta_y = trace[1].getPosy() - trace[3].getPosy(); trace[2] = trace[3].verticalStepVertex(delta_y); break; case 20: y = start.getPosy() / ModuleOne.mody + 1; trace[1] = start.southStepVertex(r[y], step_column[y]); r[y] += 1; trace[4] = target; x = target.getPosx() / ModuleOne.modx; trace[3] = trace[4].eastStepVertex(c[x], step_row[x]); c[x] += 1; delta_y = trace[1].getPosy() - trace[3].getPosy(); trace[2] = trace[3].verticalStepVertex(delta_y); break; default: break; } //需要传入是否双向 line = plotOneTrace(trace, bidirection); } return(line); }