假设我有一个实体数组,由一个标准化位置 (t) 和一个宽度组成。
struct Entity
{
float t; // left position as a percentage of the parent's size
float width; // width of the entity in absolute values
}
一旦我决定了父级的大小,我就可以像这样轻松地渲染所有实体:
void Draw(Entity[] entities, float size)
{
foreach(var entity in entities)
{
var x = entity.t * size;
Draw(x, entity.width); // x corresponds to left side, not center
}
}
我很难弄清楚如何计算最小大小
,对于任何给定的实体集,允许它们在边界不相交的情况下呈现。
如果您对此用例感到好奇,这是一个辅助函数,我需要用它来解决乐谱渲染系统上的一些边缘情况。和弦标签放置在乐谱顶部布局循环的末尾,它们的位置需要与相应的音乐内容正确对齐。但在某些情况下,满足此约束意味着度量上没有足够的空间来容纳标签。我需要这个函数来提前判断是否没有足够的空间,如果没有,则要求度量按缺失的量增长。
最佳答案
如果您不想移动标签,即 t
应该始终位于标签的最左端位置,我认为这个简单的代码可以满足您的需要
static float CalcMinWidth(IList<Entity> entities)
{
var count = entities.Count;
List<Entity> local = new List<Entity>(count + 1);
local.AddRange(entities);
local.Add(new Entity(1, 0)); // add one that marks "end"
local.Sort((e1, e2) => Comparer<float>.Default.Compare(e1.t, e2.t));
float minReqW = 0;
for (int i = 0; i < count; i++)
{
var e1 = local[i];
var e2 = local[i + 1];
var reqW = e1.width / (e2.t - e1.t);
if (reqW > minReqW)
minReqW = reqW;
}
return minReqW;
}
想法是,最小宽度由某个特定实体 e1
指定,该实体不应与下一个实体 e2
重叠(或代码中标记为一个假实体 (1.0, 0.0)
)。所以我们有以下等式:
e1.t * required_width + e1.width < e2.t * required_width
或者如果你解决 required_width
你会得到
e1.width / (e2.t - e1.t) < required_width
关于c# - 最适合固定大小但具有标准化位置的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43874246/