Adjust.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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> adjustShape(ArrayList<Point> initialShapeList,ArrayList<Point> changedShapeList,Integer adjustSize){
  9. Integer size = initialShapeList.size();
  10. ArrayList<Point> afterAdjustPointsList = new ArrayList<>();
  11. Integer round = size / adjustSize;
  12. for (int i = 0; i < round ;i++){
  13. Integer indexBegin = i * adjustSize;
  14. Integer indexEnd = indexBegin + adjustSize;
  15. Double avgDec = 0.0;
  16. //
  17. ArrayList<Point> pointArrayList = new ArrayList<>();//存放差值,借用arraylist<point>
  18. for (int j = indexBegin;j < indexEnd; j++){
  19. Point iniPoint = initialShapeList.get(j);
  20. Point chaPoint = changedShapeList.get(j);
  21. Point pointDis = new Point();
  22. pointDis.setColY(chaPoint.getColY() - iniPoint.getColY());
  23. pointDis.setColX(chaPoint.getColX());
  24. pointArrayList.add(pointDis);
  25. avgDec = avgDec + chaPoint.getColY() - iniPoint.getColY();
  26. }
  27. avgDec = avgDec / adjustSize;
  28. for (int j = indexBegin ; j < indexEnd;j++){
  29. Point intPoint = initialShapeList.get(j);
  30. Point adjustPoint = new Point();
  31. adjustPoint.setColX(intPoint.getColX());
  32. adjustPoint.setColY(intPoint.getColY() + avgDec);
  33. afterAdjustPointsList.add(adjustPoint);
  34. }
  35. //后面扩充不整除的情况
  36. }
  37. return afterAdjustPointsList;
  38. }
  39. //输入的list都已经处理过,是图形的一半
  40. public ArrayList<Point> fillZero(ArrayList<Point> initialShapeList,ArrayList<Point> changedShapeList,Integer scale) {
  41. ArrayList<Double> diffValueList = new ArrayList<>();
  42. ArrayList<Map> nonZeroDiffInfoMapList = new ArrayList<>();
  43. for (int i = 0 ; i < changedShapeList.size();i++){
  44. Point chaPoint = changedShapeList.get(i);
  45. Point iniPoint = initialShapeList.get(i);
  46. Double diff = chaPoint.getColY() - iniPoint.getColY();
  47. diffValueList.add(diff);
  48. }
  49. for (int i = 0;i < diffValueList.size();i++){
  50. Double diff = diffValueList.get(i);
  51. if (!isCloseToZero(diff)){
  52. Map nonZeroInfoMap = new HashMap();
  53. nonZeroInfoMap.put("INDEX",i);
  54. nonZeroDiffInfoMapList.add(nonZeroInfoMap);
  55. }
  56. }
  57. //记录下需要填充的列的信息
  58. if (nonZeroDiffInfoMapList.size() >=2){
  59. for (int i = 0 ; i < nonZeroDiffInfoMapList.size() - 1; i++){
  60. Map map1 = nonZeroDiffInfoMapList.get(i);
  61. Map map2 = nonZeroDiffInfoMapList.get(i+1);
  62. Integer index1 = (int)map1.get("INDEX");
  63. Integer index2 = (int)map2.get("INDEX");
  64. Double beginDiff = diffValueList.get(index1);
  65. Double endDiff = diffValueList.get(index2);
  66. Double gap = (endDiff - beginDiff) / (index2 - index1);
  67. if ((index2 - index1 <= scale) && ((index2 - index1) != 1)){
  68. for (int j = index1 + 1; j < index2;j++){
  69. diffValueList.set(j,beginDiff + (j - index1) * gap);
  70. }
  71. }
  72. }
  73. }
  74. for (int i = 0 ; i < initialShapeList.size();i++){
  75. Point point = new Point();
  76. Point iniPoint = initialShapeList.get(i);
  77. point.setColX(iniPoint.getColX());
  78. point.setColY(iniPoint.getColY() + diffValueList.get(i));
  79. changedShapeList.set(i,point);
  80. }
  81. return changedShapeList;
  82. }
  83. //首尾相连的list
  84. public ArrayList<Point> fillArrayListPlus(ArrayList<Point> initialShapeList,ArrayList<Point> changedShapeList,Integer scale){
  85. Fit fit = new Fit();
  86. initialShapeList = removeLastPoint(initialShapeList);
  87. changedShapeList = removeLastPoint(changedShapeList);
  88. Integer listLength = initialShapeList.size();
  89. ArrayList<Point> subInitialShapeList1 = fit.getSubArrayList(initialShapeList,0,listLength / 2);
  90. ArrayList<Point> subInitialShapeList2 = fit.getSubArrayList(initialShapeList,listLength / 2,listLength);
  91. ArrayList<Point> subChangedShapeList1 = fit.getSubArrayList(changedShapeList,0,listLength / 2);
  92. ArrayList<Point> subChangedShapeList2 = fit.getSubArrayList(changedShapeList,listLength / 2 ,listLength);
  93. ArrayList<Point> subChangedShapeList1New = fillZero(subInitialShapeList1,subChangedShapeList1,scale);
  94. ArrayList<Point> subChangedShapeList2New = fillZero(subInitialShapeList2,subChangedShapeList2,scale);
  95. ArrayList<Point> changedShapeListNew = new ArrayList<>();
  96. changedShapeListNew.addAll(subChangedShapeList1New);
  97. changedShapeListNew.addAll(subChangedShapeList2New);
  98. changedShapeListNew.add(changedShapeListNew.get(0));
  99. return changedShapeListNew;
  100. }
  101. //
  102. public ArrayList<Point> removeLastPoint(ArrayList<Point> pointArrayListForRemove){
  103. ArrayList<Point> pointArrayListAfterRemove = new ArrayList<>();
  104. for (int i = 0 ; i < pointArrayListForRemove.size() - 1;i++){
  105. pointArrayListAfterRemove.add(pointArrayListForRemove.get(i));
  106. }
  107. return pointArrayListAfterRemove;
  108. }
  109. public boolean isCloseToZero(Double diff){
  110. if (Math.abs(diff) < 2){
  111. return true;
  112. }
  113. else return false;
  114. }
  115. }