我有一个三角形,每个节点都附有一个值(例如(A,B,C) -> (0.3, 0.1, 0.7)
)。使用以下函数将值映射到RGB颜色(0.0:蓝色,0.5:绿色,1.0:红色):
var color = Color.FromArgb(alpha,
(int)((value > 0.5 ? 2*value - 1 : 0) * 255),
(int) ((value > 0.5 ? 2-2*value : 2*value) * 255),
(int)((value > 0.5 ? 0 : (1 - 2 * value)) * 255)
);
这些值意味着在三角形上线性插值(例如重心坐标重量),并且在整个应用中它是一个更大的三角形网格。
对于绘图,我创建了一个GraphicsPath
,在三个角的每个角上都有点,中间有几个点(示例中有12个可能是矫枉过正)。在PathGradientBrush
上,我将SurroundColors
颜色设置为角点的值或这些颜色之间的线性插值。 CenterPoint
和CenterValue
设置为(A+B+C)/3
和values.Sum()/3
。这看起来很适合某些值(这里是(0.0, 0.5, 1.0)
:
但对其他人不太好(这里(0.3, 0.8, 1.0)
,请看三角形顶部的工件):
我尝试了其他几种策略(例如,通过到中心点的距离来加权值,将中心放在其他地方等等)但仍然得到那些文物。我只需要三角形,但绘图必须在Paint-handler中进行,手动绘制太慢。我怎么能
重现问题和玩游戏的代码(将其粘贴到问题中有点太多):http://pastebin.com/gjjzqRvY
答案 0 :(得分:0)
我不记得上次没有回答我自己的问题了。
PathGradientBrush
对
边界和中心点上的插值颜色
这与以下颜色映射非常吻合:
var color = Color.FromArgb(alpha, (int)(值* 255), (int)((1-value)* 255), 0 );
例如:如果边从0变为1,则画笔的插值将计算为30%:
0.3 * colorA + 0.7 * colorB
= 0.3 * (0, 255, 0) + 0.7 * (255,0,0)
= (76, 178)
这正是0.3的colormapping-function的结果。这同样适用于朝向中心的第二次插值。
但我有3种颜色但幸运的是只有一个极端点在0.5。 0.0 .. 0.5
工作正常,0.5 .. 1.0
工作正常。但这是线性插值分解。诀窍是给渐变画笔这个极端点:
暗示未来的读者: