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

时间:2017-05-09 15:41:19

标签: 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
    }
}

我很难弄清楚如何计算最小size,对于任何给定的实体集,它允许在没有边界相交的情况下渲染它们。

如果您对此用例感到好奇,那么我需要一个辅助函数来解决乐谱渲染系统中的一些边缘情况。和弦标签放置在乐谱顶部的布局周期的末尾,并且它们的位置需要与相应的音乐内容正确对齐。但是有些情况下,满足此约束意味着度量上没有足够的空间来适应标签。我需要这个函数来预先确定是否没有足够的空间,如果没有,请让测量值按照缺失的数量增长。

1 个答案:

答案 0 :(得分:1)

如果您不想移动标签,<?php namespace App\Providers; use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * @var array */ protected $listen = [ 'App\Events\SomeEvent' => [ 'App\Listeners\EventListener', ], ]; } 应该始终是标签左端的位置,我认为这个简单的代码可以满足您的需求

$app->withFacades();

$app->register(App\Providers\EventServiceProvider::class);

我们的想法是,某个特定实体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; } 重叠(或者由假实体{{1}在代码中标记的末尾}})。所以我们有以下等式:

e1

或者如果你为e2解决它,你会得到

(1.0, 0.0)