并行计算大作业之多边形相交(OpenMP、MPI、Java、Windows)



***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************



吐槽:

话说,相当郁闷,2015年,第一次打开博客,准备总结一下这一年。。

结果博客被封了= =!

今天,终于解封了,换了密码,换了密保....

但是,写回顾的激情有点退散了。。

明后两天要上课,明天还要验收一个综合设计大作业,再后两天要考试,再后两天继续上课,然后才能放假。。。

回顾,就等着考完试再写吧,正好趁这几天好好总结一下。




正文:

这是这学期开的 《并行计算与程序设计》,学了一些并行计算的东东。

期末没有考试,就是选择一个算法,用 OpenMP、MPI、Java、Windows 实现,当然还有额外的,比如 Hadoop、GPU、Linux等(这些没有花时间去研究。。)


我选择的算法就是很简单的,多边形相交问题,只是用到了并行计算的一些基础。

发一篇博客,把这个大作业记录下来~。~


1. 功能描述与解决方案

1.1 功能描述:

    在很多实际应用中,要求确定一组几何物体(目标)是否相交。例如,在模式分类中,必须确定代表不同类别的空间中的不同区域是否具有共同的子区域;在集成电路设计中,重要的是要避免导线的交叉和元件的重叠;在计算机图形学中,要求消去三维景象的二维表示中的隐线和隐面等等。像如上的这些问题都可归结为物体的相交问题(Intersection Problem)。

    设有平面上的两个多边形(允许有边相交)R和Q,如果多边形R的一条边和Q的一条边相交,则称R和Q是相交的。所以两个多边形的相交问题可以转化为线段与多边形的相交问题。三维空间的相交问题与二维平面上的相交问题并没有实质的区别,只是在判断边的相交时比二维问题上判断边的相交要麻烦,因为三维空间上的点坐标是与3个值有关的。

    下面描述的算法都是针对二维平面上的多边形相交而言的。

1.2 解决方案

    最基本的相交问题是判断两条线段是否相交。而边与多边形相交就是判断一条边和多条边中的某条边是否相交的算法。要是一个多边形的某条边与另一个多边形的一条边相交,则就称两个多边形相交。这样两个多边形相交的问题就转化为多条边与一个多边形相交的问题。


2. 算法设计

2.1 串行算法设计

    输入:多边形R的n条边E1,E2,,…,En的两个端点坐标集合S1,多边形Q的m条边

F1,F2,,…,Fm的两个端点坐标集合S2,要求集合内点的顺序为顺时针方向。

    输出:两个多边形是否相交:true(两多边形相交);false(两多边形不相交)

  1. Begin  
  2.     for i=1 to n do  
  3.         for j=1 to m do  
  4.             if (Ei intersects Fj ) then  
  5.                 return true  
  6.             end if  
  7.         end for  
  8.     end for  
  9.     return false  
  10. End  
Begin
    for i=1 to n do
        for j=1 to m do
            if (Ei intersects Fj ) then
                return true
            end if
        end for
    end for
    return false
End


    显然上述算法所需时间为O(mn)。


2.2 并行算法设计

    输入:多边形R的n条边E1,E2,,…,En的两个端点坐标集合S1,多边形Q的m条边

F1,F2,,…,Fm的两个端点坐标集合S2,要求集合内点的顺序为顺时针方向。

    输出:两个多边形是否相交:true(两多边形相交);false(两多边形不相交)

  1. Begin  
  2.     for i=1 to n par-do  
  3.         for j=1 to m  
  4.             if (Ei intersects Fj ) then  
  5.                 return true  
  6.             end if  
  7.         end for  
  8.     end for  
  9.     return false;  
  10. End  
Begin
    for i=1 to n par-do
        for j=1 to m
            if (Ei intersects Fj ) then
                return true
            end if
        end for
    end for
    return false;
End


3.各种并行算法

3.1 OpenMP 方法

  1. #include "stdafx.h"  
  2. #include "omp.h"  
  3. #include <time.h>  
  4. #include <windows.h>  
  5.   
  6. // 设置相交精度与多边形点个数的上限  
  7. const double EPS = 1e-10;    
  8. const int MAX = 100001;  
  9.   
  10. struct point    
  11. {    
  12.     double x,y;    
  13. }lx_R[MAX],lx_Q[MAX];    
  14. // 多边形R与Q的点个数  
  15. int lx_n,lx_m;  
  16. // 定义相应比较函数  
  17. double Max(double a,double b)   {return a>b?a:b;}    
  18. double Min(double a,double b)   {return a>b?b:a;}    
  19.   
  20. // 判断两线段是否相交    
  21. bool lx_inter(point p1,point p2,point p3,point p4)    
  22. {     
  23.     if( Min(p1.x,p2.x)>Max(p3.x,p4.x) ||    
  24.        Min(p1.y,p2.y)>Max(p3.y,p4.y) ||    
  25.        Min(p3.x,p4.x)>Max(p1.x,p2.x) ||    
  26.        Min(p3.y,p4.y)>Max(p1.y,p2.y) )    
  27.         return 0;    
  28.     double k1,k2,k3,k4;    
  29.     k1 = (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);    
  30.     k2 = (p2.x-p1.x)*(p4.y-p1.y) - (p2.y-p1.y)*(p4.x-p1.x);    
  31.     k3 = (p4.x-p3.x)*(p1.y-p3.y) - (p4.y-p3.y)*(p1.x-p3.x);    
  32.     k4 = (p4.x-p3.x)*(p2.y-p3.y) - (p4.y-p3.y)*(p2.x-p3.x);    
  33.     return (k1*k2<=EPS && k3*k4<=EPS);    
  34. }    
  35.   
  36. // 获取点的坐标函数  
  37. void lx_getPoint(char lx_c )  
  38. {  
  39.     int i;  
  40.     printf("please input the number of polygon %c: ",lx_c);  
  41.   
  42.     if( lx_c == 'R' )  
  43.     {  
  44.         scanf("%d",&lx_n);  
  45.         printf("\nplease input all point position: \n");  
  46.         for( i = 0 ; i < lx_n ; ++i )  
  47.             scanf("%lf %lf",&lx_R[i].x,&lx_R[i].y);  
  48.     }  
  49.     else      
  50.     {  
  51.         scanf("%d",&lx_m);  
  52.         printf("\nplease input all point position: \n");  
  53.         for( i = 0 ; i < lx_m ; ++i )  
  54.             scanf("%lf %lf",&lx_Q[i].x,&lx_Q[i].y);  
  55.     }  
  56. }  
  57.   
  58.   
  59. int _tmain(int argc, _TCHAR* argv[])  
  60. {  
  61.     clock_t t1,t2;  
  62.     int i,j;  
  63.     bool isCross=false;  
  64.     // 获取多边形的点  
  65.     lx_getPoint('R');  
  66.     lx_getPoint('Q');  
  67.   
  68.     t1=clock();  
  69.     omp_set_num_threads(2);  
  70.       
  71.     // k 用来控制循环次数  
  72.     forint k = 0 ; k < 10001 ; ++k )  
  73.     {  
  74. #pragma omp parallel for  
  75.     for( i = 0 ; i < lx_n ; ++i )  
  76.         for( j = 0 ; j < lx_m ; ++j )  
  77.             if( lx_inter( lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m] ) )  
  78.                 isCross=true;  
  79.     }  
  80.   
  81.     if( isCross )   printf("多边形相交!\n");  
  82.     else    printf("多边形不相交!\n");  
  83.   
  84.     t2=clock();  
  85.       
  86.     printf("Time is %d\n",t2-t1);  
  87.   
  88.     system("pause");  
  89.     return 0;  
  90. }  
#include "stdafx.h"
#include "omp.h"
#include <time.h>
#include <windows.h>

// 设置相交精度与多边形点个数的上限
const double EPS = 1e-10;  
const int MAX = 100001;

struct point  
{  
    double x,y;  
}lx_R[MAX],lx_Q[MAX];  
// 多边形R与Q的点个数
int lx_n,lx_m;
// 定义相应比较函数
double Max(double a,double b)   {return a>b?a:b;}  
double Min(double a,double b)   {return a>b?b:a;}  

// 判断两线段是否相交  
bool lx_inter(point p1,point p2,point p3,point p4)  
{   
    if( Min(p1.x,p2.x)>Max(p3.x,p4.x) ||  
       Min(p1.y,p2.y)>Max(p3.y,p4.y) ||  
       Min(p3.x,p4.x)>Max(p1.x,p2.x) ||  
       Min(p3.y,p4.y)>Max(p1.y,p2.y) )  
        return 0;  
    double k1,k2,k3,k4;  
    k1 = (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);  
    k2 = (p2.x-p1.x)*(p4.y-p1.y) - (p2.y-p1.y)*(p4.x-p1.x);  
    k3 = (p4.x-p3.x)*(p1.y-p3.y) - (p4.y-p3.y)*(p1.x-p3.x);  
    k4 = (p4.x-p3.x)*(p2.y-p3.y) - (p4.y-p3.y)*(p2.x-p3.x);  
    return (k1*k2<=EPS && k3*k4<=EPS);  
}  

// 获取点的坐标函数
void lx_getPoint(char lx_c )
{
	int i;
	printf("please input the number of polygon %c: ",lx_c);

	if( lx_c == 'R' )
	{
		scanf("%d",&lx_n);
		printf("\nplease input all point position: \n");
		for( i = 0 ; i < lx_n ; ++i )
			scanf("%lf %lf",&lx_R[i].x,&lx_R[i].y);
	}
	else	
	{
		scanf("%d",&lx_m);
		printf("\nplease input all point position: \n");
		for( i = 0 ; i < lx_m ; ++i )
			scanf("%lf %lf",&lx_Q[i].x,&lx_Q[i].y);
	}
}


int _tmain(int argc, _TCHAR* argv[])
{
	clock_t t1,t2;
	int i,j;
	bool isCross=false;
	// 获取多边形的点
	lx_getPoint('R');
	lx_getPoint('Q');

	t1=clock();
	omp_set_num_threads(2);
	
	// k 用来控制循环次数
	for( int k = 0 ; k < 10001 ; ++k )
	{
#pragma omp parallel for
	for( i = 0 ; i < lx_n ; ++i )
		for( j = 0 ; j < lx_m ; ++j )
			if( lx_inter( lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m] ) )
				isCross=true;
	}

	if( isCross )	printf("多边形相交!\n");
	else	printf("多边形不相交!\n");

	t2=clock();
	
	printf("Time is %d\n",t2-t1);

	system("pause");
	return 0;
}


3.2 MPI 方法

  1. #include "mpi.h"  
  2. #include <stdio.h>  
  3. #include <math.h>  
  4. #include <windows.h>  
  5.   
  6. // 设置相交精度 与 多边形点个数的上限  
  7. const double EPS = 1e-10;    
  8. const int MAX = 100001;  
  9.   
  10. struct point    
  11. {    
  12.     double x,y;    
  13. }lx_R[MAX],lx_Q[MAX];    
  14. // 多边形R与Q的点个数  
  15. int lx_n,lx_m;  
  16. // 定义相应比较函数  
  17. double Max(double a,double b)   {return a>b?a:b;}    
  18. double Min(double a,double b)   {return a>b?b:a;}    
  19.   
  20. // 判断两线段是否相交     
  21. bool lx_inter(point p1,point p2,point p3,point p4)    
  22. {     
  23.     if( Min(p1.x,p2.x)>Max(p3.x,p4.x) ||    
  24.        Min(p1.y,p2.y)>Max(p3.y,p4.y) ||    
  25.        Min(p3.x,p4.x)>Max(p1.x,p2.x) ||    
  26.        Min(p3.y,p4.y)>Max(p1.y,p2.y) )    
  27.         return 0;    
  28.     double k1,k2,k3,k4;    
  29.     k1 = (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);    
  30.     k2 = (p2.x-p1.x)*(p4.y-p1.y) - (p2.y-p1.y)*(p4.x-p1.x);    
  31.     k3 = (p4.x-p3.x)*(p1.y-p3.y) - (p4.y-p3.y)*(p1.x-p3.x);    
  32.     k4 = (p4.x-p3.x)*(p2.y-p3.y) - (p4.y-p3.y)*(p2.x-p3.x);    
  33.     return (k1*k2<=EPS && k3*k4<=EPS);    
  34. }    
  35.   
  36. // 获取点的坐标函数  
  37. void lx_getPoint( void )  
  38. {  
  39.     lx_n=76;  
  40.     lx_m=76;  
  41.     int i;  
  42.     for( i = 0 ; i < 20 ; ++i )  {  
  43.         lx_R[i].x=1;  
  44.         lx_R[i].y=i+1;  
  45.         lx_Q[i].x=1;  
  46.         lx_Q[i].y=i+1;  
  47.     }  
  48.     for( i = 19 ; i < 39 ; ++i ) {  
  49.         lx_R[i].x=i-18;  
  50.         lx_R[i].y=20;  
  51.         lx_Q[i].x=i-18;  
  52.         lx_Q[i].y=20;  
  53.     }  
  54.     for( i = 38 ; i < 58 ; ++i ) {  
  55.         lx_R[i].x=20;  
  56.         lx_R[i].y=58-i;  
  57.         lx_Q[i].x=20;  
  58.         lx_Q[i].y=58-i;  
  59.     }  
  60.     for( i = 57 ; i < 76 ; ++i ) {  
  61.         lx_R[i].x=77-i;  
  62.         lx_R[i].y=1;  
  63.         lx_Q[i].x=77-i;  
  64.         lx_Q[i].y=1;  
  65.     }  
  66.   
  67. }  
  68.   
  69.   
  70. int main( int argc , char *argv[] )  
  71. {  
  72.     MPI_Comm comm = MPI_COMM_WORLD;   
  73.     int rank ,size,i,j,ans;  
  74.     int rslt,myrslt,loop;  
  75.     double lx_t1,lx_t2;  
  76.     char processor_name[MPI_MAX_PROCESSOR_NAME];  
  77.     int namelen;  
  78.   
  79.     MPI_Init(&argc,&argv);  
  80.     MPI_Comm_rank(MPI_COMM_WORLD,&rank);  
  81.     MPI_Comm_size(MPI_COMM_WORLD,&size);  
  82.     MPI_Get_processor_name(processor_name,&namelen);  
  83.       
  84.       
  85.     if( rank == 0 ) {  
  86.         // 获取点坐标集合  
  87.         lx_getPoint();  
  88.   
  89.         lx_t1=MPI_Wtime();  
  90.     }  
  91.   
  92.     loop = 0;  
  93.     while( loop < 100 )  
  94.     {  
  95.   
  96.         // 广播两个多边形的点集合  
  97.         MPI_Bcast(&lx_n,1,MPI_INT,0,MPI_COMM_WORLD);  
  98.         MPI_Bcast(&lx_m,1,MPI_INT,0,MPI_COMM_WORLD);  
  99.   
  100.         for( i = 0 ; i < lx_n ;++i )     {  
  101.             MPI_Bcast(&lx_R[i].x,1,MPI_DOUBLE,0,MPI_COMM_WORLD);  
  102.             MPI_Bcast(&lx_R[i].y,1,MPI_DOUBLE,0,MPI_COMM_WORLD);  
  103.         }  
  104.         for( j= 0 ; j < lx_m ;++j)   {  
  105.             MPI_Bcast(&lx_Q[j].x,1,MPI_DOUBLE,0,MPI_COMM_WORLD);  
  106.             MPI_Bcast(&lx_Q[j].y,1,MPI_DOUBLE,0,MPI_COMM_WORLD);  
  107.         }  
  108.   
  109.         rslt = 0;  
  110.         for( i = rank ; i<lx_n ; i+=size )   {  
  111.             for( j = 0; j < lx_m ; ++j ) {  
  112.                 if( lx_inter( lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m] ) )  
  113.                     rslt= 1;  
  114.             }  
  115.         }  
  116.         myrslt = rslt;  
  117.         MPI_Reduce(&myrslt,&ans,1,MPI_INT,MPI_SUM,0,comm);  
  118.   
  119.         ++loop;  
  120.     }  
  121.     if( rank == 0 ) {  
  122.         if( ans > 0 )    printf("两多边形相交!\n");  
  123.         else    printf("两多边形不相交!\n");  
  124.         lx_t2=MPI_Wtime();  
  125.         printf("时间为 %lf \n ",lx_t2-lx_t1);  
  126.     }  
  127.       
  128.   
  129.     MPI_Finalize();  
  130.     system("pause");  
  131.     return 0;  
  132. }  
#include "mpi.h"
#include <stdio.h>
#include <math.h>
#include <windows.h>

// 设置相交精度 与 多边形点个数的上限
const double EPS = 1e-10;  
const int MAX = 100001;

struct point  
{  
    double x,y;  
}lx_R[MAX],lx_Q[MAX];  
// 多边形R与Q的点个数
int lx_n,lx_m;
// 定义相应比较函数
double Max(double a,double b)   {return a>b?a:b;}  
double Min(double a,double b)   {return a>b?b:a;}  

// 判断两线段是否相交   
bool lx_inter(point p1,point p2,point p3,point p4)  
{   
    if( Min(p1.x,p2.x)>Max(p3.x,p4.x) ||  
       Min(p1.y,p2.y)>Max(p3.y,p4.y) ||  
       Min(p3.x,p4.x)>Max(p1.x,p2.x) ||  
       Min(p3.y,p4.y)>Max(p1.y,p2.y) )  
        return 0;  
    double k1,k2,k3,k4;  
    k1 = (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);  
    k2 = (p2.x-p1.x)*(p4.y-p1.y) - (p2.y-p1.y)*(p4.x-p1.x);  
    k3 = (p4.x-p3.x)*(p1.y-p3.y) - (p4.y-p3.y)*(p1.x-p3.x);  
    k4 = (p4.x-p3.x)*(p2.y-p3.y) - (p4.y-p3.y)*(p2.x-p3.x);  
    return (k1*k2<=EPS && k3*k4<=EPS);  
}  

// 获取点的坐标函数
void lx_getPoint( void )
{
	lx_n=76;
	lx_m=76;
	int i;
	for( i = 0 ; i < 20 ; ++i )	{
		lx_R[i].x=1;
		lx_R[i].y=i+1;
		lx_Q[i].x=1;
		lx_Q[i].y=i+1;
	}
	for( i = 19 ; i < 39 ; ++i )	{
		lx_R[i].x=i-18;
		lx_R[i].y=20;
		lx_Q[i].x=i-18;
		lx_Q[i].y=20;
	}
	for( i = 38 ; i < 58 ; ++i )	{
		lx_R[i].x=20;
		lx_R[i].y=58-i;
		lx_Q[i].x=20;
		lx_Q[i].y=58-i;
	}
	for( i = 57 ; i < 76 ; ++i )	{
		lx_R[i].x=77-i;
		lx_R[i].y=1;
		lx_Q[i].x=77-i;
		lx_Q[i].y=1;
	}

}


