1. 程式人生 > 實用技巧 >L3-021 神壇 (30分) (計算幾何最小三角形面積)

L3-021 神壇 (30分) (計算幾何最小三角形面積)

題意:給一個二維座標點集,求最小三角形面積。

做法:列舉一個點,其他點相對於這個點極角排序,對排序後的點集列舉相鄰的兩個點,與答案取min。

const int N = 5555;

struct point {
  int x, y;
  point(){}
  point (int _x, int _y) {
    x = _x, y = _y;
  }
}p[N];

vector<point> v;

void run() {
  int n = rd();
  rep(i,1,n) p[i].x = rd(), p[i].y = rd();
  double ans = INF;
  rep(i,1,n) { // 列舉一個點 
    v.clear();
    rep(j,1,n) { // 列舉其他點 
      if (i == j) continue;
      v.pb(point(p[j].x-p[i].x,p[j].y-p[i].y)); // 其他點相對與列舉的點的關係(向量) 
    }
    sort(all(v),[&](point a, point b) {
      return a.x * b.y > b.x * a.y; // 排序方式可以隨意,這裡用順時針(兩向量叉積後>0)
    });
    for (int i = 0; i < sz(v)-1; i++) ans = min(ans, double(abs(v[i].x*v[i+1].y-v[i].y*v[i+1].x))); // 列舉排序後點集相鄰的兩個點(向量),叉積算面積 
  }
  printf("%.3lf\n",ans/2); // 這個 /2 是計算三角形面積那裡的/2
}