including.c
上传用户:hhyinxing
上传日期:2013-09-10
资源大小:833k
文件大小:3k
源码类别:

并行计算

开发平台:

Unix_Linux

  1. #include <mpi.h>
  2. #include <stdio.h>
  3. int n;
  4. double xtemp[20],ytemp[20];
  5. double x,y;
  6. int s,mys;
  7. int group_size,my_rank;
  8. /*判断射线与线段是否有交点*/
  9. int cal_inter(int number,int i,double x,double y)
  10. {
  11. double x1,y1,x2,y2,temp;
  12.    int result;
  13.    result=0;
  14.    if(number+i*group_size>=n)
  15. return result;
  16. x1=xtemp[number+i*group_size];
  17.    y1=ytemp[number+i*group_size];
  18.    x2=xtemp[(number+1+i*group_size)%n];
  19.    y2=ytemp[(number+1+i*group_size)%n];
  20.  
  21.   if(y1>y2) 
  22.    {
  23.     temp=x1;
  24.     x1=x2;
  25.     x2=temp;
  26.     temp=y1;
  27.     y1=y2;
  28.     y2=temp;
  29.    }
  30.     /*判断竖直边的情况*/
  31.    if(x1==x2)
  32.    {
  33.     if((x>x1)&&(y<=y2)&&(y>y1))
  34.       result=1;
  35.     else
  36. result=0;
  37.         /*点在竖直边上,应该对result赋一个比较的大的值,这里是100*/
  38. if((x==x1)&&((y-y1)*(y2-y)>=0))
  39. result=100;
  40. }
  41. else
  42. {
  43. /*非竖直边,非水平边*/
  44.         if (y1!=y2)
  45. {
  46. temp=x2+(y-y2)*(x2-x1)/(y2-y1);
  47. /*交点刚好在边上,且不为下顶点*/
  48.       if((temp<x)&&(y<=y2)&&(y>y1))
  49.          result=1;
  50.       else
  51.          result=0;
  52.       /*点在边上,应该对result赋一个比较的大的值,这里是100*/
  53. if((temp==x)&&((y-y2)*(y1-y)>=0))
  54. result=100;
  55. }
  56. else
  57. {
  58. /*点在水平边上,应该对result赋一个比较的大的值,这里是100*/
  59.       if((y==y1)&&((x1-x)*(x-x2)>=0)) result=100;
  60. }
  61. }
  62. return result;
  63. }
  64. main(int argc,char* argv[])
  65. {
  66. int i;
  67.     MPI_Init(&argc,&argv);  
  68.     MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
  69. MPI_Comm_size(MPI_COMM_WORLD,&group_size);
  70.    /*各处理器计数器初始化*/
  71.    mys=0;
  72.     /*主处理器读入多边形顶点和要判断的点的坐标*/
  73.    if(my_rank==0)
  74.    {
  75.    printf("请输入点的个数:");
  76.   scanf("%d",&n);
  77.    printf("请输入各点的坐标n");
  78.    for(i=0;i<n;i++)
  79.     {
  80.     printf("%d:",i);
  81.     scanf("%lf",&xtemp[i]);
  82.     scanf("%lf",&ytemp[i]);
  83.     }
  84.    printf("请输入要判断点的坐标n");
  85.    scanf("%lf %lf",&x,&y);
  86.    }
  87. MPI_Barrier(MPI_COMM_WORLD);
  88. /*把多边形的顶点数、顶点坐标与要判别的点的坐标播送给所有进程*/
  89.    MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);
  90.    MPI_Bcast(&x,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
  91.    MPI_Bcast(&y,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
  92.    MPI_Bcast(xtemp,n,MPI_DOUBLE,0,MPI_COMM_WORLD);
  93.    MPI_Bcast(ytemp,n,MPI_DOUBLE,0,MPI_COMM_WORLD);
  94.    MPI_Barrier(MPI_COMM_WORLD);
  95.     /*每一个处理器处理n/group_size条边上的情况并求和*/
  96.    for(i=0;i<n/group_size+1;i++)
  97.     {
  98.      mys+=cal_inter(my_rank,i,x,y); 
  99. }
  100.    MPI_Barrier(MPI_COMM_WORLD);
  101.     /*把mys的值规约到s*/
  102.     MPI_Reduce(&mys,&s,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
  103.     /*根据s值确定输出结果*/
  104. if(my_rank==0)
  105.     {
  106. if(s>=100)  
  107. printf("vertex p is in polygonn");
  108.      else
  109.         if(s%2==1)
  110.          printf("vertex p is in polygonn");
  111.         else
  112.           printf("vertex p is out of polygonn");
  113. }
  114.     MPI_Finalize();