int main( int argc , char *argv[] )
{
	MPI_Comm comm = MPI_COMM_WORLD;	
	int rank ,size,i,j,ans;
	int rslt,myrslt,loop;
	double lx_t1,lx_t2;
	char processor_name[MPI_MAX_PROCESSOR_NAME];
	int namelen;

	MPI_Init(&argc,&argv);
	MPI_Comm_rank(MPI_COMM_WORLD,&rank);
	MPI_Comm_size(MPI_COMM_WORLD,&size);
	MPI_Get_processor_name(processor_name,&namelen);
	
	
	if( rank == 0 )	{
		// 获取点坐标集合
		lx_getPoint();

		lx_t1=MPI_Wtime();
	}

	loop = 0;
	while( loop < 100 )
	{

		// 广播两个多边形的点集合
		MPI_Bcast(&lx_n,1,MPI_INT,0,MPI_COMM_WORLD);
		MPI_Bcast(&lx_m,1,MPI_INT,0,MPI_COMM_WORLD);

		for( i = 0 ; i < lx_n ;++i )		{
			MPI_Bcast(&lx_R[i].x,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
			MPI_Bcast(&lx_R[i].y,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
		}
		for( j= 0 ; j < lx_m ;++j)	{
			MPI_Bcast(&lx_Q[j].x,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
			MPI_Bcast(&lx_Q[j].y,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
		}

		rslt = 0;
		for( i = rank ; i<lx_n ; i+=size )	{
			for( j = 0; j < lx_m ; ++j )	{
				if( lx_inter( lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m] ) )
					rslt= 1;
			}
		}
		myrslt = rslt;
		MPI_Reduce(&myrslt,&ans,1,MPI_INT,MPI_SUM,0,comm);

		++loop;
	}
	if( rank == 0 )	{
		if( ans > 0 )	printf("两多边形相交!\n");
		else	printf("两多边形不相交!\n");
		lx_t2=MPI_Wtime();
		printf("时间为 %lf \n ",lx_t2-lx_t1);
	}
	

	MPI_Finalize();
	system("pause");
	return 0;
}


3.3 Java 方法

3.3.1 Java Thread 方法

  1. package lx_polygonCrossing_javaThread;  
  2.   
  3. public class lx_polygonCrossingThread extends Thread {  
  4.   
  5.     private int start,end,lx_n,lx_m;  
  6.     private boolean isCross = false;  
  7.       
  8.     private double EPS = 1e-10;  
  9.     public lx_Point[] lx_R = new lx_Point[100001];  
  10.     public lx_Point[] lx_Q = new lx_Point[100001];  
  11.       
  12.     public double Max( double x , double y )    {  
  13.         return x>y?x:y;  
  14.     }  
  15.     public double Min( double x , double y )    {  
  16.         return x<y?x:y;  
  17.     }  
  18.       
  19.     public  boolean lx_inter(lx_Point p1,lx_Point p2,lx_Point p3,lx_Point p4)    
  20.     {     
  21.         if( Min(p1.x,p2.x)>Max(p3.x,p4.x) ||    
  22.            Min(p1.y,p2.y)>Max(p3.y,p4.y) ||    
  23.            Min(p3.x,p4.x)>Max(p1.x,p2.x) ||    
  24.            Min(p3.y,p4.y)>Max(p1.y,p2.y) )    
  25.             return false;    
  26.         double k1,k2,k3,k4;    
  27.         k1 = (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);    
  28.         k2 = (p2.x-p1.x)*(p4.y-p1.y) - (p2.y-p1.y)*(p4.x-p1.x);    
  29.         k3 = (p4.x-p3.x)*(p1.y-p3.y) - (p4.y-p3.y)*(p1.x-p3.x);    
  30.         k4 = (p4.x-p3.x)*(p2.y-p3.y) - (p4.y-p3.y)*(p2.x-p3.x);    
  31.         return (k1*k2<=EPS && k3*k4<=EPS);    
  32.     }    
  33.       
  34.     public void lx_getPoint( )  
  35.     {  
  36.         forint k = 0 ; k < 100001 ; ++k )  
  37.             lx_R[k] = new lx_Point();  
  38.         forint k = 0 ;k < 100001 ; ++k )  
  39.             lx_Q[k] = new lx_Point();  
  40.           
  41.         int i,j=0;  
  42.         for( i = 1 ;i <= 7600 ; ++i,++j )    {  
  43.             lx_R[j].x=1;  
  44.             lx_R[j].y=i;  
  45.             lx_Q[j].x=1;  
  46.             lx_Q[j].y=i;  
  47.         }  
  48.         for( i = 2 ; i <= 7600 ; ++i,++j )   {  
  49.             lx_R[j].x=i;  
  50.             lx_R[j].y=7600;  
  51.             lx_Q[j].x=i;  
  52.             lx_Q[j].y=7600;  
  53.         }  
  54.         for( i = 7599 ; i > 0 ; --i,++j )    {  
  55.             lx_R[j].x=7600;  
  56.             lx_R[j].y=i;  
  57.             lx_Q[j].x=7600;  
  58.             lx_Q[j].y=i;  
  59.         }  
  60.         for( i = 7599 ; i > 0 ; --i,++j )    {  
  61.             lx_R[j].x=i;  
  62.             lx_R[j].y=1;  
  63.             lx_Q[j].x=i;  
  64.             lx_Q[j].y=1;  
  65.         }  
  66.   
  67.   
  68.     }  
  69.       
  70.     public lx_polygonCrossingThread(int start,int end,int lx_n,int lx_m)    {  
  71.         super();  
  72.         this.start=start;  
  73.         this.end=end;  
  74.         this.lx_n=lx_n;  
  75.         this.lx_m=lx_m;  
  76.     }  
  77.       
  78.     public void run()   {  
  79.         forint i = start ; i < end ; ++i )   
  80.             forint j = 0 ; j < lx_m ; ++j )      
  81.                 if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )  
  82.                     isCross = true;  
  83.     }  
  84.       
  85.     public boolean getIscross( )    {  
  86.         return isCross;  
  87.     }  
  88.       
  89.     public void runS()  {  
  90.         forint i = 0 ; i < lx_n ; ++i )  
  91.             forint j = 0 ; j < lx_m ; ++j )  
  92.                 if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )  
  93.                     isCross = true;  
  94.     }  
  95.       
  96.       
  97.     public static void main(String[] args) throws InterruptedException {  
  98.         // TODO Auto-generated method stub  
  99.           
  100.         lx_polygonCrossingThread thread1 = new lx_polygonCrossingThread(0,30396/2,30396,30396);  
  101.         lx_polygonCrossingThread thread2 = new lx_polygonCrossingThread(30396/2,30396,30396,30396);  
  102.         thread1.lx_getPoint();  
  103.         thread2.lx_getPoint();  
  104.           
  105.         long startTime = System.currentTimeMillis();  
  106.         thread1.start();  
  107.         thread2.start();  
  108.         thread1.join();  
  109.         thread2.join();  
  110.         long endTime = System.currentTimeMillis();  
  111.           
  112.         if( thread1.getIscross() || thread2.getIscross() )  
  113.             System.out.println("两多边形相交!");  
  114.         else  
  115.             System.out.println("两多边形不相交!");  
  116.         System.out.println("并行时间="+(endTime-startTime));  
  117.           
  118.           
  119.         startTime=System.currentTimeMillis();  
  120.         lx_polygonCrossingThread serial = new lx_polygonCrossingThread(0,30396/2,30396,30396);  
  121.         serial.lx_getPoint();  
  122.         serial.runS();  
  123.         endTime=System.currentTimeMillis();  
  124.         if( serial.getIscross() )  
  125.             System.out.println("两多边形相交!");  
  126.         else  
  127.             System.out.println("两多边形不相交!");  
  128.         System.out.println("串行时间="+(endTime-startTime));  
  129.     }  
  130.   
  131. }  
package lx_polygonCrossing_javaThread;

public class lx_polygonCrossingThread extends Thread {

	private int start,end,lx_n,lx_m;
	private boolean isCross = false;
	
	private double EPS = 1e-10;
	public lx_Point[] lx_R = new lx_Point[100001];
	public lx_Point[] lx_Q = new lx_Point[100001];
	
	public double Max( double x , double y )	{
		return x>y?x:y;
	}
	public double Min( double x , double y )	{
		return x<y?x:y;
	}
	
	public	boolean lx_inter(lx_Point p1,lx_Point p2,lx_Point p3,lx_Point p4)  
	{   
	    if( Min(p1.x,p2.x)>Max(p3.x,p4.x) ||  
	       Min(p1.y,p2.y)>Max(p3.y,p4.y) ||  
	       Min(p3.x,p4.x)>Max(p1.x,p2.x) ||  
	       Min(p3.y,p4.y)>Max(p1.y,p2.y) )  
	        return false;  
	    double k1,k2,k3,k4;  
	    k1 = (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);  
	    k2 = (p2.x-p1.x)*(p4.y-p1.y) - (p2.y-p1.y)*(p4.x-p1.x);  
	    k3 = (p4.x-p3.x)*(p1.y-p3.y) - (p4.y-p3.y)*(p1.x-p3.x);  
	    k4 = (p4.x-p3.x)*(p2.y-p3.y) - (p4.y-p3.y)*(p2.x-p3.x);  
	    return (k1*k2<=EPS && k3*k4<=EPS);  
	}  
	
	public void lx_getPoint( )
	{
		for( int k = 0 ; k < 100001 ; ++k )
			lx_R[k] = new lx_Point();
		for( int k = 0 ;k < 100001 ; ++k )
			lx_Q[k] = new lx_Point();
		
		int i,j=0;
		for( i = 1 ;i <= 7600 ; ++i,++j )	{
			lx_R[j].x=1;
			lx_R[j].y=i;
			lx_Q[j].x=1;
			lx_Q[j].y=i;
		}
		for( i = 2 ; i <= 7600 ; ++i,++j )	{
			lx_R[j].x=i;
			lx_R[j].y=7600;
			lx_Q[j].x=i;
			lx_Q[j].y=7600;
		}
		for( i = 7599 ; i > 0 ; --i,++j )	{
			lx_R[j].x=7600;
			lx_R[j].y=i;
			lx_Q[j].x=7600;
			lx_Q[j].y=i;
		}
		for( i = 7599 ; i > 0 ; --i,++j )	{
			lx_R[j].x=i;
			lx_R[j].y=1;
			lx_Q[j].x=i;
			lx_Q[j].y=1;
		}


	}
	
	public lx_polygonCrossingThread(int start,int end,int lx_n,int lx_m)	{
		super();
		this.start=start;
		this.end=end;
		this.lx_n=lx_n;
		this.lx_m=lx_m;
	}
	
	public void run()	{
		for( int i = start ; i < end ; ++i )	
			for( int j = 0 ; j < lx_m ; ++j )	
				if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )
					isCross = true;
	}
	
	public boolean getIscross( )	{
		return isCross;
	}
	
	public void runS()	{
		for( int i = 0 ; i < lx_n ; ++i )
			for( int j = 0 ; j < lx_m ; ++j )
				if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )
					isCross = true;
	}
	
	
	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub
		
		lx_polygonCrossingThread thread1 = new lx_polygonCrossingThread(0,30396/2,30396,30396);
		lx_polygonCrossingThread thread2 = new lx_polygonCrossingThread(30396/2,30396,30396,30396);
		thread1.lx_getPoint();
		thread2.lx_getPoint();
		
		long startTime = System.currentTimeMillis();
		thread1.start();
		thread2.start();
		thread1.join();
		thread2.join();
		long endTime = System.currentTimeMillis();
		
		if( thread1.getIscross() || thread2.getIscross() )
			System.out.println("两多边形相交!");
		else
			System.out.println("两多边形不相交!");
		System.out.println("并行时间="+(endTime-startTime));
		
		
		startTime=System.currentTimeMillis();
		lx_polygonCrossingThread serial = new lx_polygonCrossingThread(0,30396/2,30396,30396);
		serial.lx_getPoint();
		serial.runS();
		endTime=System.currentTimeMillis();
		if( serial.getIscross() )
			System.out.println("两多边形相交!");
		else
			System.out.println("两多边形不相交!");
		System.out.println("串行时间="+(endTime-startTime));
	}

}


3.3.2 Java Runnable 方法

  1. package lx_polygonCrossing_javaRunnable;  
  2.   
  3. public class lx_polygonCrossingRunnable {  
  4.   
  5.     public static void main(String[] args) throws InterruptedException {  
  6.         work work1 = new work(0,30396/2,30396,30396);  
  7.         work work2 = new work(30396/2,30396,30396,30396);  
  8.         work1.lx_getPoint();  
  9.         work2.lx_getPoint();  
  10.         Thread thread1 = new Thread(work1);  
  11.         Thread thread2 = new Thread(work2);  
  12.         long startTime = System.currentTimeMillis();  
  13.         thread1.start();  
  14.         thread2.start();  
  15.         thread1.join();  
  16.         thread2.join();  
  17.         long endTime = System.currentTimeMillis();  
  18.         if( work1.getIscross() || work2.getIscross() )  
  19.             System.out.println("两多边形相交!");  
  20.         else  
  21.             System.out.println("两多边形不相交!");  
  22.         System.out.println("并行时间="+(endTime-startTime));  
  23.           
  24.       
  25.         startTime = System.currentTimeMillis();  
  26.         work work = new work(0,30396/2,30396,30396);  
  27.         work.lx_getPoint();  
  28.         boolean isC = work.runS();  
  29.         endTime = System.currentTimeMillis();  
  30.         if( isC )  
  31.             System.out.println("两多边形相交!");  
  32.         else  
  33.             System.out.println("两多边形不相交!");  
  34.         System.out.println("串行时间="+(endTime-startTime));  
  35.   
  36.     }  
  37.   
  38. }  
  39.   
  40. class work implements Runnable {  
  41.     private int start,end,lx_n,lx_m;  
  42.     private boolean isCross = false;  
  43.       
  44.     private double EPS = 1e-10;  
  45.     public lx_Point[] lx_R = new lx_Point[100001];  
  46.     public lx_Point[] lx_Q = new lx_Point[100001];  
  47.       
  48.     public double Max( double x , double y )    {  
  49.         return x>y?x:y;  
  50.     }  
  51.     public double Min( double x , double y )    {  
  52.         return x<y?x:y;  
  53.     }  
  54.       
  55.     public  boolean lx_inter(lx_Point p1,lx_Point p2,lx_Point p3,lx_Point p4)    
  56.     {     
  57.         if( Min(p1.x,p2.x)>Max(p3.x,p4.x) ||    
  58.            Min(p1.y,p2.y)>Max(p3.y,p4.y) ||    
  59.            Min(p3.x,p4.x)>Max(p1.x,p2.x) ||    
  60.            Min(p3.y,p4.y)>Max(p1.y,p2.y) )    
  61.             return false;    
  62.         double k1,k2,k3,k4;    
  63.         k1 = (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);    
  64.         k2 = (p2.x-p1.x)*(p4.y-p1.y) - (p2.y-p1.y)*(p4.x-p1.x);    
  65.         k3 = (p4.x-p3.x)*(p1.y-p3.y) - (p4.y-p3.y)*(p1.x-p3.x);    
  66.         k4 = (p4.x-p3.x)*(p2.y-p3.y) - (p4.y-p3.y)*(p2.x-p3.x);    
  67.         return (k1*k2<=EPS && k3*k4<=EPS);    
  68.     }    
  69.       
  70.     public void lx_getPoint( )  
  71.     {  
  72.         forint k = 0 ; k < 100001 ; ++k )  
  73.             lx_R[k] = new lx_Point();  
  74.         forint k = 0 ;k < 100001 ; ++k )  
  75.             lx_Q[k] = new lx_Point();  
  76.           
  77.         int i,j=0;  
  78.         for( i = 1 ;i <= 7600 ; ++i,++j )    {  
  79.             lx_R[j].x=1;  
  80.             lx_R[j].y=i;  
  81.             lx_Q[j].x=1;  
  82.             lx_Q[j].y=i;  
  83.         }  
  84.         for( i = 2 ; i <= 7600 ; ++i,++j )   {  
  85.             lx_R[j].x=i;  
  86.             lx_R[j].y=7600;  
  87.             lx_Q[j].x=i;  
  88.             lx_Q[j].y=7600;  
  89.         }  
  90.         for( i = 7599 ; i > 0 ; --i,++j )    {  
  91.             lx_R[j].x=7600;  
  92.             lx_R[j].y=i;  
  93.             lx_Q[j].x=7600;  
  94.             lx_Q[j].y=i;  
  95.         }  
  96.         for( i = 7599 ; i > 0 ; --i,++j )    {  
  97.             lx_R[j].x=i;  
  98.             lx_R[j].y=1;  
  99.             lx_Q[j].x=i;  
  100.             lx_Q[j].y=1;  
  101.         }  
  102.           
  103.     }  
  104.       
  105.     public work(int start,int end,int lx_n,int lx_m)    {  
  106.         super();  
  107.         this.start=start;  
  108.         this.end=end;  
  109.         this.lx_n=lx_n;  
  110.         this.lx_m=lx_m;  
  111.     }  
  112.       
  113.     public void run()   {  
  114.         forint i = start ; i < end ; ++i )   
  115.             forint j = 0 ; j < lx_m ; ++j )      
  116.                 if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )  
  117.                     isCross = true;  
  118.     }  
  119.       
  120.     public boolean getIscross( )    {  
  121.         return isCross;  
  122.     }  
  123.       
  124.     public boolean runS()   {  
  125.         boolean isC=false;  
  126.         forint i = 0 ; i < lx_n ; ++i )  
  127.             forint j = 0 ; j < lx_m ; ++j )  
  128.                 if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )  
  129.                     isC = true;  
  130.         return isC;  
  131.     }  
  132. }  
package lx_polygonCrossing_javaRunnable;

public class lx_polygonCrossingRunnable {

	public static void main(String[] args) throws InterruptedException {
		work work1 = new work(0,30396/2,30396,30396);
		work work2 = new work(30396/2,30396,30396,30396);
		work1.lx_getPoint();
		work2.lx_getPoint();
		Thread thread1 = new Thread(work1);
		Thread thread2 = new Thread(work2);
		long startTime = System.currentTimeMillis();
		thread1.start();
		thread2.start();
		thread1.join();
		thread2.join();
		long endTime = System.currentTimeMillis();
		if( work1.getIscross() || work2.getIscross() )
			System.out.println("两多边形相交!");
		else
			System.out.println("两多边形不相交!");
		System.out.println("并行时间="+(endTime-startTime));
		
	
		startTime = System.currentTimeMillis();
		work work = new work(0,30396/2,30396,30396);
		work.lx_getPoint();
		boolean isC = work.runS();
		endTime = System.currentTimeMillis();
		if( isC )
			System.out.println("两多边形相交!");
		else
			System.out.println("两多边形不相交!");
		System.out.println("串行时间="+(endTime-startTime));

	}

}

class work implements Runnable {
	private int start,end,lx_n,lx_m;
	private boolean isCross = false;
	
	private double EPS = 1e-10;
	public lx_Point[] lx_R = new lx_Point[100001];
	public lx_Point[] lx_Q = new lx_Point[100001];
	
	public double Max( double x , double y )	{
		return x>y?x:y;
	}
	public double Min( double x , double y )	{
		return x<y?x:y;
	}
	
	public	boolean lx_inter(lx_Point p1,lx_Point p2,lx_Point p3,lx_Point p4)  
	{   
	    if( Min(p1.x,p2.x)>Max(p3.x,p4.x) ||  
	       Min(p1.y,p2.y)>Max(p3.y,p4.y) ||  
	       Min(p3.x,p4.x)>Max(p1.x,p2.x) ||  
	       Min(p3.y,p4.y)>Max(p1.y,p2.y) )  
	        return false;  
	    double k1,k2,k3,k4;  
	    k1 = (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);  
	    k2 = (p2.x-p1.x)*(p4.y-p1.y) - (p2.y-p1.y)*(p4.x-p1.x);  
	    k3 = (p4.x-p3.x)*(p1.y-p3.y) - (p4.y-p3.y)*(p1.x-p3.x);  
	    k4 = (p4.x-p3.x)*(p2.y-p3.y) - (p4.y-p3.y)*(p2.x-p3.x);  
	    return (k1*k2<=EPS && k3*k4<=EPS);  
	}  
	
	public void lx_getPoint( )
	{
		for( int k = 0 ; k < 100001 ; ++k )
			lx_R[k] = new lx_Point();
		for( int k = 0 ;k < 100001 ; ++k )
			lx_Q[k] = new lx_Point();
		
		int i,j=0;
		for( i = 1 ;i <= 7600 ; ++i,++j )	{
			lx_R[j].x=1;
			lx_R[j].y=i;
			lx_Q[j].x=1;
			lx_Q[j].y=i;
		}
		for( i = 2 ; i <= 7600 ; ++i,++j )	{
			lx_R[j].x=i;
			lx_R[j].y=7600;
			lx_Q[j].x=i;
			lx_Q[j].y=7600;
		}
		for( i = 7599 ; i > 0 ; --i,++j )	{
			lx_R[j].x=7600;
			lx_R[j].y=i;
			lx_Q[j].x=7600;
			lx_Q[j].y=i;
		}
		for( i = 7599 ; i > 0 ; --i,++j )	{
			lx_R[j].x=i;
			lx_R[j].y=1;
			lx_Q[j].x=i;
			lx_Q[j].y=1;
		}
		
	}
	
	public work(int start,int end,int lx_n,int lx_m)	{
		super();
		this.start=start;
		this.end=end;
		this.lx_n=lx_n;
		this.lx_m=lx_m;
	}
	
	public void run()	{
		for( int i = start ; i < end ; ++i )	
			for( int j = 0 ; j < lx_m ; ++j )	
				if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )
					isCross = true;
	}
	
	public boolean getIscross( )	{
		return isCross;
	}
	
	public boolean runS()	{
		boolean isC=false;
		for( int i = 0 ; i < lx_n ; ++i )
			for( int j = 0 ; j < lx_m ; ++j )
				if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )
					isC = true;
		return isC;
	}
}


3.4 Windows 方法

3.4.1 win32 方法

  1. #include "stdafx.h"  
  2. #include <Windows.h>  
  3. #include "time.h"  
  4.   
  5. const double EPS = 1e-10;  
  6. struct lx_Point  
  7. {  
  8.     double x,y;  
  9. }lx_R[40000],lx_Q[40000];  
  10.   
  11. HANDLE finish[2];  
  12. HANDLE finish2;  
  13. int lx_n,lx_m;  
  14. bool isCross[2];  
  15.   
  16. double Max( double x , double y )   {  
  17.     return x>y?x:y;  
  18. }  
  19. double Min( double x , double y )   {  
  20.     return x<y?x:y;  
  21. }  
  22.   
  23. bool lx_inter(lx_Point p1,lx_Point p2,lx_Point p3,lx_Point p4)    
  24. {     
  25.     if( Min(p1.x,p2.x)>Max(p3.x,p4.x) ||    
  26.         Min(p1.y,p2.y)>Max(p3.y,p4.y) ||    
  27.         Min(p3.x,p4.x)>Max(p1.x,p2.x) ||    
  28.         Min(p3.y,p4.y)>Max(p1.y,p2.y) )    
  29.         return false;    
  30.     double k1,k2,k3,k4;    
  31.     k1 = (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);    
  32.     k2 = (p2.x-p1.x)*(p4.y-p1.y) - (p2.y-p1.y)*(p4.x-p1.x);    
  33.     k3 = (p4.x-p3.x)*(p1.y-p3.y) - (p4.y-p3.y)*(p1.x-p3.x);    
  34.     k4 = (p4.x-p3.x)*(p2.y-p3.y) - (p4.y-p3.y)*(p2.x-p3.x);    
  35.     return (k1*k2<=EPS && k3*k4<=EPS);    
  36. }    
  37.   
  38. void lx_getPoint( )  
  39. {  
  40.     lx_n=3036;  
  41.     lx_m=3036;  
  42.     int i,j=0;  
  43.         for( i = 1 ;i <= 760 ; ++i,++j ) {  
  44.             lx_R[j].x=1;  
  45.             lx_R[j].y=i;  
  46.             lx_Q[j].x=1;  
  47.             lx_Q[j].y=i;  
  48.         }  
  49.         for( i = 2 ; i <= 760 ; ++i,++j )    {  
  50.             lx_R[j].x=i;  
  51.             lx_R[j].y=760;  
  52.             lx_Q[j].x=i;  
  53.             lx_Q[j].y=760;  
  54.         }  
  55.         for( i = 759 ; i > 0 ; --i,++j ) {  
  56.             lx_R[j].x=760;  
  57.             lx_R[j].y=i;  
  58.             lx_Q[j].x=760;  
  59.             lx_Q[j].y=i;  
  60.         }  
  61.         for( i = 759 ; i > 0 ; --i,++j ) {  
  62.             lx_R[j].x=i;  
  63.             lx_R[j].y=1;  
  64.             lx_Q[j].x=i;  
  65.             lx_Q[j].y=1;  
  66.         }  
  67.   
  68. }  
  69.   
  70. DWORD WINAPI ThreadOne(LPVOID param)        {  
  71.     forint i = 0 ; i < lx_n/2 ; ++i )    
  72.         forint j = 0 ; j < lx_m ; ++j )      
  73.             if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )  
  74.                 isCross[0] = true;  
  75.     SetEvent( finish[0] );  
  76.     return 0;  
  77. }  
  78.   
  79. DWORD WINAPI ThreadTwo(LPVOID param)    {  
  80.     forint i = lx_n/2 ; i < lx_n ; ++i )  
  81.         forint j = 0 ; j < lx_m ; ++j )  
  82.             if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )  
  83.                 isCross[1] = true;  
  84.     SetEvent( finish[1] );  
  85.     return 0;  
  86. }  
  87.   
  88. DWORD WINAPI ThreadThree(LPVOID param)      {  
  89.     bool isCrossS=false;  
  90.     forint i = 0 ; i < lx_n ; ++i )  
  91.         forint j = 0 ; j < lx_m ; ++j )  
  92.             if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )  
  93.                 isCrossS = true;  
  94.     if( isCrossS )  printf("两多边形相交!\n");  
  95.     else    printf("两多边形不相交!\n");  
  96.   
  97.     SetEvent(finish2);  
  98.     return 0;  
  99. }  
  100.   
  101. int _tmain(int argc, _TCHAR* argv[])  
  102. {  
  103.     lx_getPoint();  
  104.       
  105.     clock_t start=clock();  
  106.     finish[0] = CreateEvent(NULL,false,false,NULL);  
  107.     finish[1] = CreateEvent(NULL,false,false,NULL);  
  108.     HANDLE thread1 = CreateThread(NULL,0,ThreadOne,NULL,0,NULL);  
  109.     HANDLE thread2 = CreateThread(NULL,0,ThreadTwo,NULL,0,NULL);  
  110.     WaitForMultipleObjects(2,finish,true,INFINITE);  
  111.     clock_t end = clock();  
  112.     if( isCross[0] || isCross[1] )  
  113.         printf("两多边形相交!\n");  
  114.     else  
  115.         printf("两多边形不相交!\n");  
  116.     printf("andtime=%d\n",end-start);  
  117.   
  118.   
  119.     clock_t start2 = clock();  
  120.     finish2 = CreateEvent(NULL,false,false,NULL);  
  121.     HANDLE thread3 = CreateThread(NULL,0,ThreadThree,NULL,0,NULL);  
  122.     WaitForSingleObject(finish2,INFINITE);  
  123.     clock_t end2 = clock();  
  124.     printf("serialtime=%d\n",end2-start2);  
  125.   
  126.     system("pause");  
  127.     return 0;  
  128. }  
