Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

汗……我一看就知道你的Melkman是哪里来的了……

Posted by Ikki at 2005-08-11 18:49:41 on Problem 1113
In Reply To:sorry,帮我看一下 Posted by:sunmoonstar_love at 2005-08-11 18:47:29
> struct Point 
> {
>     double x,y;
> };    
> 
> inline double isLeft( Point P0, Point P1, Point P2 )
> {
>     return (P1.x - P0.x)*(P2.y - P0.y) - (P2.x - P0.x)*(P1.y - P0.y);
> }
>  
> 
> // simpleHull_2D():
> //    Input:  V[] = polyline array of 2D vertex points 
> //            n   = the number of points in V[]
> //    Output: H[] = output convex hull array of vertices (max is n)
> //    Return: h   = the number of points in H[]
> int simpleHull_2D( Point* V, int n, Point* H )
> {
>     // initialize a deque D[] from bottom to top so that the
>     // 1st three vertices of V[] are a counterclockwise triangle
>     Point* D = new Point[2*n+2];
>     int bot = n-2, top = bot+3;   // initial bottom and top deque indices
>     D[bot] = D[top] = V[2];       // 3rd vertex is at both bot and top
>     if (isLeft(V[0], V[1], V[2]) > 0) {
>         D[bot+1] = V[0];
>         D[bot+2] = V[1];          // ccw vertices are: 2,0,1,2
>     }
>     else {
>         D[bot+1] = V[1];
>         D[bot+2] = V[0];          // ccw vertices are: 2,1,0,2
>     }
> 
>     // compute the hull on the deque D[]
>     for (int i=3; i < n; i++) {   // process the rest of vertices
>         // test if next vertex is inside the deque hull
>         if(i>5)
>         {
>             printf(" %.2lf %.2lf :  %.2lf %.2lf - %.2lf %.2lf\n",D[bot].x,D[bot].y,D[top].x,D[top].y);
>            printf(" i = %d, top = %d, bot = %d\n",i,top,bot);
>         }    
>         if ((isLeft(D[bot], D[bot+1], V[i]) > 0) &&
>             (isLeft(D[top-1], D[top], V[i]) > 0) )
>                 continue;         // skip an interior vertex
> 
>         // incrementally add an exterior vertex to the deque hull
>         // get the rightmost tangent at the deque bot
>         while (isLeft(D[bot], D[bot+1], V[i]) <= 0)
>             ++bot;                // remove bot of deque
>         D[--bot] = V[i];          // insert V[i] at bot of deque
> 
>         // get the leftmost tangent at the deque top
>         while (isLeft(D[top-1], D[top], V[i]) <= 0)
>             --top;                // pop top of deque
>         D[++top] = V[i];          // push V[i] onto top of deque
>         printf(" i = %d,  bot = %d,  top = %d, n = %d\n",i,bot,top,n);
>         for(int j = bot; j<= top; j++)
>         {
>             printf(" %.3lf  %.3lf\n",D[j].x,D[j].y);
>         }    
>     }
> 
>     // transcribe deque D[] to the output hull array H[]
>     int h;        // hull vertex counter
>     for (h=0; h <= (top-bot); h++)
>         H[h] = D[bot + h];
> 
>     delete D;
>     return h-1;
> }

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator