均匀地划分范围,允许空格和边距

时间:2011-12-06 08:47:31

标签: java math points

我有一个点数组和一个面板。 getWidth()基于小组。想象一下你手中的牌,所以HAND_CARD_WIDTH非常自我解释。此循环的目的是在面板上均匀地设置点,这样做。但是,它允许卡片离开面板,这使它看起来非常糟糕。我想要做的是,无论手中有多少张牌,都要在面板的两侧留出一小块空白边。

这是代码

        int iteration = 1;
        int limiter = getWidth();
        int slice = (limiter/(handsize+1));

        while (points.size() < handsize) {
            int x = slice*(iteration++);
            x -= HAND_CARD_WIDTH/2;
            points.add(new Point(x, y));    
        }

基本上我希望最左边的x至少为20,最右边的getWidth() - 20 - HAND_CARD_WIDTH最多为 if((int)points.get(0).getX() < margin){ int boost = Math.abs(margin - (int)points.get(0).getX()); slice = (boost*2)/handsize; for(Point p : points){ p.x += boost; boost -= slice; } } 。我也希望这些卡片能够均匀分布......我只是想不出正确的方程式(到目前为止这是一个很遗憾的壮举......)。

谢谢,根据回复(所有2个回复)继承了我的用途:

{{1}}

2 个答案:

答案 0 :(得分:1)

不确定我是否理解你的布局,但我认为它是这样的:

  

|余量|空间|卡|空间|卡|空间|余量|

  

|余量|空间|卡|空间|余量|

因此,空格的数量比卡的数量多一个,总宽度是组件宽度减去边距。 componentWidth = numCards x cardWidth +(numCards + 1)x spaceWidth 现在很容易计算出所需的空间(componentWidth - numCards x cardWidth)/(numCards + 1)所以卡的左侧位置是 leftMargin + spaceWidth x cardNum + cardWidth x(cardNum - 1)

当空间为负时必须小心,然后你必须计算卡必须重叠多少。

答案 1 :(得分:0)

试试这个:

final int MARGIN = 20;
int availableWidth = getWidth() - 2 * MARGIN - HAND_CARD_WIDTH;
int cardSpaceWidth = availableWidth / handsize;
for (int i = 0; i < handsize; i++) {
    int x = MARGIN + ((i + 0.5) * cardSpaceWidth) - HAND_CARD_WIDTH / 2;
    points.add(new Point(x, y));
}

所以:

  • 通过从总面板宽度减去边距来计算可用宽度
  • 通过将剩余空间除以卡数来计算每张卡的空间
  • 对于每张卡,我们通过占用卡片空间的中间并减去卡片宽度的一半来计算其最左边的点。

请注意,如果HAND_CARD_WIDTH大于卡的可用空间,则此解决方案卡仍可能会重叠边距。