?? including.c
字號:
#include <mpi.h>#include <stdio.h>int n;double xtemp[20],ytemp[20];double x,y;int s,mys;int group_size,my_rank;/*判斷射線與線段是否有交點*/int cal_inter(int number,int i,double x,double y){ double x1,y1,x2,y2,temp; int result; result=0; if(number+i*group_size>=n) return result; x1=xtemp[number+i*group_size]; y1=ytemp[number+i*group_size]; x2=xtemp[(number+1+i*group_size)%n]; y2=ytemp[(number+1+i*group_size)%n]; if(y1>y2) { temp=x1; x1=x2; x2=temp; temp=y1; y1=y2; y2=temp; } /*判斷豎直邊的情況*/ if(x1==x2) { if((x>x1)&&(y<=y2)&&(y>y1)) result=1; else result=0; /*點在豎直邊上,應該對result賦一個比較的大的值,這里是100*/ if((x==x1)&&((y-y1)*(y2-y)>=0)) result=100; } else { /*非豎直邊,非水平邊*/ if (y1!=y2) { temp=x2+(y-y2)*(x2-x1)/(y2-y1); /*交點剛好在邊上,且不為下頂點*/ if((temp<x)&&(y<=y2)&&(y>y1)) result=1; else result=0; /*點在邊上,應該對result賦一個比較的大的值,這里是100*/ if((temp==x)&&((y-y2)*(y1-y)>=0)) result=100; } else { /*點在水平邊上,應該對result賦一個比較的大的值,這里是100*/ if((y==y1)&&((x1-x)*(x-x2)>=0)) result=100; } } return result;}main(int argc,char* argv[]){ int i; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); MPI_Comm_size(MPI_COMM_WORLD,&group_size); /*各處理器計數(shù)器初始化*/ mys=0; /*主處理器讀入多邊形頂點和要判斷的點的坐標*/ if(my_rank==0) { printf("請輸入點的個數(shù):"); scanf("%d",&n); printf("請輸入各點的坐標\n"); for(i=0;i<n;i++) { printf("%d:",i); scanf("%lf",&xtemp[i]); scanf("%lf",&ytemp[i]); } printf("請輸入要判斷點的坐標\n"); scanf("%lf %lf",&x,&y); } MPI_Barrier(MPI_COMM_WORLD); /*把多邊形的頂點數(shù)、頂點坐標與要判別的點的坐標播送給所有進程*/ MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD); MPI_Bcast(&x,1,MPI_DOUBLE,0,MPI_COMM_WORLD); MPI_Bcast(&y,1,MPI_DOUBLE,0,MPI_COMM_WORLD); MPI_Bcast(xtemp,n,MPI_DOUBLE,0,MPI_COMM_WORLD); MPI_Bcast(ytemp,n,MPI_DOUBLE,0,MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); /*每一個處理器處理n/group_size條邊上的情況并求和*/ for(i=0;i<n/group_size+1;i++) { mys+=cal_inter(my_rank,i,x,y); } MPI_Barrier(MPI_COMM_WORLD); /*把mys的值規(guī)約到s*/ MPI_Reduce(&mys,&s,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD); /*根據(jù)s值確定輸出結果*/ if(my_rank==0) { if(s>=100) printf("vertex p is in polygon\n"); else if(s%2==1) printf("vertex p is in polygon\n"); else printf("vertex p is out of polygon\n"); } MPI_Finalize();}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -