题目:
解答思路:
(1) 对于判断篱笆的合法性,就是要判断篱笆是否自交。
我们对于两条不相邻的边作判断,就需要求出两条直线的交点。
但是,两条直线的位置并不能反映这两条边(线段)的位置关系,
所以,不仅要求出这两条边所在的直线的交点,还要求出交点相对
两条边的位置。
如下图,两条边1-2 和3-4的交点为5,设有向线段1-5的有向长度为
线段1-2的d1倍,有向线段3-5的有向长度为线段3-4的d2倍,则通过
d1和d2的不同值,就可以得到两条边的位置关系。这样,两条边相
交则有:0<d1<1; 且 0<d2<1
(2) 要找出所有能看见的边。判断一条边是否能被看见,需要判断该边的
每个部分是否都被其他边所挡住。根据题意,对于每条边,只需考虑
是否有一条边与其他边均不相交的光线找到它上面,即在这条边上有
一点与点(X,Y)所连的线段与其他边不相交。
但是,一条边上有无数个点,要选择哪一个点进行判断呢?对于每一
条边,我们先找出挡在这条边前面的所有端点(包含这条边的两个端
点)如下图:点1为人所占的点,边3-4为所考虑的边,则档在边3-4前
面的端点需要满足:d1>1;0<d2<1。找出这些端点后,光线只能从这些
端点之间穿过去,而且对于两个相邻的端点之间,光线或是都能穿过去
,或是被挡住,所以,只要在每两个相邻端点之间找一条光线进行判断
即可。
具体程序实现(Java):