描述
首先,我给你看这张图:
所以......
我有一个主(黑色)顶点,一个零(黑色)角和与其相关的其他顶点。
主顶点有一个属性palette: Map<number, Color>
,它是按类型与其关联的顶点列表[Угол вершины считая с основной линии, цвет вершины]
,如图所示。我需要使用相邻顶点为主顶点着色,如下所示:
灰色平分线。[0, 2π) 范围内的所有角度
还
为了方便起见,我创建了一个以指定角度绘制的函数:
function fillSector(beginAngle: number, endAngle: number, color: Color): void;
问题
三个小时以来,我一直无法正确计算出应该从哪里开始绘制以及某种颜色的绘制位置,主要是因为黑线部分被切割了。就在这条线上方,我的角度更接近 0,并且略低于 2π。
问题
我需要知道计算绘画扇区的算法的正确方法。
例子
上面例子的结果应该是这样的:
function aWonderfulFunction(palette: Map<number, Color>): Map<number, Color>;
const palette = new Map([
[1 / 4 * PI, Color.RED], // От угла 1/4π приходит красный цвет
[5 / 6 * PI, Color.GREEN], // От угла 5/6π приходит зеленый цвет
[3 / 2 * PI, Color.BLUE], // От угла 3/2π приходит синий цвет
]);
const result = aWonderfulFunction(palette);
console.log(result);
// new Map([
// [13 / 24 * PI, Color.RED], // От начала (0π) до биссектрисы красно-зеленого (которая под углом 13/24π) красим красным цветом
// [14 / 12 * PI, Color.GREEN], // От биссектрисы красно-зеленого (13/24π) до биссектрисы зелено-синего (которая под углом 14/12π) красим зеленым цветом
// [15 / 8 * PI, Color.BLUE], // От биссектрисы зелено-синего (14/12π) до биссектрисы сине-красного (которая под углом 15/8π) красим синим цветом
// [2 * PI, Color.RED], // От биссектрисы сине-красного (14/12π) до конца (2π) красим красным цветом
// ]);
还有一种不怕经过0过渡的方法
(如果角度差>=Pi则不直接起作用):
本质上,将角度的单位方向向量相加并确定总向量的方向。
要找到平分线,您需要找到一个角度与第二个角度的差异,然后将其分成两半,然后将其添加到第一个角度。
对于之间没有角过渡的角度,
2π
公式很简单否则,需要进行调整,例如,在第二个角度上添加 2π - 这将使您能够找到角度之间的正确差异
现在结果可能大于 2π - 这种情况也可以通过在必要时减去 2π 或取除法的余数来纠正
在js中,该公式可以推广为以下形式: