- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在舞台上的随机位置绘制矩形,我不希望它们重叠。所以对于每个矩形,我需要找一个空白区域来放置它。
我考虑过尝试一个随机位置,验证它是否可用
private function containsRect(r:Rectangle):Boolean {
var free:Boolean = true;
for (var i:int = 0; i < numChildren; i++)
free &&= getChildAt(i).getBounds(this).containsRect(r);
return free;
}
如果它返回 false,尝试另一个随机位置。
问题是,如果没有可用空间,我将永远无法尝试随机位置。
有一个优雅的解决方案吗?
最佳答案
令 S 为舞台的面积。令 A 为我们要绘制的最小矩形的面积。令 N = S/A
一种可能的确定性方法:
当您在空舞台上绘制一个矩形时,这会将舞台分成最多 4 个区域,以适合您的下一个矩形。当你绘制下一个矩形时,一个或两个区域被分成最多 4 个子区域(每个)可以适合一个矩形,等等。你永远不会创建超过 N 个区域,其中 S 是你的舞台面积,并且A 是最小矩形的面积。保留一个区域列表(未排序很好),每个区域由其四个角点表示,每个区域都标有其面积,并使用按面积加权 reservoir sampling水库大小为 1 以选择一个区域,其概率与其面积成正比,最多一次通过列表。然后在该区域的随机位置放置一个矩形。 (从该区域的左下角随机选择一个点,这样您就可以绘制一个以该点为左下角的矩形,而不会撞到顶部或右侧的墙壁。)
如果您不是从空白阶段开始,那么只需在 O(N) 中构建您的可用区域列表(例如,通过以任何顺序在空白阶段重新绘制所有现有矩形),然后再搜索您的第一个指向绘制一个新的矩形。
注意:您可以将水库大小更改为 k 以一步选择接下来的 k 个矩形。
注意 2:您也可以将可用区域存储在一棵树中,每条边的权重等于舞台面积上子树中区域面积的总和。然后,为了在 O(logN) 中选择一个区域,我们递归地选择具有根区域/S 概率面积的根,或者具有概率边权重/S 的每个子树。不过,在重新平衡树时更新权重会很烦人。
一种可能的随机方法:
在舞台上随机选择一个点。如果您可以绘制一个或多个包含该点的矩形(而不仅仅是一个以该点为左下角的矩形),则返回一个包含该点的随机定位的矩形。可以通过一些细微的差别来无偏差地定位矩形,但我会把这个留给你。
在最坏的情况下,只有一个空间恰好足以容纳我们的矩形,而舞台的其余部分已被填满。所以这种方法成功的概率 > 1/N,或者失败的概率 < 1-1/N。重复N次。我们现在失败的概率 < (1-1/N)^N < 1/e。失败是指我们的矩形有空间,但我们没有找到它。成功是指我们找到了一个空间(如果存在的话)。为了获得合理的成功概率,我们对 1/N 的失败概率重复 Nlog(N) 次,或者对 1/e^N 的失败概率重复 N² 次。
总结:尝试随机点直到找到一个空间,在 NlogN(或 N²)次尝试后停止,在这种情况下我们可以确信不存在空间。
关于actionscript-3 - 在舞台上寻找空闲区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/487216/
如图所示,上面的红色框是一个 GridBox,下面是一个带有 Splitpane (ListView) 和 Gridpane (2 Buttons) 的 VBox。我想要实现的是在单击按钮“隐藏>>"
使用 msfconsole 并搜索 linux x64 有效负载。 我遇到过舞台 Actor 、舞台和单曲?它们都有“reverse_tcp”,可以将连接反转回攻击者。然而我尝试查找舞台 Actor
我正在寻找一种将 3 个 LineCharts 放入单个窗口的方法。我的意思是我想让它们并排放置,或者一个在另一个下面。 我一直在寻找实现它的方法,但找不到任何东西。我试图搜索如何将多个场景放入一个阶
我有一个有效的 Web 功能,它使用 html5 视频和 Canvas 来访问设备相机的媒体流,然后拍照并在 Canvas 中渲染图像。效果很好,但我想使用 konvajs stage 而不是 can
我在解决这个问题时遇到了困难,并且我找不到我遇到的这个问题的正确答案。我希望将一个场景/阶段用作打开另一个场景/阶段的按钮,并且两者都通过相同的方法调用。完整的方法如下: public void c
我在 JavaFX 上有一个简单的应用程序,它实际上由几个 Pane 和按钮组成。我不知道如何在舞台调整大小时移动按钮。所以,我希望左下角的按钮即使在调整窗口大小时也始终可见。 这里是节点概览: 这里
来自 Swing 并且是 JavaFX 的新手,我尝试对 Java FX Stages 和 Scenes 进行子类化。但是我很快就遇到了问题,比如初始化过程中找不到我的子类场景的 init 方法。 所
How to animate or move window using clutter_actor_animate? Here's my code and it didn't work. clutte
有没有办法从关联的类 Controller 中获取 FXML 加载文件的 Stage/Window 对象? 特别是,我有一个模态窗口 Controller ,我需要舞台来关闭它。 最佳答案 我找不到解
我将工作代码分为 2 个文件以避免困惑。以前确实有效,但是将所有场景都放在一个类中是非常不愉快的。 以前,当您单击 Sprite 时,它会将您从菜单带到游戏。然后我将游戏组和游戏场景的代码提取到游戏类
我希望能够将 HTML 文本转换为位图,以便在 AlivePDF 中使用。我的测试适用于 TextArea,或者组件是否在舞台上或可见。但我希望能够处理不一定位于屏幕上的文本块。有谁知道如何做到这一点
我有一个 swing 应用程序,我需要在其中运行并打开 JavaFX 场景/阶段。我必须在没有扩展应用程序的情况下运行它。我已经尝试了 Stackoverflow 上发布的大多数解决方案,但没有一个适
我正在寻找一种方法来缩小 Flash 文件的高度。我可以更改宽度,但高度似乎与其所在窗口的大小有关? http://www.bevelite.com.au/test 我正在使用 page-flip.c
我需要在选择组合框元素时重新绘制窗口。如何在 JAVA FX 2.2 中重绘窗口(舞台)? 下面是我的代码 functionComboBox.valueProperty().addListener(n
我是一名优秀的程序员,十分优秀!