#include "stdafx.h"
#include <Windows.h>
#include "time.h"

const double EPS = 1e-10;
struct lx_Point
{
	double x,y;
}lx_R[40000],lx_Q[40000];

HANDLE finish[2];
HANDLE finish2;
int lx_n,lx_m;
bool isCross[2];

double Max( double x , double y )	{
	return x>y?x:y;
}
double Min( double x , double y )	{
	return x<y?x:y;
}

bool lx_inter(lx_Point p1,lx_Point p2,lx_Point p3,lx_Point p4)  
{   
	if( Min(p1.x,p2.x)>Max(p3.x,p4.x) ||  
		Min(p1.y,p2.y)>Max(p3.y,p4.y) ||  
		Min(p3.x,p4.x)>Max(p1.x,p2.x) ||  
		Min(p3.y,p4.y)>Max(p1.y,p2.y) )  
		return false;  
	double k1,k2,k3,k4;  
	k1 = (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);  
	k2 = (p2.x-p1.x)*(p4.y-p1.y) - (p2.y-p1.y)*(p4.x-p1.x);  
	k3 = (p4.x-p3.x)*(p1.y-p3.y) - (p4.y-p3.y)*(p1.x-p3.x);  
	k4 = (p4.x-p3.x)*(p2.y-p3.y) - (p4.y-p3.y)*(p2.x-p3.x);  
	return (k1*k2<=EPS && k3*k4<=EPS);  
}  

void lx_getPoint( )
{
	lx_n=3036;
	lx_m=3036;
	int i,j=0;
		for( i = 1 ;i <= 760 ; ++i,++j )	{
			lx_R[j].x=1;
			lx_R[j].y=i;
			lx_Q[j].x=1;
			lx_Q[j].y=i;
		}
		for( i = 2 ; i <= 760 ; ++i,++j )	{
			lx_R[j].x=i;
			lx_R[j].y=760;
			lx_Q[j].x=i;
			lx_Q[j].y=760;
		}
		for( i = 759 ; i > 0 ; --i,++j )	{
			lx_R[j].x=760;
			lx_R[j].y=i;
			lx_Q[j].x=760;
			lx_Q[j].y=i;
		}
		for( i = 759 ; i > 0 ; --i,++j )	{
			lx_R[j].x=i;
			lx_R[j].y=1;
			lx_Q[j].x=i;
			lx_Q[j].y=1;
		}

}

DWORD WINAPI ThreadOne(LPVOID param)		{
	for( int i = 0 ; i < lx_n/2 ; ++i )	
		for( int j = 0 ; j < lx_m ; ++j )	
			if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )
				isCross[0] = true;
	SetEvent( finish[0] );
	return 0;
}

DWORD WINAPI ThreadTwo(LPVOID param)	{
	for( int i = lx_n/2 ; i < lx_n ; ++i )
		for( int j = 0 ; j < lx_m ; ++j )
			if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )
				isCross[1] = true;
	SetEvent( finish[1] );
	return 0;
}

DWORD WINAPI ThreadThree(LPVOID param)		{
	bool isCrossS=false;
	for( int i = 0 ; i < lx_n ; ++i )
		for( int j = 0 ; j < lx_m ; ++j )
			if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )
				isCrossS = true;
	if( isCrossS )	printf("两多边形相交!\n");
	else	printf("两多边形不相交!\n");

	SetEvent(finish2);
	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	lx_getPoint();
	
	clock_t start=clock();
	finish[0] = CreateEvent(NULL,false,false,NULL);
	finish[1] = CreateEvent(NULL,false,false,NULL);
	HANDLE thread1 = CreateThread(NULL,0,ThreadOne,NULL,0,NULL);
	HANDLE thread2 = CreateThread(NULL,0,ThreadTwo,NULL,0,NULL);
	WaitForMultipleObjects(2,finish,true,INFINITE);
	clock_t end = clock();
	if( isCross[0] || isCross[1] )
		printf("两多边形相交!\n");
	else
		printf("两多边形不相交!\n");
	printf("andtime=%d\n",end-start);


	clock_t start2 = clock();
	finish2 = CreateEvent(NULL,false,false,NULL);
	HANDLE thread3 = CreateThread(NULL,0,ThreadThree,NULL,0,NULL);
	WaitForSingleObject(finish2,INFINITE);
	clock_t end2 = clock();
	printf("serialtime=%d\n",end2-start2);

	system("pause");
	return 0;
}


3.4.2 MFC 方法

  1. #include "stdafx.h"  
  2. #include <afxmt.h>  
  3. #include <afxwin.h>  
  4.   
  5. const double EPS = 1e-10;  
  6. struct lx_Point  
  7. {  
  8.     double x,y;  
  9. }lx_R[80000],lx_Q[80000];  
  10. bool isCross[2];  
  11. int lx_n,lx_m;  
  12.   
  13. CEvent faxEvent(false);  
  14. CEvent faxEvent1(false);  
  15. CEvent faxEvent2(false);  
  16. CSemaphore g_clsSemaphore(2,2);  
  17.   
  18. double Max( double x , double y )   {  
  19.     return x>y?x:y;  
  20. }  
  21. double Min( double x , double y )   {  
  22.     return x<y?x:y;  
  23. }  
  24.   
  25. bool lx_inter(lx_Point p1,lx_Point p2,lx_Point p3,lx_Point p4)    
  26. {     
  27.     if( Min(p1.x,p2.x)>Max(p3.x,p4.x) ||    
  28.         Min(p1.y,p2.y)>Max(p3.y,p4.y) ||    
  29.         Min(p3.x,p4.x)>Max(p1.x,p2.x) ||    
  30.         Min(p3.y,p4.y)>Max(p1.y,p2.y) )    
  31.         return false;    
  32.     double k1,k2,k3,k4;    
  33.     k1 = (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);    
  34.     k2 = (p2.x-p1.x)*(p4.y-p1.y) - (p2.y-p1.y)*(p4.x-p1.x);    
  35.     k3 = (p4.x-p3.x)*(p1.y-p3.y) - (p4.y-p3.y)*(p1.x-p3.x);    
  36.     k4 = (p4.x-p3.x)*(p2.y-p3.y) - (p4.y-p3.y)*(p2.x-p3.x);    
  37.     return (k1*k2<=EPS && k3*k4<=EPS);    
  38. }    
  39.   
  40. void lx_getPoint( )  
  41. {  
  42.     lx_n=3036;  
  43.     lx_m=3036;  
  44.     int i,j=0;  
  45.         for( i = 1 ;i <= 760 ; ++i,++j ) {  
  46.             lx_R[j].x=1;  
  47.             lx_R[j].y=i;  
  48.             lx_Q[j].x=1;  
  49.             lx_Q[j].y=i;  
  50.         }  
  51.         for( i = 2 ; i <= 760 ; ++i,++j )    {  
  52.             lx_R[j].x=i;  
  53.             lx_R[j].y=760;  
  54.             lx_Q[j].x=i;  
  55.             lx_Q[j].y=760;  
  56.         }  
  57.         for( i = 759 ; i > 0 ; --i,++j ) {  
  58.             lx_R[j].x=760;  
  59.             lx_R[j].y=i;  
  60.             lx_Q[j].x=760;  
  61.             lx_Q[j].y=i;  
  62.         }  
  63.         for( i = 759 ; i > 0 ; --i,++j ) {  
  64.             lx_R[j].x=i;  
  65.             lx_R[j].y=1;  
  66.             lx_Q[j].x=i;  
  67.             lx_Q[j].y=1;  
  68.         }  
  69. }  
  70.   
  71. UINT ThreadProc4( LPVOID pParam)    {  
  72.     g_clsSemaphore.Lock();  
  73.     forint i = 0 ; i < lx_n/2 ; ++i )    
  74.         forint j = 0 ; j < lx_m ; ++j )      
  75.             if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )  
  76.                 isCross[0] = true;  
  77.     SetEvent(faxEvent1);  
  78.     return 0;  
  79. }  
  80.   
  81. UINT ThreadProc5( LPVOID pParam)    {  
  82.     g_clsSemaphore.Lock();  
  83.     forint i = lx_n/2 ; i < lx_n ; ++i )  
  84.         forint j = 0 ; j < lx_m ; ++j )  
  85.             if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )  
  86.                 isCross[1] = true;  
  87.     g_clsSemaphore.Unlock();  
  88.     SetEvent(faxEvent2);  
  89.     return 0;  
  90. }  
  91.   
  92. UINT ThreadProc6( LPVOID pParam )   {  
  93.     g_clsSemaphore.Lock();  
  94.     bool isCrossS=false;  
  95.     forint i = 0 ; i < lx_n ; ++i )  
  96.         forint j = 0 ; j < lx_m ; ++j )  
  97.             if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )  
  98.                 isCrossS = true;  
  99.     g_clsSemaphore.Unlock();  
  100.     if( isCrossS )  printf("两多边形相交!\n");  
  101.     else    printf("两多边形不相交!\n");  
  102.     SetEvent(faxEvent);  
  103.     return 0;  
  104. }  
  105.   
  106. int _tmain( int argc, _TCHAR* argv[] )  {  
  107.       
  108.     lx_getPoint();  
  109.       
  110.     clock_t start = clock();  
  111.     AfxBeginThread(ThreadProc4,NULL);  
  112.     AfxBeginThread(ThreadProc5,NULL);  
  113.     WaitForSingleObject(faxEvent1,INFINITE);  
  114.     WaitForSingleObject(faxEvent2,INFINITE);  
  115.       
  116.     if( isCross[0] || isCross[1] )  
  117.         printf("两多边形相交!\n");  
  118.     else  
  119.         printf("两多边形不相交!\n");  
  120.   
  121.     clock_t end = clock();  
  122.     printf("andtime = %d \n",end-start);  
  123.   
  124.       
  125.     clock_t start2 = clock();  
  126.     AfxBeginThread(ThreadProc6,NULL);  
  127.     WaitForSingleObject(faxEvent,INFINITE);  
  128.     clock_t end2 = clock();  
  129.     printf("serialtime = %d \n ",end2-start2);  
  130.       
  131.     system("pause");  
  132.     return 0;  
  133. }  
