c# - 最适合固定大小但具有标准化位置的实体

标签 c# algorithm math geometry

假设我有一个实体数组,由一个标准化位置 (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/

相关文章:

javascript - CORS:凭据模式为 'include'

java - 优先队列问题

javascript - Math.min 只选择数组中第一个相同的值,我怎样才能让它找到其他值?

javascript - 传递的 Json 不被 Controller 接受

c# - Morelinq exceptBy 使用几个特定元素

c# - 通用属性的序列化

java - 如何根据 Java 列表中的重复获取前 N 个值

algorithm - 以任意精度计算两个阶乘比率的有效方法是什么?

java - 在代码中编写此公式是否有更清晰/更简单的方法?

Swift 在 Playground 生产部门错误