24h購物| | PChome| 登入
2013-08-23 17:41:53| 人氣2,819| 回應0 | 上一篇 | 下一篇

[UVA] 10577 - Bounding box

推薦 0 收藏 0 轉貼0 訂閱站台


  Problem C: Bounding box 

The Archeologists of the Current Millenium (ACM) now and then discover ancient artifacts located at vertices of regular polygons. The moving sand dunes of the desert render the excavations difficult and thus once three vertices of a polygon are discovered there is a need to cover the entire polygon with protective fabric.

Input 

Input contains multiple cases. Each case describes one polygon. It starts with an integer n1#150, the number of vertices in the polygon, followed by three pairs of real numbers giving the x and y coordinates of three vertices of the polygon. The numbers are separated by whitespace. The input ends with a n equal 0, this case should not be processed.

Output 

For each line of input, output one line in the format shown below, giving the smallest area of a rectangle which can cover all the vertices of the polygon and whose sides are parallel to the x and y axes.

Sample Input 

4
10.00000 0.00000
0.00000 -10.00000
-10.00000 0.00000
6
22.23086 0.42320
-4.87328 11.92822
1.76914 27.57680
23
156.71567 -13.63236
139.03195 -22.04236
137.96925 -11.70517
0

Sample Output 

Polygon 1: 400.000
Polygon 2: 1056.172
Polygon 3: 397.673



Local_UVa'2003

給一個正 n 邊形的其中 3 個點,找到最小一個長方形包裹。

而這個長方形的邊要平行 x, y 軸。

先求外接圓半徑,以及外接圓圓心。

打算依序走訪整個正多邊形的所有點,從其中一個點出發,圓心 O,點 P。

拉向量 OP,旋轉 360度/n,得到下一個點 Q,依序找到所有點。


#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;
struct Pt {
    double x, y;
};
Pt circle(Pt p1, Pt p2, Pt p3) {
    double a, b, c, d, e, f;
    double dx, dy, dd;
    a = p1.x - p2.x, b = p1.y - p2.y;
    c = a*((p1.x+p2.x)/2) + b*((p1.y+p2.y)/2);
    d = p2.x - p3.x, e = p2.y - p3.y;
    f = d*((p2.x+p3.x)/2) + e*((p2.y+p3.y)/2);
    Pt o;
    dd = a*e - b*d;
    dx = c*e - b*f;
    dy = a*f - d*c;
    o.x = dx/dd, o.y = dy/dd;
    return o;
}
int main() {
    int n, cases = 0;
    int i, j, k;
    const double pi = acos(-1);
    Pt a, b, c;
    while(scanf("%d", &n) == 1 && n) {
        scanf("%lf %lf", &a.x, &a.y);
        scanf("%lf %lf", &b.x, &b.y);
        scanf("%lf %lf", &c.x, &c.y);
        Pt o = circle(a, b, c);
        double theta = 2*pi/n;
        double left, right, up, down;
        left = down = 1e+30;
        right = up = -1e+30;
        Pt next, prev;
        prev = a;
        double sintheta = sin(theta);
        double costheta = cos(theta);
        for(i = 0; i < n; i++) {
            double vx, vy, tx, ty;
            vx = prev.x - o.x, vy = prev.y - o.y;
            next.x = o.x + vx*costheta - vy*sintheta;
            next.y = o.y + vx*sintheta + vy*costheta;
            left = min(left, next.x), right = max(right, next.x);
            down = min(down, next.y), up = max(up, next.y);
            prev = next;
        }
        printf("Polygon %d: %.3lf\n", ++cases, (right-left)*(up-down));
    }
    return 0;
}

台長: Morris
人氣(2,819) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 教育學習(進修、留學、學術研究、教育概況) | 個人分類: UVA |
此分類下一篇:[UVA] 11800 - Determine the Shape
此分類上一篇:[UVA] 11894 - Genius MJ

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文