|
@@ -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;
|
|
|
}
|
|
|
}
|