123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- 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<Point> fillSmall(ArrayList<Point> pointArrayList){
- //
- // for (int i = 0 ; i < pointArrayList.size();i++){
- //
- // Point point = pointArrayList.get()
- //
- // }
- //
- // }
- public ArrayList<Point> adjustShape(ArrayList<Point> initialShapeList,ArrayList<Point> changedShapeList,Integer adjustSize){
- // Integer size = initialShapeList.size() - 1;
- Integer size = initialShapeList.size();
- //
- System.out.println(size + "size");
- ArrayList<Point> 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<Point> pointArrayList = new ArrayList<>();//存放差值,借用arraylist<point>
- 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<Double> 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<Point> fillZero(ArrayList<Point> initialShapeList,ArrayList<Point> changedShapeList,Integer scale) {
- ArrayList<Double> diffValueList = new ArrayList<>();
- ArrayList<Map> 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<Point> fillArrayListPlus(ArrayList<Point> initialShapeList,ArrayList<Point> changedShapeList,Integer scale){
- Fit fit = new Fit();
- initialShapeList = removeLastPoint(initialShapeList);
- changedShapeList = removeLastPoint(changedShapeList);
- Integer listLength = initialShapeList.size();
- ArrayList<Point> subInitialShapeList1 = fit.getSubArrayList(initialShapeList,0,listLength / 2);
- ArrayList<Point> subInitialShapeList2 = fit.getSubArrayList(initialShapeList,listLength / 2,listLength);
- ArrayList<Point> subChangedShapeList1 = fit.getSubArrayList(changedShapeList,0,listLength / 2);
- ArrayList<Point> subChangedShapeList2 = fit.getSubArrayList(changedShapeList,listLength / 2 ,listLength);
- ArrayList<Point> subChangedShapeList1New = fillZero(subInitialShapeList1,subChangedShapeList1,scale);
- ArrayList<Point> subChangedShapeList2New = fillZero(subInitialShapeList2,subChangedShapeList2,scale);
- ArrayList<Point> changedShapeListNew = new ArrayList<>();
- changedShapeListNew.addAll(subChangedShapeList1New);
- changedShapeListNew.addAll(subChangedShapeList2New);
- changedShapeListNew.add(changedShapeListNew.get(0));
- return changedShapeListNew;
- }
- //
- public ArrayList<Point> removeLastPoint(ArrayList<Point> pointArrayListForRemove){
- ArrayList<Point> 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;
- }
- }
|