#include "stdafx.h"
#include <afxmt.h>
#include <afxwin.h>

const double EPS = 1e-10;
struct lx_Point
{
	double x,y;
}lx_R[80000],lx_Q[80000];
bool isCross[2];
int lx_n,lx_m;

CEvent faxEvent(false);
CEvent faxEvent1(false);
CEvent faxEvent2(false);
CSemaphore g_clsSemaphore(2,2);

double Max( double x , double y )	{
	return x>y?x:y;
}
double Min( double x , double y )	{
	return x<y?x:y;
}

bool lx_inter(lx_Point p1,lx_Point p2,lx_Point p3,lx_Point p4)  
{   
	if( Min(p1.x,p2.x)>Max(p3.x,p4.x) ||  
		Min(p1.y,p2.y)>Max(p3.y,p4.y) ||  
		Min(p3.x,p4.x)>Max(p1.x,p2.x) ||  
		Min(p3.y,p4.y)>Max(p1.y,p2.y) )  
		return false;  
	double k1,k2,k3,k4;  
	k1 = (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);  
	k2 = (p2.x-p1.x)*(p4.y-p1.y) - (p2.y-p1.y)*(p4.x-p1.x);  
	k3 = (p4.x-p3.x)*(p1.y-p3.y) - (p4.y-p3.y)*(p1.x-p3.x);  
	k4 = (p4.x-p3.x)*(p2.y-p3.y) - (p4.y-p3.y)*(p2.x-p3.x);  
	return (k1*k2<=EPS && k3*k4<=EPS);  
}  

void lx_getPoint( )
{
	lx_n=3036;
	lx_m=3036;
	int i,j=0;
		for( i = 1 ;i <= 760 ; ++i,++j )	{
			lx_R[j].x=1;
			lx_R[j].y=i;
			lx_Q[j].x=1;
			lx_Q[j].y=i;
		}
		for( i = 2 ; i <= 760 ; ++i,++j )	{
			lx_R[j].x=i;
			lx_R[j].y=760;
			lx_Q[j].x=i;
			lx_Q[j].y=760;
		}
		for( i = 759 ; i > 0 ; --i,++j )	{
			lx_R[j].x=760;
			lx_R[j].y=i;
			lx_Q[j].x=760;
			lx_Q[j].y=i;
		}
		for( i = 759 ; i > 0 ; --i,++j )	{
			lx_R[j].x=i;
			lx_R[j].y=1;
			lx_Q[j].x=i;
			lx_Q[j].y=1;
		}
}

UINT ThreadProc4( LPVOID pParam)	{
	g_clsSemaphore.Lock();
	for( int i = 0 ; i < lx_n/2 ; ++i )	
		for( int j = 0 ; j < lx_m ; ++j )	
			if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )
				isCross[0] = true;
	SetEvent(faxEvent1);
	return 0;
}

UINT ThreadProc5( LPVOID pParam)	{
	g_clsSemaphore.Lock();
	for( int i = lx_n/2 ; i < lx_n ; ++i )
		for( int j = 0 ; j < lx_m ; ++j )
			if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )
				isCross[1] = true;
	g_clsSemaphore.Unlock();
	SetEvent(faxEvent2);
	return 0;
}

UINT ThreadProc6( LPVOID pParam )	{
	g_clsSemaphore.Lock();
	bool isCrossS=false;
	for( int i = 0 ; i < lx_n ; ++i )
		for( int j = 0 ; j < lx_m ; ++j )
			if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )
				isCrossS = true;
	g_clsSemaphore.Unlock();
	if( isCrossS )	printf("两多边形相交!\n");
	else	printf("两多边形不相交!\n");
	SetEvent(faxEvent);
	return 0;
}

int _tmain( int argc, _TCHAR* argv[] )	{
	
	lx_getPoint();
	
	clock_t start = clock();
	AfxBeginThread(ThreadProc4,NULL);
	AfxBeginThread(ThreadProc5,NULL);
	WaitForSingleObject(faxEvent1,INFINITE);
	WaitForSingleObject(faxEvent2,INFINITE);
	
	if( isCross[0] || isCross[1] )
		printf("两多边形相交!\n");
	else
		printf("两多边形不相交!\n");

	clock_t end = clock();
	printf("andtime = %d \n",end-start);

	
	clock_t start2 = clock();
	AfxBeginThread(ThreadProc6,NULL);
	WaitForSingleObject(faxEvent,INFINITE);
	clock_t end2 = clock();
	printf("serialtime = %d \n ",end2-start2);
	
	system("pause");
	return 0;
}


