如何在区域重叠时使用GDI +更改线条的颜色?

时间:2009-11-06 23:16:34

标签: colors gdi+ gdi charts

我正在使用.NET GDI +在图表上绘制波浪线。 (想想分享) 如果线条高于90%或低于10%,我希望它能改变颜色。

有关如何改变颜色的任何提示?

我的两个想法是: - 1.创建0%-10%&的矩形。 90%-100%&以某种方式使用它们是颜色剪切/变换区域。如果是这样的话怎么可能。 2.使用画笔,但这些似乎更像是一个渐变&不是一个确切的颜色切换正确的值。

这些都可行吗?还有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

这两种方法似乎都可行。

要执行第一种方法,请为图表中的三个范围定义三个RegionRectangle个对象,然后制作三个Pen个对象,每个对象具有不同的颜色。为第一个区域调用Graphics.SetClip方法,并使用第一个笔绘制整个曲线。当前剪切区域之外的任何内容都不会显示,因此您不必担心自己找出交叉点。然后将剪切区域设置为第二个区域,并使用第二个笔再次绘制整个曲线。使用第三个区域和笔重复。

对于第二种方法,创建一个Bitmap,其中包含绘图区域的整个高度,宽度为任意宽度。使用所需的颜色区域绘制整个位图。定义textured brush并使用它来创建笔。然后立即绘制整个路径。 MSDN has an example.

答案 1 :(得分:0)

谢谢罗布,我非常感谢你的回复。  在测试时。我找到了一个替代品,它更简单,我需要的东西。我希望你也觉得这很有用。

Blend Object可让您创建一个从开始到结束的X%位置阵列。您还可以在该点创建颜色百分比混合的匹配数组,例如:0 =所有一种颜色& 1 =所有其他。 然后我创建了一个与我的图表完全相同的画笔。 然后我将Brush的Blend属性设置为我的Blend对象。并使用画笔创建了一支笔。

这让我可以在任何地方画一次,因为它通过了我的Blend过渡点的高度,它神奇地改变了颜色。

if (enableThresholdColors) {    // Color the extreme values a different color   

   int Threshold = (thresholdValue < 50 ? 100 - thresholdValue : thresholdValue);
   float UpperThreshold = ((float) Threshold) / 100f;
   float LowerThreshold = ((float) 100 - Threshold) / 100f;

   LinearGradientBrush br = new LinearGradientBrush(new Rectangle(20, bounds.Top, 30, bounds.Height ), Plots[0].Pen.Color, colorThreshold, 90); 
   Blend bl = new Blend();
   // --- this colors the Extreme values the same color ---     
   bl.Factors = new float[]  {1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f};
   // --- this colors the Extreme values the opposite color & transitions the line ---
   //       bl.Factors = new float[]  {1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f}; 

   bl.Positions = new float[]{0,  LowerThreshold, LowerThreshold, UpperThreshold, UpperThreshold, 1.0f}; 
   br.Blend = bl; 
  // --- for testing - show where the threshold is. ---
  //    graphics.FillRectangle( br, new Rectangle(50, bounds.Top, 400,  bounds.Height)); 

//---------------------------------------------------------------------------------------

   Pen stocPen = new Pen(br, Plots[0].Pen.Width);
   stocPen.DashStyle = Plots[0].Pen.DashStyle;
   graphics.DrawPath(stocPen, path);
   stocPen.Dispose();
   br.Dispose();

} else {    // Color the entire line all the same color
   graphics.DrawPath(Plots[0].Pen, path);
}