Adjust.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package index.adjust;
  2. import index.entity.Point;
  3. import index.fit.Fit;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. public class Adjust {
  8. // public ArrayList<Point> fillSmall(ArrayList<Point> pointArrayList){
  9. //
  10. // for (int i = 0 ; i < pointArrayList.size();i++){
  11. //
  12. // Point point = pointArrayList.get()
  13. //
  14. // }
  15. //
  16. // }
  17. public ArrayList<Point> adjustShape(ArrayList<Point> initialShapeList,ArrayList<Point> changedShapeList,Integer adjustSize){
  18. // Integer size = initialShapeList.size() - 1;
  19. Integer size = initialShapeList.size();
  20. //
  21. System.out.println(size + "size");
  22. ArrayList<Point> afterAdjustPointsList = new ArrayList<>();
  23. Integer round = size / adjustSize;
  24. System.out.println(round + "round");
  25. for (int i = 0; i < round ;i++){
  26. Integer indexBegin = i * adjustSize;
  27. Integer indexEnd = indexBegin + adjustSize;
  28. Double avgDec = 0.0;
  29. //
  30. ArrayList<Point> pointArrayList = new ArrayList<>();//存放差值,借用arraylist<point>
  31. for (int j = indexBegin;j < indexEnd; j++){
  32. Point iniPoint = initialShapeList.get(j);
  33. Point chaPoint = changedShapeList.get(j);
  34. Point pointDis = new Point();
  35. pointDis.setColY(chaPoint.getColY() - iniPoint.getColY());
  36. pointDis.setColX(chaPoint.getColX());
  37. pointArrayList.add(pointDis);
  38. avgDec = avgDec + chaPoint.getColY() - iniPoint.getColY();
  39. System.out.println("差值" + (chaPoint.getColY() - iniPoint.getColY()));
  40. }
  41. // double[] param = fit.gaussFit(pointArrayList);
  42. //求高斯分布值
  43. // Gaussian gaussian = new Gaussian(param[0],param[1],param[2]);
  44. // ArrayList<Double> dPoint = new ArrayList<>();
  45. // for (int ii = 0 ; ii < pointArrayList.size();ii++){
  46. //
  47. // Point point = pointArrayList.get(ii);
  48. // Double x = point.getColX();
  49. // Double y = gaussian.value(x);
  50. // dPoint.add(y);
  51. //
  52. // }
  53. avgDec = avgDec / adjustSize;
  54. // System.out.println(avgDec + " avgdec");
  55. for (int j = indexBegin ; j < indexEnd;j++){
  56. // Point chaPoint = changedShapeList.get(j);
  57. Point intPoint = initialShapeList.get(j);
  58. Point adjustPoint = new Point();
  59. adjustPoint.setColX(intPoint.getColX());
  60. adjustPoint.setColY(intPoint.getColY() + avgDec);
  61. // adjustPoint.setColY(intPoint.getColY() + gaussian.value(intPoint.getColX()));
  62. // System.out.println(new Date());
  63. afterAdjustPointsList.add(adjustPoint);
  64. }
  65. //后面扩充不整除的情况
  66. }
  67. // afterAdjustPointsList.add(afterAdjustPointsList.get(0));
  68. return afterAdjustPointsList;
  69. }
  70. //输入的list都已经处理过,是图形的一半
  71. public ArrayList<Point> fillZero(ArrayList<Point> initialShapeList,ArrayList<Point> changedShapeList,Integer scale) {
  72. ArrayList<Double> diffValueList = new ArrayList<>();
  73. ArrayList<Map> nonZeroDiffInfoMapList = new ArrayList<>();
  74. for (int i = 0 ; i < changedShapeList.size();i++){
  75. Point chaPoint = changedShapeList.get(i);
  76. Point iniPoint = initialShapeList.get(i);
  77. Double diff = chaPoint.getColY() - iniPoint.getColY();
  78. diffValueList.add(diff);
  79. }
  80. for (int i = 0;i < diffValueList.size();i++){
  81. Double diff = diffValueList.get(i);
  82. if (!isCloseToZero(diff)){
  83. System.out.println("diff: " + diff + " iszero? " + isCloseToZero(diff));
  84. Map nonZeroInfoMap = new HashMap();
  85. nonZeroInfoMap.put("INDEX",i);
  86. nonZeroDiffInfoMapList.add(nonZeroInfoMap);
  87. }
  88. }
  89. //记录下需要填充的列的信息
  90. if (nonZeroDiffInfoMapList.size() >=2){
  91. for (int i = 0 ; i < nonZeroDiffInfoMapList.size() - 1; i++){
  92. Map map1 = nonZeroDiffInfoMapList.get(i);
  93. Map map2 = nonZeroDiffInfoMapList.get(i+1);
  94. Integer index1 = (int)map1.get("INDEX");
  95. Integer index2 = (int)map2.get("INDEX");
  96. System.out.println("index1:" + index1);
  97. System.out.println("index2:" + index2);
  98. Double beginDiff = diffValueList.get(index1);
  99. Double endDiff = diffValueList.get(index2);
  100. Double gap = (endDiff - beginDiff) / (index2 - index1);
  101. if ((index2 - index1 <= scale) && ((index2 - index1) != 1)){
  102. for (int j = index1 + 1; j < index2;j++){
  103. diffValueList.set(j,beginDiff + (j - index1) * gap);
  104. }
  105. }
  106. }
  107. }
  108. /////
  109. for (int i = 0 ; i < initialShapeList.size();i++){
  110. Point point = new Point();
  111. Point iniPoint = initialShapeList.get(i);
  112. point.setColX(iniPoint.getColX());
  113. point.setColY(iniPoint.getColY() + diffValueList.get(i));
  114. changedShapeList.set(i,point);
  115. }
  116. return changedShapeList;
  117. }
  118. //首尾相连的list
  119. public ArrayList<Point> fillArrayListPlus(ArrayList<Point> initialShapeList,ArrayList<Point> changedShapeList,Integer scale){
  120. Fit fit = new Fit();
  121. initialShapeList = removeLastPoint(initialShapeList);
  122. changedShapeList = removeLastPoint(changedShapeList);
  123. Integer listLength = initialShapeList.size();
  124. ArrayList<Point> subInitialShapeList1 = fit.getSubArrayList(initialShapeList,0,listLength / 2);
  125. ArrayList<Point> subInitialShapeList2 = fit.getSubArrayList(initialShapeList,listLength / 2,listLength);
  126. ArrayList<Point> subChangedShapeList1 = fit.getSubArrayList(changedShapeList,0,listLength / 2);
  127. ArrayList<Point> subChangedShapeList2 = fit.getSubArrayList(changedShapeList,listLength / 2 ,listLength);
  128. ArrayList<Point> subChangedShapeList1New = fillZero(subInitialShapeList1,subChangedShapeList1,scale);
  129. ArrayList<Point> subChangedShapeList2New = fillZero(subInitialShapeList2,subChangedShapeList2,scale);
  130. ArrayList<Point> changedShapeListNew = new ArrayList<>();
  131. changedShapeListNew.addAll(subChangedShapeList1New);
  132. changedShapeListNew.addAll(subChangedShapeList2New);
  133. changedShapeListNew.add(changedShapeListNew.get(0));
  134. return changedShapeListNew;
  135. }
  136. //
  137. public ArrayList<Point> removeLastPoint(ArrayList<Point> pointArrayListForRemove){
  138. ArrayList<Point> pointArrayListAfterRemove = new ArrayList<>();
  139. for (int i = 0 ; i < pointArrayListForRemove.size() - 1;i++){
  140. pointArrayListAfterRemove.add(pointArrayListForRemove.get(i));
  141. }
  142. return pointArrayListAfterRemove;
  143. }
  144. public boolean isCloseToZero(Double diff){
  145. if (Math.abs(diff) < 2){
  146. return true;
  147. }
  148. else return false;
  149. }
  150. }