1. 程式人生 > >演算法筆記_016-凸包問題(Java)

演算法筆記_016-凸包問題(Java)

package com.liuzhen.chapterThree;

public class ConvexHull {
    //蠻力法解決凸包問題,返回點集合中凸多邊形的點集合
    public static Point[] getConvexPoint(Point[] A){
        Point[] result = new Point[A.length];
        int len = 0;  //用於計算最終返回結果中是凸包中點的個數
        for(int i = 0;i < A.length;i++){
            for(int j = 0;j < A.length;j++){
                
if(j == i) //除去選中作為確定直線的第一個點 continue; int[] judge = new int[A.length]; //存放點到直線距離所使用判斷公式的結果 for(int k = 0;k < A.length;k++){ int a = A[j].getY() - A[i].getY(); int b = A[i].getX() - A[j].getX();
int c = (A[i].getX())*(A[j].getY()) - (A[i].getY())*(A[j].getX()); judge[k] = a*(A[k].getX()) + b*(A[k].getY()) - c; //根據公式計算具體判斷結果 } if(JudgeArray(judge)){ // 如果點均在直線的一邊,則相應的A[i]是凸包中的點 result[len++] = A[i];
break; } } } Point[] result1 = new Point[len]; for(int m = 0;m < len;m++) result1[m] = result[m]; return result1; } //判斷陣列中元素是否全部大於等於0或者小於等於0,如果是則返回true,否則返回false public static boolean JudgeArray(int[] Array){ boolean judge = false; int len1 = 0, len2 = 0; for(int i = 0;i < Array.length;i++){ if(Array[i] >= 0) len1++; } for(int j = 0;j < Array.length;j++){ if(Array[j] <= 0) len2++; } if(len1 == Array.length || len2 == Array.length) judge = true; return judge; } public static void main(String[] args){ Point[] A = new Point[8]; A[0] = new Point(1,0); A[1] = new Point(0,1); A[2] = new Point(0,-1); A[3] = new Point(-1,0); A[4] = new Point(2,0); A[5] = new Point(0,2); A[6] = new Point(0,-2); A[7] = new Point(-2,0); Point[] result = getConvexPoint(A); System.out.println("集合A中滿足凸包的點集為:"); for(int i = 0;i < result.length;i++) System.out.println("("+result[i].getX()+","+result[i].getY()+")"); } }