Colors 如何使用GDI+;要在线与区域重叠时更改线的颜色?

Colors 如何使用GDI+;要在线与区域重叠时更改线的颜色?,colors,gdi+,gdi,charts,Colors,Gdi+,Gdi,Charts,我正在使用.NETGDI+在图表上画一条波浪线。(想想股票交易) 我希望它改变颜色,如果线超过90%或低于10% 关于如何改变颜色有什么建议吗 我的两个想法是:- 1.从0%-10%和90%-100%创建矩形&以某种方式使用它们是一个颜色剪裁/变换区域。如果可能的话,怎么可能。 2.使用画笔,但这些看起来更像是渐变&而不是一个精确定义的颜色开关 这两种方法都可行吗?有更好的方法吗?两种方法似乎都可行 要执行第一种方法,请为图形中的三个范围定义三个或多个对象,然后创建三个对象,每个对象具有不同的颜

我正在使用.NETGDI+在图表上画一条波浪线。(想想股票交易) 我希望它改变颜色,如果线超过90%或低于10%

关于如何改变颜色有什么建议吗

我的两个想法是:- 1.从0%-10%和90%-100%创建矩形&以某种方式使用它们是一个颜色剪裁/变换区域。如果可能的话,怎么可能。 2.使用画笔,但这些看起来更像是渐变&而不是一个精确定义的颜色开关


这两种方法都可行吗?有更好的方法吗?

两种方法似乎都可行

要执行第一种方法,请为图形中的三个范围定义三个或多个对象,然后创建三个对象,每个对象具有不同的颜色。调用第一个区域的方法,并使用第一支笔绘制整个曲线。当前剪裁区域之外的任何内容都不会显示,因此您不必担心自己计算交点。然后将剪裁区域设置为第二个区域,并使用第二支笔再次绘制整个曲线。使用第三个区域和画笔重复此操作


对于第二种方法,使用绘图区域的全高和任意宽度创建一个。使用所需的颜色区域绘制整个位图。定义并使用它创建笔。然后立即绘制整个路径

谢谢罗布,我真的很感谢你的回复。 在测试的时候。我找到了一个更简单的替代品来满足我的需要。我希望你也觉得这很有用

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

这让我可以在任何地方画一次线,当它经过我的混合过渡点的高度时,它神奇地改变了颜色

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);
}
if(enableSthresholdColor){//用不同的颜色给极值着色
int Threshold=(thresholdValue<50?100-thresholdValue:thresholdValue);
浮动上限阈值=((浮动)阈值)/100f;
浮动下限保留=((浮动)100-阈值)/100f;
LinearGradientBrush br=新的LinearGradientBrush(新矩形(20,bounds.Top,30,bounds.Height),绘图[0].Pen.Color,colorThreshold,90);
Blend bl=新的Blend();
//---这将使极值颜色相同--
bl.系数=新浮点数[]{1.0f,1.0f,0.0f,0.0f,1.0f,1.0f};
//---这会将极值涂成相反的颜色,并使线条过渡---
//bl.系数=新浮点数[]{1.0f,1.0f,0.0f,1.0f,0.0f,1.0f};
bl.Positions=新浮点[]{0,LowerThreshold,LowerThreshold,UpperThreshold,UpperThreshold,1.0f};
br.Blend=bl;
//---用于测试-显示阈值的位置---
//FillRectangle(br,新矩形(50,bounds.Top,400,bounds.Height));
//---------------------------------------------------------------------------------------
Pen stocPen=新笔(br,绘图[0].Pen.Width);
stocPen.DashStyle=绘图[0]。Pen.DashStyle;
图形绘制路径(stocPen,路径);
stocPen.Dispose();
br.Dispose();
}否则{//将整行涂成相同的颜色
graphics.DrawPath(绘图[0]。画笔,路径);
}