想象一下,我有一个由标准化位置(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
,对于任何给定的实体集,它允许在没有边界相交的情况下渲染它们。
如果您对此用例感到好奇,那么我需要一个辅助函数来解决乐谱渲染系统中的一些边缘情况。和弦标签放置在乐谱顶部的布局周期的末尾,并且它们的位置需要与相应的音乐内容正确对齐。但是有些情况下,满足此约束意味着度量上没有足够的空间来适应标签。我需要这个函数来预先确定是否没有足够的空间,如果没有,请让测量值按照缺失的数量增长。
答案 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)