2009-11-06 4 views
1

J'utilise .NET GDI + pour tracer une ligne ondulée sur un graphique. (pensez à sharetrading) Je veux qu'il change de couleur si la ligne dépasse 90% ou moins de 10%.Comment utiliser GDI + pour modifier la couleur d'une ligne lorsqu'elle chevauche une région?

Des conseils sur la façon de changer la couleur?

Mes deux idées sont: - 1. Créez des rectangles de 0% à 10% & 90% à 100% & les utilisent en quelque sorte sont une coupure de couleur/transformer la région. est-ce possible si oui, comment? 2. Utilisez un pinceau mais ceux-ci semblent être plus un dégradé & pas un commutateur de couleur définitif à une valeur précise.

L'un ou l'autre est-il viable? Y a-t-il un meilleur moyen?

Répondre

3

Les deux méthodes semblent viables.

Pour effectuer votre première méthode, définissez trois objets Region ou Rectangle pour les trois plages de votre graphique, puis créez trois objets Pen, chacun avec une couleur différente. Appelez la méthode Graphics.SetClip pour la première région et dessinez votre courbe entière en utilisant le premier crayon. Tout ce qui se trouve en dehors de la région de découpage actuelle n'apparaîtra pas, vous n'avez donc pas à vous soucier de déterminer vous-même les points d'intersection. Définissez ensuite la région de découpage sur la deuxième zone et dessinez à nouveau la courbe entière à l'aide du deuxième crayon. Répétez l'utilisation de la troisième région et du stylo.

Pour votre deuxième méthode, créez un Bitmap avec toute la hauteur de votre zone de dessin, quelle que soit sa largeur. Peignez le bitmap entier avec les régions de couleur que vous voulez. Définissez un textured brush et utilisez-le pour créer votre stylo. Puis dessinez le chemin entier à la fois. MSDN has an example.

0

Merci Rob, j'ai vraiment apprécié votre réponse. En le testant. J'ai trouvé un substitut encore plus simple pour ce dont j'avais besoin. J'espère que vous trouverez cela utile aussi. L'objet Blend vous permet de créer un tableau de positions X% du début à la fin. Vous créez également un tableau correspondant de Pourcentage des couleurs à ce moment-là, par exemple: 0 = une seule couleur & 1 = toutes les autres. J'ai ensuite créé un pinceau qui avait exactement la même hauteur que mon graphique. J'ai ensuite défini la propriété Blend de l'objet Brush to my Blend. Et créé un stylo en utilisant le pinceau. Cela me permet de dessiner la ligne n'importe où une fois, car il a passé la hauteur de ma transition Blend points qu'il a magiquement changé de couleur.

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); 
} 
Questions connexes