package index.adjust; import index.entity.Point; import index.fit.Fit; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class Adjust { // public ArrayList fillSmall(ArrayList pointArrayList){ // // for (int i = 0 ; i < pointArrayList.size();i++){ // // Point point = pointArrayList.get() // // } // // } public ArrayList adjustShape(ArrayList initialShapeList,ArrayList changedShapeList,Integer adjustSize){ // Integer size = initialShapeList.size() - 1; Integer size = initialShapeList.size(); // System.out.println(size + "size"); ArrayList afterAdjustPointsList = new ArrayList<>(); Integer round = size / adjustSize; System.out.println(round + "round"); for (int i = 0; i < round ;i++){ Integer indexBegin = i * adjustSize; Integer indexEnd = indexBegin + adjustSize; Double avgDec = 0.0; // ArrayList pointArrayList = new ArrayList<>();//存放差值,借用arraylist for (int j = indexBegin;j < indexEnd; j++){ Point iniPoint = initialShapeList.get(j); Point chaPoint = changedShapeList.get(j); Point pointDis = new Point(); pointDis.setColY(chaPoint.getColY() - iniPoint.getColY()); pointDis.setColX(chaPoint.getColX()); pointArrayList.add(pointDis); avgDec = avgDec + chaPoint.getColY() - iniPoint.getColY(); System.out.println("差值" + (chaPoint.getColY() - iniPoint.getColY())); } // double[] param = fit.gaussFit(pointArrayList); //求高斯分布值 // Gaussian gaussian = new Gaussian(param[0],param[1],param[2]); // ArrayList dPoint = new ArrayList<>(); // for (int ii = 0 ; ii < pointArrayList.size();ii++){ // // Point point = pointArrayList.get(ii); // Double x = point.getColX(); // Double y = gaussian.value(x); // dPoint.add(y); // // } avgDec = avgDec / adjustSize; // System.out.println(avgDec + " avgdec"); for (int j = indexBegin ; j < indexEnd;j++){ // Point chaPoint = changedShapeList.get(j); Point intPoint = initialShapeList.get(j); Point adjustPoint = new Point(); adjustPoint.setColX(intPoint.getColX()); adjustPoint.setColY(intPoint.getColY() + avgDec); // adjustPoint.setColY(intPoint.getColY() + gaussian.value(intPoint.getColX())); // System.out.println(new Date()); afterAdjustPointsList.add(adjustPoint); } //后面扩充不整除的情况 } // afterAdjustPointsList.add(afterAdjustPointsList.get(0)); return afterAdjustPointsList; } //输入的list都已经处理过,是图形的一半 public ArrayList fillZero(ArrayList initialShapeList,ArrayList changedShapeList,Integer scale) { ArrayList diffValueList = new ArrayList<>(); ArrayList nonZeroDiffInfoMapList = new ArrayList<>(); for (int i = 0 ; i < changedShapeList.size();i++){ Point chaPoint = changedShapeList.get(i); Point iniPoint = initialShapeList.get(i); Double diff = chaPoint.getColY() - iniPoint.getColY(); diffValueList.add(diff); } for (int i = 0;i < diffValueList.size();i++){ Double diff = diffValueList.get(i); if (!isCloseToZero(diff)){ System.out.println("diff: " + diff + " iszero? " + isCloseToZero(diff)); Map nonZeroInfoMap = new HashMap(); nonZeroInfoMap.put("INDEX",i); nonZeroDiffInfoMapList.add(nonZeroInfoMap); } } //记录下需要填充的列的信息 if (nonZeroDiffInfoMapList.size() >=2){ for (int i = 0 ; i < nonZeroDiffInfoMapList.size() - 1; i++){ Map map1 = nonZeroDiffInfoMapList.get(i); Map map2 = nonZeroDiffInfoMapList.get(i+1); Integer index1 = (int)map1.get("INDEX"); Integer index2 = (int)map2.get("INDEX"); System.out.println("index1:" + index1); System.out.println("index2:" + index2); Double beginDiff = diffValueList.get(index1); Double endDiff = diffValueList.get(index2); Double gap = (endDiff - beginDiff) / (index2 - index1); if ((index2 - index1 <= scale) && ((index2 - index1) != 1)){ for (int j = index1 + 1; j < index2;j++){ diffValueList.set(j,beginDiff + (j - index1) * gap); } } } } ///// for (int i = 0 ; i < initialShapeList.size();i++){ Point point = new Point(); Point iniPoint = initialShapeList.get(i); point.setColX(iniPoint.getColX()); point.setColY(iniPoint.getColY() + diffValueList.get(i)); changedShapeList.set(i,point); } return changedShapeList; } //首尾相连的list public ArrayList fillArrayListPlus(ArrayList initialShapeList,ArrayList changedShapeList,Integer scale){ Fit fit = new Fit(); initialShapeList = removeLastPoint(initialShapeList); changedShapeList = removeLastPoint(changedShapeList); Integer listLength = initialShapeList.size(); ArrayList subInitialShapeList1 = fit.getSubArrayList(initialShapeList,0,listLength / 2); ArrayList subInitialShapeList2 = fit.getSubArrayList(initialShapeList,listLength / 2,listLength); ArrayList subChangedShapeList1 = fit.getSubArrayList(changedShapeList,0,listLength / 2); ArrayList subChangedShapeList2 = fit.getSubArrayList(changedShapeList,listLength / 2 ,listLength); ArrayList subChangedShapeList1New = fillZero(subInitialShapeList1,subChangedShapeList1,scale); ArrayList subChangedShapeList2New = fillZero(subInitialShapeList2,subChangedShapeList2,scale); ArrayList changedShapeListNew = new ArrayList<>(); changedShapeListNew.addAll(subChangedShapeList1New); changedShapeListNew.addAll(subChangedShapeList2New); changedShapeListNew.add(changedShapeListNew.get(0)); return changedShapeListNew; } // public ArrayList removeLastPoint(ArrayList pointArrayListForRemove){ ArrayList pointArrayListAfterRemove = new ArrayList<>(); for (int i = 0 ; i < pointArrayListForRemove.size() - 1;i++){ pointArrayListAfterRemove.add(pointArrayListForRemove.get(i)); } return pointArrayListAfterRemove; } public boolean isCloseToZero(Double diff){ if (Math.abs(diff) < 1){ return true; } else return false; } }