- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一组不同大小的矩形:
所有矩形都被约束在Y方向,即Y坐标是固定的,只能沿X轴移动。现在,我想以相等的分布间距水平排列所有这些矩形,但其中一些(图片中的灰色矩形)受到左右邻居(红色矩形)的约束,但也受到下面的矩形和以上也是。
编辑:矩形的初始位置按行顺序定义。此外,在我的第一次实现尝试中,我还在每一行中存储了垂直矩形的存在,它们与两行或更多行重叠,如下所示:
Row 1: {id:1,w:15,h:10},{id:2,w:10,h:40},{id:3,w:10,h:40},{id:4,w:20,h:10}
Row 2: {id:2,w:10,h:40},{id:5,w:10,h:40},{id:3,w:10,h:40},{id:6,w:10,h:10},{id:7,w:10,h:10}
Row 3: {id:8,w:10,h:10},{id:9,w:18,h:10},{id:5,w:10,h:40},{id:10,w:10,h:10}
我正在寻找一种算法来水平分布所有这些矩形,以便每个最近的矩形的左右间距相同,如图所示。
编辑 2:任何提示如何处理更高的复杂性,也将不胜感激:
最佳答案
使用最左边的坐标从左到右对矩形进行排序,如下图所示:
然后,从左到右遍历每个矩形,并查看它们左侧的哪些矩形与它们垂直重叠(即,如果您将它们向左移动,它们会碰到哪些矩形)。
A and B reach the left window edge without bumping into any other rectangles.
C bumps into A.
D bumps into B.
E bumps into A, C and D.
F bumps into B, D and E.
G bumps into D, E and F.
H bumps into A, C and E.
I bumps into B, D and F.
J bumps into D, E, F and G.
使用此信息构建如下图所示的图表。当一个矩形碰到其他几个矩形时,例如E 撞到 A、C 和 D,这些矩形本身是同一分支的一部分,例如A 和 C,然后只将它连接到最右边的矩形,即矩形 C。
然后,将每个矩形的宽度(以像素为单位)存储在图中。然后我们将尝试找到边的权重 X,它表示矩形之间空间的宽度。
为此,我们需要找到许多通过图形的路径。首先,我们搜索最长的路径,即具有最多矩形的路径,而不考虑它们的宽度;在这个例子中是:
left window edge → A → C → E → F → G → J
left window edge → B → D → E → F → G → J
然后我们检查这些路径中哪一个具有最大的组合宽度:
left window edge → A → C → E → F → G → J = 240
然后我们查看较短的路径,看看它们是否具有更大的宽度:
left window edge → A → C → E → F → I = 230
left window edge → B → D → E → F → I = 220
left window edge → A → C → E → H = 168
left window edge → B → D → E → H = 158
在示例中,较短的路径都没有更大的宽度。如果他们中的一些人这样做了,我们也必须考虑每个长度的最宽路径。事实上,我们只需要查看路径:
left window edge → A → C → E → F → G → J = 240
将这条路径连接到右窗口边缘,使其多出一条边;现在有 7 个宽度为 X 的边。矩形的组合宽度为 240 像素,因此如果窗口是例如450 像素宽,则 X = (450 - 240)/7 = 30 像素。如果要考虑多条路径,您将采用 X 的最小结果。
路径中 X 的最小结果的矩形之间将正好有 X 个像素的空间;其他矩形有一些回旋余地。您可以输入 X 作为图中最长路径的边的权重,然后使用该图进一步计算其他矩形的等间距。或者,您可以将它们放置在距其左侧或右侧邻居 X 处。
对于更复杂的情况,假设在示例中矩形 I 的宽度为 90 像素,矩形 H 的宽度为 120 像素。这些将是路径:
6 rectangles:
left window edge → A → C → E → F → G → J = 240
left window edge → B → D → E → F → G → J = 2305 rectangles:
left window edge → A → C → E → F → I = 254
left window edge → B → D → E → F → I = 2444 rectangles:
left window edge → A → C → E → H = 250
left window edge → B → D → E → H = 240
那么要考虑的路径是:
left window edge → A → C → E → F → G → J = 240
因为它是具有最多 (6) 个矩形的路径中最宽的,并且:
left window edge → A → C → E → F → I = 254
因为它是具有 5 个矩形的路径中最宽的,并且比 6 个矩形路径更宽。
(最宽的4矩形路径比6矩形路径宽,但不比5矩形路径宽,可以忽略。)
这给出了条件:
240 + 7 × X = W
254 + 6 × X = W
所以对于窗口宽度 290,这将给出:
240 + 7 × X = 290 → X = 7
254 + 6 × X = 290 → X = 6
因此路径 A → C → E → F → I 确定空格的宽度,为 6 个像素。
但是对于宽度为 390 的窗口,这将给出:
240 + 7 × X = 390 → X = 21
254 + 6 × X = 390 → X = 22
所以现在路径 A → C → E → F → G → J 决定了空格的宽度,为 21 像素。
关于javascript - 如何水平分布不同大小的矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38653836/
我有两个项目。一个项目正在运行,没有任何问题。它是从 gitlab 下载的。另一个项目是从 github 下载的。 github项目有这个问题。我想使用默认的 gradle 分布。我想知道我做错了什么
我正在通过我学习的大学提供的 VNC 软件(远程访问)使用 IBM bigInsights,但我无法通过该桌面访问 Internet。为了使用互联网上的一些数据样本,我决定安装 Hadoop 在我的笔
所以,这非常简单,我有一个包含嵌套列表的列表,如下所示: List( *list1* List(List("n1", "n3"), List("n1", "n4"), List("n3", "n4")
我有以下示例。 prefix = ['blue ','brown '] suffix = [('dog','shoes','bike'), ('tree','cat','car')] 我想获得一个如下
我创建了一项调查并将其发送出去。该调查要求用户提供电子邮件,然后要求他们从包含 8 个不同选项的下拉菜单中选择要吃哪顿饭。有些人使用同一封电子邮件多次填写调查,但食物选择不同。 我有一个如下所示的 M
我在 Python 中使用 plotly 来创建由某些分类变量着色的美国县的等值线。由于县非常小,因此图像中的边界线占主导地位。我怎样才能摆脱它们(或将它们的宽度设置为零)? 到目前为止的代码和输出(
我们有qgamma在 R 和 gamm.inv在 excel 中,我无法使用 invgamma 获得相同的结果python中的函数。例如在excel中GAMMA.INV(0.99,35,0.08)=4
过去几年我经常使用 Docker,但对于 Kubernetes 来说我还是个新手。我从今天开始,与我以前使用 Docker swarm 的方式相比,我正在努力思考 Pod 概念的实用性。 假设我有一个
我有一个 UIStackView然而,subViews的第一个 View 是 UILabel它没有相应地调整它的大小。 我的代码如下; private let stackView: UIStackVi
我想绘制自由度为 1、2、5 和 10 的 Student t 分布;所有在一个图中,并为图中的每个分布使用不同的颜色。此外,在 Canvas 的左上角创建一个图例,并增加 df = 1 的曲线线宽。
我对 Python 很陌生,我在互联网上浏览过,但找不到任何可以帮助我解决问题的逻辑。 我在图中有降水值,现在我需要根据图中的这些值拟合 GEV 分布。每个值等于从 1974 年到 2017 年的一年
我正在尝试复制此图 https://wind-data.ch/tools/weibull.php 我编写的代码是 import matplotlib.pyplot as plt import nump
对于家庭作业,我必须绘制文本的词频并将其与最佳 zipf 分布进行比较。 根据对数对数图中的排名绘制文本的词频计数似乎效果很好。 但是我在计算最佳 zipf 分布时遇到了麻烦。结果应该如下所示: 我不
Mathematica 具有四参数广义逆 Gamma 分布: http://reference.wolfram.com/mathematica/ref/InverseGammaDistribution
正在用 C 语言开发一个学校项目,使用 Pthreads 将一维数组分解为 tRows 和 tCols 的子矩阵。整个数组的大小为 wRows 和 wCols。假设 wCols = 4、wRows =
有没有办法得到制服int32_t没有警告的分发?我用这个uniform_int_distribution在我的代码中,但我收到警告: 54988961.cpp: In function ‘int ma
在花了相当多的时间试图了解如何在 postgresql 数据库服务器之间实现负载平衡(分配数据库处理负载)之后,我来到这里。 我有一个 postgresql 系统,每秒吸引大约 100 笔交易,而且这
所以标题已经说明了一切。我们正在开发一个开始获得大量依赖项的项目。到目前为止,我们一直在使用 setuptools,但越来越多的依赖项要么不容易安装(例如 wxPython),要么在某些使用 easy
我有以下代码: #include #include #include using namespace boost::numeric; using namespace interval_lib;
我有一个对象列表,我想以随机顺序连续访问这些对象。 我想知道是否有一种方法可以确保随机值并不总是相似。 例子。 我的列表是队列列表,我试图交错这些值以生成用于测试的真实场景。 我并不是特别想要队列 1
我是一名优秀的程序员,十分优秀!