如何将多边形划分为子多边形并为其指定id

时间:2017-03-07 04:45:30

标签: java math hashmap coordinate-systems

我有一个带坐标的多边形

(1,2)
(3,2)
(1,1)
(3,1)

我想将多边形分成9个部分,并为每个部分分配一个数字。例如enter image description here

所以我尝试了

double width =  3-1=2;
double height = 2-1=1;

subpolygon width=2/3=0.667
subpolygon height=1/3=0.33

现在我希望得到子多边形id和它们的坐标,如

1  ->  (1,2),(1.67,2),(1,1.67),(1.67,1.67)

等等。所以我需要一个像下面这样的哈希映射来存储信息。

HashMap<Integer, Double[]> hmap = new HashMap<Integer, Double[]>();

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我会给你一个开始的提示。您真正想要的是一种巧妙或有效的方式来遍历多边形的所有顶点。让我们首先看一下每个子多边形左上角的位置。

从多边形的左上角开始,我们将首先从左向右循环,然后从上到下循环。让sw表示您的子带宽,sh表示您的子高度。

那么每个子多边形左上角的公式是什么?好吧,我们从(min x, max y)开始。这是子多边形1的左上角。然后我们将sw添加到x值以获取子多边形2 (min x + sw, max y)的左上角。然后,子多边形3的左上角是(min x + 2 * sw, max y)

然后我们需要降低sh的高度以获得子多边形4的左上角。这是(min x, max y - sh)。然后我们再次从左到右:(min x + sw, max y - sh)为子多边形5,(min x + 2 * sw, max y - sh)

看到一种模式了吗?下拉另一个高度sh,然后再从左到右: (min x, max y - 2 * sh)(min x + sw, max y - 2 * sh)(min x + 2 * sw, max y - 2 * sh)

因此,如果我让索引i的范围从0到8(这将对应于您的子多项1到9),您可以看到左上角子多边形(i+1)的一般模式是:

(min x + (i % 3) * sw, max y - (i / 3) * sh)

注意前面的(i / 3)是整数(向下舍入)除法,例如对于子多边形8,i = 77 / 3 = 2

我相信这足以让你开始。我个人更喜欢从左下角开始,从左到右,从下到上工作,但我根据你的编号。您可以找到其他角落的类似公式,并且一些思考可以帮助您将这些公式推广到不同的分区(即,将除以3和模3的部分看)。