***************************************转载请注明出处: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(两多边形不相交)
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(两多边形不相交)
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 方法
#include "stdafx.h"
#include "omp.h"
#include <time.h>
#include <windows.h>
// 设置相交精度与多边形点个数的上限
const double EPS = 1e-10;
const int MAX &