3.4.3 .Net 方法

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading;  
  6. using System.Diagnostics;  
  7.   
  8. namespace lx_polygonCrossingNet  
  9. {  
  10.     class Program  
  11.     {  
  12.         static void Main(string[] args)  
  13.         {  
  14.             Stopwatch stopwatch = new Stopwatch();  
  15.             Work work1 = new Work(0, 3036 / 2, 3036, 3036);  
  16.             ThreadStart thread1 = new ThreadStart( work1.run );  
  17.             Thread newthread1 = new Thread(thread1);  
  18.             Work work2 = new Work(3036 / 2, 3036, 3036, 3036);  
  19.             ThreadStart thread2 = new ThreadStart( work2.run );  
  20.             Thread newthread2 = new Thread(thread2);  
  21.   
  22.             work1.lx_getPoint();  
  23.             work2.lx_getPoint();  
  24.   
  25.             stopwatch.Start();  
  26.             newthread1.Start();  
  27.             newthread2.Start();  
  28.             newthread1.Join();  
  29.             newthread2.Join();  
  30.             stopwatch.Stop();  
  31.   
  32.             TimeSpan timeSpan = stopwatch.Elapsed;  
  33.             double milliseconds = timeSpan.TotalMilliseconds;  
  34.             if( work1.getIscross() || work2.getIscross() )  
  35.                 Console.WriteLine("两多边形相交!");  
  36.             else  
  37.                 Console.WriteLine("两多边形不相交!");  
  38.             Console.Write("parallel time = ");  
  39.             Console.WriteLine(milliseconds);  
  40.   
  41.   
  42.   
  43.             Work work = new Work(0, 3036, 3036, 3036);  
  44.             work.lx_getPoint();  
  45.             stopwatch.Start();  
  46.               
  47.             if ( work.runS() )  
  48.                 Console.WriteLine("两多边形相交!");  
  49.             else  
  50.                 Console.WriteLine("两多边形不相交!");  
  51.             stopwatch.Stop();  
  52.             TimeSpan timeSpan2=stopwatch.Elapsed;  
  53.             double milliseconds2 = timeSpan2.TotalMilliseconds;  
  54.             Console.Write("serial time=");  
  55.             Console.WriteLine(milliseconds2);  
  56.             Console.Read();  
  57.         }  
  58.     }  
  59.   
  60.     class lx_Point  
  61.     {  
  62.         public double x;  
  63.         public double y;  
  64.         public lx_Point()  
  65.         {  
  66.             this.x = 0;  
  67.             this.y = 0;  
  68.         }  
  69.     }  
  70.   
  71.     class Work  
  72.     {  
  73.         private int start,end,lx_n,lx_m;  
  74.         private bool isCross = false;  
  75.       
  76.         private double EPS = 1e-10;  
  77.         public lx_Point[] lx_R = new lx_Point[100001];  
  78.         public lx_Point[] lx_Q = new lx_Point[100001];  
  79.       
  80.         public double Max( double x , double y )    {  
  81.             return x>y?x:y;  
  82.         }  
  83.         public double Min( double x , double y )    {  
  84.             return x<y?x:y;  
  85.         }  
  86.   
  87.         public bool lx_inter(lx_Point p1, lx_Point p2, lx_Point p3, lx_Point p4)    
  88.         {     
  89.             if( Min(p1.x,p2.x)>Max(p3.x,p4.x) ||    
  90.                 Min(p1.y,p2.y)>Max(p3.y,p4.y) ||    
  91.                 Min(p3.x,p4.x)>Max(p1.x,p2.x) ||    
  92.                 Min(p3.y,p4.y)>Max(p1.y,p2.y) )    
  93.                     return false;    
  94.             double k1,k2,k3,k4;    
  95.             k1 = (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);    
  96.             k2 = (p2.x-p1.x)*(p4.y-p1.y) - (p2.y-p1.y)*(p4.x-p1.x);    
  97.             k3 = (p4.x-p3.x)*(p1.y-p3.y) - (p4.y-p3.y)*(p1.x-p3.x);    
  98.             k4 = (p4.x-p3.x)*(p2.y-p3.y) - (p4.y-p3.y)*(p2.x-p3.x);    
  99.             return (k1*k2<=EPS && k3*k4<=EPS);    
  100.         }    
  101.       
  102.         public void lx_getPoint( )  
  103.         {  
  104.             forint k = 0 ; k < 100001 ; ++k )  
  105.                 lx_R[k] = new lx_Point();  
  106.             forint k = 0 ;k < 100001 ; ++k )  
  107.                 lx_Q[k] = new lx_Point();  
  108.           
  109.             int i, j = 0;  
  110.             for (i = 1; i <= 760; ++i, ++j)  
  111.             {  
  112.                 lx_R[j].x = 1;  
  113.                 lx_R[j].y = i;  
  114.                 lx_Q[j].x = 1;  
  115.                 lx_Q[j].y = i;  
  116.             }  
  117.             for (i = 2; i <= 760; ++i, ++j)  
  118.             {  
  119.                 lx_R[j].x = i;  
  120.                 lx_R[j].y = 760;  
  121.                 lx_Q[j].x = i;  
  122.                 lx_Q[j].y = 760;  
  123.             }  
  124.             for (i = 759; i > 0; --i, ++j)  
  125.             {  
  126.                 lx_R[j].x = 760;  
  127.                 lx_R[j].y = i;  
  128.                 lx_Q[j].x = 760;  
  129.                 lx_Q[j].y = i;  
  130.             }  
  131.             for (i = 759; i > 0; --i, ++j)  
  132.             {  
  133.                 lx_R[j].x = i;  
  134.                 lx_R[j].y = 1;  
  135.                 lx_Q[j].x = i;  
  136.                 lx_Q[j].y = 1;  
  137.             }  
  138.               
  139.         }  
  140.       
  141.         public Work(int start,int end,int lx_n,int lx_m)    {  
  142.             this.start=start;  
  143.             this.end=end;  
  144.             this.lx_n=lx_n;  
  145.             this.lx_m=lx_m;  
  146.         }  
  147.       
  148.         public void run()   {  
  149.             forint i = start ; i < end ; ++i )   
  150.                 forint j = 0 ; j < lx_m ; ++j )      
  151.                     if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )  
  152.                         isCross = true;  
  153.         }  
  154.   
  155.         public bool getIscross()  
  156.         {  
  157.             return isCross;  
  158.         }  
  159.   
  160.         public bool runS()  
  161.         {  
  162.             bool isC = false;  
  163.             for (int i = 0; i < lx_n; ++i)  
  164.                 for (int j = 0; j < lx_m; ++j)  
  165.                     if (lx_inter(lx_R[i], lx_R[(i + 1) % lx_n], lx_Q[j], lx_Q[(j + 1) % lx_m]))  
  166.                         isC = true;  
  167.             return isC;  
  168.         }  
  169.     }  
  170. }  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;

namespace lx_polygonCrossingNet
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch stopwatch = new Stopwatch();
            Work work1 = new Work(0, 3036 / 2, 3036, 3036);
            ThreadStart thread1 = new ThreadStart( work1.run );
            Thread newthread1 = new Thread(thread1);
            Work work2 = new Work(3036 / 2, 3036, 3036, 3036);
            ThreadStart thread2 = new ThreadStart( work2.run );
            Thread newthread2 = new Thread(thread2);

            work1.lx_getPoint();
            work2.lx_getPoint();

            stopwatch.Start();
            newthread1.Start();
            newthread2.Start();
            newthread1.Join();
            newthread2.Join();
            stopwatch.Stop();

            TimeSpan timeSpan = stopwatch.Elapsed;
            double milliseconds = timeSpan.TotalMilliseconds;
            if( work1.getIscross() || work2.getIscross() )
			    Console.WriteLine("两多边形相交!");
		    else
                Console.WriteLine("两多边形不相交!");
            Console.Write("parallel time = ");
            Console.WriteLine(milliseconds);



            Work work = new Work(0, 3036, 3036, 3036);
            work.lx_getPoint();
            stopwatch.Start();
            
            if ( work.runS() )
                Console.WriteLine("两多边形相交!");
            else
                Console.WriteLine("两多边形不相交!");
            stopwatch.Stop();
            TimeSpan timeSpan2=stopwatch.Elapsed;
            double milliseconds2 = timeSpan2.TotalMilliseconds;
            Console.Write("serial time=");
            Console.WriteLine(milliseconds2);
            Console.Read();
        }
    }

    class lx_Point
    {
        public double x;
        public double y;
        public lx_Point()
        {
            this.x = 0;
            this.y = 0;
        }
    }

    class Work
    {
        private int start,end,lx_n,lx_m;
	    private bool isCross = false;
	
    	private double EPS = 1e-10;
    	public lx_Point[] lx_R = new lx_Point[100001];
    	public lx_Point[] lx_Q = new lx_Point[100001];
	
    	public double Max( double x , double y )	{
    		return x>y?x:y;
    	}
    	public double Min( double x , double y )	{
    		return x<y?x:y;
    	}

        public bool lx_inter(lx_Point p1, lx_Point p2, lx_Point p3, lx_Point p4)  
    	{   
	        if( Min(p1.x,p2.x)>Max(p3.x,p4.x) ||  
	            Min(p1.y,p2.y)>Max(p3.y,p4.y) ||  
	            Min(p3.x,p4.x)>Max(p1.x,p2.x) ||  
	            Min(p3.y,p4.y)>Max(p1.y,p2.y) )  
	                return false;  
            double k1,k2,k3,k4;  
	        k1 = (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);  
	        k2 = (p2.x-p1.x)*(p4.y-p1.y) - (p2.y-p1.y)*(p4.x-p1.x);  
	        k3 = (p4.x-p3.x)*(p1.y-p3.y) - (p4.y-p3.y)*(p1.x-p3.x);  
	        k4 = (p4.x-p3.x)*(p2.y-p3.y) - (p4.y-p3.y)*(p2.x-p3.x);  
	        return (k1*k2<=EPS && k3*k4<=EPS);  
	    }  
	
	    public void lx_getPoint( )
    	{
    		for( int k = 0 ; k < 100001 ; ++k )
    			lx_R[k] = new lx_Point();
    		for( int k = 0 ;k < 100001 ; ++k )
    			lx_Q[k] = new lx_Point();
        
            int i, j = 0;
            for (i = 1; i <= 760; ++i, ++j)
            {
                lx_R[j].x = 1;
                lx_R[j].y = i;
                lx_Q[j].x = 1;
                lx_Q[j].y = i;
            }
            for (i = 2; i <= 760; ++i, ++j)
            {
                lx_R[j].x = i;
                lx_R[j].y = 760;
                lx_Q[j].x = i;
                lx_Q[j].y = 760;
            }
            for (i = 759; i > 0; --i, ++j)
            {
                lx_R[j].x = 760;
                lx_R[j].y = i;
                lx_Q[j].x = 760;
                lx_Q[j].y = i;
            }
            for (i = 759; i > 0; --i, ++j)
            {
                lx_R[j].x = i;
                lx_R[j].y = 1;
                lx_Q[j].x = i;
                lx_Q[j].y = 1;
            }
            
    	}
	
	    public Work(int start,int end,int lx_n,int lx_m)	{
	    	this.start=start;
	    	this.end=end;
	    	this.lx_n=lx_n;
	    	this.lx_m=lx_m;
	    }
	
    	public void run()	{
	    	for( int i = start ; i < end ; ++i )	
		    	for( int j = 0 ; j < lx_m ; ++j )	
	    			if( lx_inter(lx_R[i] , lx_R[(i+1)%lx_n] , lx_Q[j] , lx_Q[(j+1)%lx_m]) )
	    				isCross = true;
    	}

        public bool getIscross()
        {
            return isCross;
        }

        public bool runS()
        {
            bool isC = false;
            for (int i = 0; i < lx_n; ++i)
                for (int j = 0; j < lx_m; ++j)
                    if (lx_inter(lx_R[i], lx_R[(i + 1) % lx_n], lx_Q[j], lx_Q[(j + 1) % lx_m]))
                        isC = true;
            return isC;
        }
    }
}




话说,把这些弄出来,感觉挺不错的,就是测试数据很不好弄。

其他人有弄排序的,随机出来数据就行了,我这个对输入有要求,无法随机输入。

好纠结的说,而且正常来说可以提前跳出(判断出来任何一段线段相交即可),也无法准确测量时间。

所以就特别固定了数据,也不允许提前跳出了。

并行计算,还是挺好玩的,有些遗憾,没弄Hadoop那些了。。




***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值