Jelajahi Sumber

Calculate area final.

TomNuHt 5 tahun lalu
induk
melakukan
cd6f677fe4
2 mengubah file dengan 108 tambahan dan 34 penghapusan
  1. 100 29
      src/CalculateArea.java
  2. 8 5
      src/TestMeanShift.java

+ 100 - 29
src/CalculateArea.java

@@ -1,14 +1,16 @@
+import java.io.FileNotFoundException;
+import java.io.PrintWriter;
 import java.util.ArrayList;
 
 public class CalculateArea {
-    ArrayList<Double> Pointx_input;
-    ArrayList<Double> Pointy_input;
+    ArrayList<Double> Pointx_input = new ArrayList<>();
+    ArrayList<Double> Pointy_input = new ArrayList<>();
 
     ArrayList<Double> Pointx_input_initial;
     ArrayList<Double> Pointy_input_initial;
 
-    ArrayList<Double> Row_input;
-    ArrayList<Double> Theta_input;
+    ArrayList<Double> Row_input = new ArrayList<>();
+    ArrayList<Double> Theta_input = new ArrayList<>();
     ArrayList<Double> centerx_history;
     ArrayList<Double> centery_history;
     ArrayList<DataType<Double>> Result_Row = new ArrayList<>();
@@ -19,6 +21,7 @@ public class CalculateArea {
     double SplitTheta;
     double SplitRadiusWidth;
     double IncreasingRate;
+    double Area = 0.0 ;
 
 
     public CalculateArea(ArrayList<Double> Pointx_input,ArrayList<Double> Pointy_input,ArrayList<Double> centerx_history,ArrayList<Double> centery_history){
@@ -46,16 +49,6 @@ public class CalculateArea {
         this.IncreasingRate = IncreasingRate;
     }
 
-    public void DktoPolar(){
-        for(int i = 0 ;i < Pointx_input.size();i++){
-            double Theta = 0;
-            Double R = Math.sqrt(Math.pow(Pointx_input.get(i),2) + Math.pow(Pointy_input.get(i),2));
-            Theta = CalculateTheta(Pointx_input.get(i),Pointy_input.get(i),R);
-            Row_input.add(R);
-            Theta_input.add(Theta);
-        }
-    }
-
     public double CalculateTheta(Double x ,Double y ,Double row){
         double Theta = 0;
         if( y > 0 ){
@@ -68,11 +61,14 @@ public class CalculateArea {
     }
 
     public Integer Compare(double R){
+
         double Max = 0 ;
         int IndexofMax = 0;
         for(int i = 0 ; i < centerx_history.size(); i++ ){
+            System.out.println("FindPointinsideR(centerx_history.get(i),centery_history.get(i),R): " + FindPointinsideR(centerx_history.get(i),centery_history.get(i),R));
+            System.out.println("第 " + i + " 个历史圆");
             if(FindPointinsideR(centerx_history.get(i),centery_history.get(i),R) > Max){
-//                Max = FindPointinsideR(centerx_history.get(i),centery_history.get(i),R);
+                Max = FindPointinsideR(centerx_history.get(i),centery_history.get(i),R);
                 IndexofMax = i;
             }
         }
@@ -82,8 +78,11 @@ public class CalculateArea {
     public void configFinalCircle(){
         int IndexofMax;
         IndexofMax = Compare(RusedforMeanShift);
+        System.out.println("IndexofMax" + IndexofMax);
         FinalCenterX = centerx_history.get(IndexofMax);
         FinalCenterY = centery_history.get(IndexofMax);
+        System.out.println("FinalCenterX " + FinalCenterX);
+        System.out.println("FinalCenterY " + FinalCenterY);
     }
 
     public double FindPointinsideR(double centerx,double centery,double R){
@@ -101,66 +100,138 @@ public class CalculateArea {
     }
 
     public void exchange(){
+        for (int i = 0 ; i < Pointx_input_initial.size();i++ ){
+//            System.out.println("Pointx_input_initial "+Pointx_input_initial);
+            Pointx_input.add(Pointx_input_initial.get(i) - FinalCenterX);
+            Pointy_input.add(Pointy_input_initial.get(i) - FinalCenterY);
+        }
+    }
 
+    public void DktoPolar() throws FileNotFoundException {
+        java.io.File file4 = new java.io.File("C:\\Users\\87969\\Desktop\\test\\DktoPolarTest.txt");
+        PrintWriter Result_OutPut = new PrintWriter(file4);
+        for(int i = 0 ;i < Pointx_input.size();i++){
+            double Theta = 0;
+            Double R = Math.sqrt(Math.pow(Pointx_input.get(i),2) + Math.pow(Pointy_input.get(i),2));
+            Theta = CalculateTheta(Pointx_input.get(i),Pointy_input.get(i),R);
+            Result_OutPut.println("//////////////DktoPolarDktoPolarDktoPolar");
+            Result_OutPut.println("DktoPolarTest:R " + R);
+            Result_OutPut.println("DktoPolarTest:Theta" + Theta);
+            Result_OutPut.println("DktoPolarTest:Pointx_input.get(i) " + Pointx_input.get(i));
+            Result_OutPut.println("DktoPolarTest:Pointy_input.get(i) " + Pointy_input.get(i));
+            Result_OutPut.println("/////////////DktoPolarDktoPolarDktoPolar");
+            Row_input.add(R);
+            Theta_input.add(Theta);
+        }
+        Result_OutPut.close();
     }
 
-    public void LoopforCalculateArea(){
+    public void LoopforCalculateArea() throws FileNotFoundException {
         ArrayList<Double> Row_input_forcal = new ArrayList<>(Row_input);
         ArrayList<Double> Theta_input_forcal = new ArrayList<>(Theta_input);
         ArrayList<Double> AngleArrangeList = new ArrayList<>();
-
+        java.io.File file4 = new java.io.File("C:\\Users\\87969\\Desktop\\test\\meanshiftAreaSectorR.txt");
+        PrintWriter Result_OutPu2 = new PrintWriter(file4);
+//        System.out.println("Row_input " + Row_input);
+//        System.out.println("Theta_input" + Theta_input);
+//        System.out.println("Row_input_forcal" + Row_input_forcal);
+//        System.out.println("Theta_input_forcal" + Theta_input_forcal);
         for(int i = 0 ; i < 2 * Math.PI / SplitTheta ;i++){
             AngleArrangeList.add(SplitTheta * i);
         }
 
         for (int i = 0 ; i < AngleArrangeList.size() ; i++){
+            System.out.println("第 " + i + " 次外部循环");
             ArrayList<Double> Row_input_temp = new ArrayList<>();
             ArrayList<Double> Theta_input_temp = new ArrayList<>();
-            for(int j = 0 ; j < Theta_input_forcal.get(i) ; j++){
-                if(Theta_input_forcal.get(i) > AngleArrangeList.get(i) && Theta_input_forcal.get(i) < (AngleArrangeList.get(i) + SplitTheta )){
-                    Row_input_temp.add(Row_input_forcal.get(i));
-                    Theta_input_temp.add(Theta_input_forcal.get(i));
+//            System.out.println("AngleArrangeList.get(i) " + AngleArrangeList.get(i));
+//            System.out.println("!!!!!!!!!!!!Theta_input_forcal.size() is  " + Theta_input_forcal.size());
+            for(int j = 0 ; j < Theta_input_forcal.size() ; j++){
+//                System.out.println("第 " + i + " 次外部循环");
+//                System.out.println("第 " + j + " 次内部筛选点循环");
+//                System.out.println("Theta_input_forcal.get(j) is : " + Theta_input_forcal.get(j));
+//                System.out.println("AngleArrangeList.get(i) is : " + AngleArrangeList.get(i));
+//                System.out.println("(AngleArrangeList.get(i) + SplitTheta ) is : " + (AngleArrangeList.get(i) + SplitTheta));
+//                System.out.println((Theta_input_forcal.get(j) > AngleArrangeList.get(i)) && Theta_input_forcal.get(j) < (AngleArrangeList.get(i) + SplitTheta ));
+                if((Theta_input_forcal.get(j) > AngleArrangeList.get(i)) && Theta_input_forcal.get(j) < (AngleArrangeList.get(i) + SplitTheta )){
+                    System.out.println("第 " + i + " 次外部循环,第 " + j + " 次内部循环");
+                    Row_input_temp.add(Row_input_forcal.get(j));
+                    Theta_input_temp.add(Theta_input_forcal.get(j));
                 }
             }
+            int AllNumberofPointsinthisSector = Row_input_temp.size();
+//            System.out.println("第 " + i + " 次外部循环");
+//            System.out.println("**********Row_input_temp" + Row_input_temp);
+//            System.out.println("Theta_input_temp" + Theta_input_temp);
             double temp_radius = SplitRadiusWidth;
-            ArrayList<Integer> insideRowNumber_history = new ArrayList<>();
-            ArrayList<Integer> insideRowNumberlength = new ArrayList<>();
+            ArrayList<Integer> insideRowNumber_history = new ArrayList<>();//在扇形内的点的编号
+            ArrayList<Integer> insideRowNumberlength = new ArrayList<>();//记录上一个半径下,扇形区域内点的个数
             int insideRowNumberlength_history = 1;
             while (true){
-                insideRowNumberlength.add(insideRowNumList(temp_radius,Row_input_temp).size());
+//                System.out.println("&&&&&&&&&&&&&&&& " + insideRowNumList(temp_radius,Row_input_temp).size());
+                insideRowNumberlength.add(insideRowNumList(temp_radius,Row_input_temp).size());//
                 int temp_size = insideRowNumberlength.size();
 //                if(insideRowNumberlength.get(temp_size - 1) / insideRowNumberlength.get(temp_size - 2 ) < IncreasingRate){
-                if(insideRowNumberlength.get(temp_size - 1) / insideRowNumberlength_history  < IncreasingRate){
+                if(((insideRowNumberlength.get(temp_size - 1) /insideRowNumberlength_history)  < IncreasingRate) && ((insideRowNumberlength.get(temp_size - 1)) < 0.8 * temp_size)){
                     break;
                 }
                 else {
-                    insideRowNumber_history = insideRowNumList(temp_radius,Row_input_temp);
+                    System.out.println("111111111111111111111111111111111111111111111111111111111111111");
+                    ArrayList<Integer> insideRowNumberList_temp = new ArrayList<>();
+                    insideRowNumberList_temp = insideRowNumList(temp_radius,Row_input_temp);
+                    ArrayList<Integer> insideRowNumber_history_temp = new ArrayList<>();//临时-在扇形内的点的编号
+                    insideRowNumber_history = insideRowNumber_history_temp;
+                    for (int ij = 0 ; ij < insideRowNumberList_temp.size();ij++){
+                        insideRowNumber_history.add(insideRowNumberList_temp.get(ij));
+                    }
+//                    insideRowNumber_history = insideRowNumList(temp_radius,Row_input_temp);
+//                    insideRowNumber_history = insideRowNumList(temp_radius,Row_input_temp);
                     temp_radius = temp_radius + SplitRadiusWidth;
                     insideRowNumberlength_history = insideRowNumberlength.get(temp_size - 1);
                 }
             }
             ArrayList<Double> Result_Row_temp = new ArrayList<>();
             ArrayList<Double> Result_Theta_temp = new ArrayList<>();
-            for(int ii = 0 ; i < insideRowNumber_history.size() ; i++){
-                Result_Row_temp.add(Row_input_temp.get(insideRowNumber_history.get(i)));
-                Result_Theta_temp.add(Theta_input_temp.get(insideRowNumber_history.get(i)));
+//            System.out.println("insideRowNumber_history.size() " + insideRowNumber_history.size());
+            for(int ii = 0 ; ii < insideRowNumber_history.size() ; ii++){
+//                System.out.println("Row_input_temp.get(insideRowNumber_history.get(ii)) " + Row_input_temp.get(insideRowNumber_history.get(ii)) );
+                Result_Row_temp.add(Row_input_temp.get(insideRowNumber_history.get(ii)));
+                Result_Theta_temp.add(Theta_input_temp.get(insideRowNumber_history.get(ii)));
             }
+//            System.out.println("Result_Row_temp: " + Result_Row_temp);
             DataType<Double> Row_data = new DataType<>(Result_Row_temp);
             DataType<Double> Theta_data = new DataType<>(Result_Theta_temp);
             Result_Row.add(Row_data);
             Result_Theta.add(Theta_data);
+            Result_OutPu2.println(temp_radius);
+            Area = Area + Math.PI * Math.pow(temp_radius,2) * (SplitTheta / (2 * Math.PI));
         }
+        System.out.println("最终面积为: " + Area);
+        Result_OutPu2.close();
+        java.io.File file3 = new java.io.File("C:\\Users\\87969\\Desktop\\test\\meanshiftAreaRowandTheta.txt");
+//        java.io.File file3 = new java.io.File("C:\\Users\\87969\\Desktop\\test\\meanshiftAreaSectorR.txt");
+        PrintWriter Result_OutPut = new PrintWriter(file3);
 
 
+        for(int iii = 0 ; iii < Result_Row.size();iii++){
+            Result_OutPut.println("第" + iii + "个扇形的rowlist " + Result_Row.get(iii).Data);
+            Result_OutPut.println("第" + iii + "个扇形的thetalist " + Result_Theta.get(iii).Data);
+        }
+        Result_OutPut.close();
+//        System.out.println("Result_Row: " + Result_Row);
+//        System.out.println("Result_Theta: " + Result_Theta);
     }
 
     public ArrayList<Integer> insideRowNumList(double Radius,ArrayList<Double>Row_input_temp){
         ArrayList<Integer> insideRowNumber = new ArrayList<>();
+//        System.out.println("555555555555555555 " + Row_input_temp);
+//        System.out.println("666666666666666666 " + Radius);
         for(int i = 0 ; i < Row_input_temp.size() ; i++){
             if( Row_input_temp.get(i) < Radius ){
                 insideRowNumber.add(i);
             }
         }
+//        System.out.println("1111111@@@@@@@@@@@@@@@@@@@@@@@@@@ " + insideRowNumber);
         return insideRowNumber;
     }
 }

+ 8 - 5
src/TestMeanShift.java

@@ -8,7 +8,7 @@ public class TestMeanShift {
         ArrayList<Double> pointy_input;
         ArrayList<Double> centerx_history_forArea = new ArrayList<>();
         ArrayList<Double> centery_history_forArea = new ArrayList<>();
-        double RusedforMeanshift = 20;
+        double RusedforMeanshift = 40;
         java.io.File file2 = new java.io.File("C:\\Users\\87969\\Desktop\\test\\MeanShift.txt");
         PrintWriter Result_OutPut = new PrintWriter(file2);
         ReadData readData = new ReadData();
@@ -31,12 +31,15 @@ public class TestMeanShift {
         centery_history_forArea = meanShift.centery_history_forArea;
         CalculateArea calculateArea = new CalculateArea(pointx_input,pointy_input,centerx_history_forArea,centery_history_forArea);
         calculateArea.setRusedforMeanShift(RusedforMeanshift);
-        calculateArea.setSplitTheta(Math.PI / 36);
-        calculateArea.setSplitRadiusWidth(0.5);
-        calculateArea.setIncreasingRate(1.05);
+        calculateArea.setSplitTheta(Math.PI / 180);
+        calculateArea.setSplitRadiusWidth(0.3 * RusedforMeanshift);
+        calculateArea.setIncreasingRate(1.005);
+
 
-        calculateArea.DktoPolar();
         calculateArea.configFinalCircle();
+        calculateArea.exchange();
+        calculateArea.DktoPolar();
+        calculateArea.LoopforCalculateArea();
 
 
     }