Colors 如何使用GDI+;要在线与区域重叠时更改线的颜色?
我正在使用.NETGDI+在图表上画一条波浪线。(想想股票交易) 我希望它改变颜色,如果线超过90%或低于10% 关于如何改变颜色有什么建议吗 我的两个想法是:- 1.从0%-10%和90%-100%创建矩形&以某种方式使用它们是一个颜色剪裁/变换区域。如果可能的话,怎么可能。 2.使用画笔,但这些看起来更像是渐变&而不是一个精确定义的颜色开关Colors 如何使用GDI+;要在线与区域重叠时更改线的颜色?,colors,gdi+,gdi,charts,Colors,Gdi+,Gdi,Charts,我正在使用.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]。画笔,路径);
}