查看完整版本: 帮帮我啊

xiaoxiao 2007-8-24 10:43

帮帮我啊

哪位高手帮帮我咯~~
帮我看下下面这段程序咯~
我看不懂哦~~
帮我解释一下那几个函数
加我QQ107884224
跪谢
#include <iostream>     //给定点集合,求包罗所有点的最小凸包。(Jarris步进法)
#include <fstream>      //n 为总点数,x,y是坐标。            
(即收缩法)
#include <deque>        //tx,ty是求出的逆时针凸包坐标。#include <math.h>       //坐标以0起始。
//使用条件: 1。点可以任意给,可重复。
using namespace std;    // 2。三个以及以上的点。
// 3。已经考虑了边上有点的情况。
ifstream fin("maxconvexpolygon.in");
void out();
void go();
double mytan(double y,double x);
void in();
double dist (double x1,double y1,double x2,double y2); #define NN 1000
#define pi 3.1415927
int n,flag[NN];
double x[NN],y[NN];
deque <double> tx,ty;
int main();
{
    in();
    go();
    out();
    return 0;
}
void out()
{
    int i;
    for (i=0;i<tx.size();i++)
        cout<<tx[i]<<" "<<ty[i]<<endl;
    cout<<tx.size()<<" Edges Convex Polygon."<<endl;
    return;
}
void go();
{
int i,j,k,mm;
uble nk1,nk2,flag2;
    memset(flag,0,sizeof(flag));
    mm=0;
    for (i=1;i<n;i++)
        if (y[mm]>y[i]+1e-9) mm=i;
        else if (fabs(y[mm]-y[i])<1e-9 && x[mm]>x[i]+1e-9) mm=i;
    tx.clear();
    ty.clear();
    tx.push_back(x[mm]);
    ty.push_back(y[mm]);
    flag[mm]=1;
    nk1=-1.0;
    j=mm;
    for(;;){
        flag2=0;
        for (i=0;i<n;i++){
            double tg,yyy,xxx;
            yyy=y[i]-y[j];
            xxx=x[i]-x[j];
            tg=mytan(yyy,xxx);
            //  printf ("i=%d  tg=%lf  xx=%lf
yy=%lf\n",i,tg*180/pi,xxx,yyy);
            if ( (tg>nk1+1e-9&& (!flag2||nk2>tg+1e-9))
                ||
            (flag2 && fabs(tg-nk2)<1e-9&&
dist(x[j],y[j],x[k],y[k])+1e-9<dist(x[j],y[
j],x[i],y[i])) )  {
                nk2=tg;
                k=i;
                flag2=1;
            }
        }
        nk1=nk2;
        if (fabs(x[k]-x[mm])<1e-9 && fabs(y[k]-y[mm])<1e-9) return;
        tx.push_back(x[k]);
        ty.push_back(y[k]);
        j=k;
    }
    return ;
}
double dist (double x1,double yy1,double x2,double yy2)
{
    return pow((x1-x2)*(x1-x2)+(yy1-yy2)*(yy1-yy2),0.5);
}
double mytan(double y,double x)
{
    double red;
    double red;
    if (fabs(x)<1e-9 && fabs(y)<1e-9) return -100.0;
    red=atan2(y,x);
    if (red<0) red=red+2*pi;
    return red;
}
void in()
{
    int i;
    double xx,yy;
    fin>>n;
    for (i=0;i<n;i++){
        fin>>xx>>yy;
        x[i]=xx;
        y[i]=yy;
    }
    return ;
}
页: [1]
查看完整版本: 帮帮我啊