<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Helyar.net &#187; sine</title>
	<atom:link href="http://www.helyar.net/tag/sine/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.helyar.net</link>
	<description>From the desktop of George Helyar</description>
	<lastBuildDate>Thu, 26 Jan 2012 16:11:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>3 colour gradient</title>
		<link>http://www.helyar.net/2009/3-colour-gradient/</link>
		<comments>http://www.helyar.net/2009/3-colour-gradient/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 13:21:23 +0000</pubDate>
		<dc:creator>George Helyar</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[colour]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[curve]]></category>
		<category><![CDATA[gradient]]></category>
		<category><![CDATA[sine]]></category>

		<guid isPermaLink="false">http://www.helyar.net/blog/?p=120</guid>
		<description><![CDATA[Recently I noticed a green-red gradient that I was using wasn&#8217;t really what I wanted. I wanted it to go through yellow. I have made a Vista sidebar gadget in the past that shows different colours of the horizontal percentage bars for CPU and memory usage which faded from green at 0% to yellow at [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I noticed a green-red gradient that I was using wasn&#8217;t really what I wanted.<br />
<img alt="green-red gradient" src="http://www.helyar.net/wp-content/uploads/2009/03/BadGradient.png" title="green-red" class="alignnone" width="100" height="20" /></p>
<p>I wanted it to go through yellow. I have made a <a href="http://www.helyar.net/files/SimpleSystemMonitor.gadget">Vista sidebar gadget</a> in the past that shows different colours of the horizontal percentage bars for CPU and memory usage which faded from green at 0% to yellow at 50% and then faded from yellow at 50% to red at 100%. I had thought this solved the problem until I tried to use that same formula for a gradient, which turned out to be a triangular gradient.<br />
<img alt="green-yellow-red triangle gradient" src="http://www.helyar.net/wp-content/uploads/2009/03/TriangleGradient.png" title="green-red" class="alignnone" width="100" height="20" /></p>
<p>The problem here is that there is only yellow at the very peak of the triangle so it looks pinched. From here it is obvious that a curve is needed. I first looked into Bezier curves, as you can join two of them easily by using the same points on both. However, this seemed a bit complicated. I next used a bell curve, which is actually a <a href="http://en.wikipedia.org/wiki/Gaussian_function">Gaussian function</a>. This function is e<sup>-x<sup>2</sup></sup>. This worked well and I used it throughout the development of this gradient but after I was finished I realised that a simple Sine wave from 0 to PI would have sufficed (and produces almost exactly the same result as a Gaussian function). A better function would be a Cosine wave from -PI to PI, as this gives a smooth gradient at either end that repeats perfectly. However, this would need to be normalised so that it takes a percent from 0.0 to 1.0 and outputs a value from 0.0 to 1.0 <code>y = (cos((x*2-1)*pi)+1)/2</code>, which is easy to do in a simple Sine 0 to PI because it is done just by multiplying the input by PI.</p>
<p>The key to this is that when it hits the peak, at 50%, it changes from a green-yellow gradient to a red-yellow gradient. The sine function is not used directly to determine the colour but rather to determine where on a simple colour gradient to choose the colour from, which allows it to be used with any combination of colours. The end result is this:<br />
<img alt="green-yellow-red sine gradient" src="http://www.helyar.net/wp-content/uploads/2009/03/Sine.png" title="green-red" class="alignnone" width="100" height="20" /> (sine)<br />
<img alt="green-yellow-red cosine gradient" src="http://www.helyar.net/wp-content/uploads/2009/03/Cosine.png" title="green-red" class="alignnone" width="100" height="20" /> (cosine)</p>
<p>C# code listing (for ASPX) is as follows:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;color: black;"><span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Drawing</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Drawing.Imaging</span><span style="color: #008000;color: black;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">partial</span> <span style="color: #6666cc; font-weight: bold;color: blue;">class</span> PercentBar <span style="color: #008000;color: black;">:</span> <span style="color: #000000;">System.<span style="color: #0000FF;color: black;">Web</span><span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">UI</span></span><span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Page</span>
<span style="color: #008000;color: black;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">protected</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> Page_Load<span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">object</span> sender, EventArgs e<span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008000;color: black;">&#40;</span>Bitmap bmp <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> Bitmap<span style="color: #008000;color: black;">&#40;</span><span style="color: #FF0000;color: maroon;">100</span>, <span style="color: #FF0000;color: maroon;">20</span>, PixelFormat<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Format24bppRgb</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#41;</span>
        <span style="color: #008000;color: black;">&#123;</span>
            <span style="color: #6666cc; font-weight: bold;color: blue;">double</span> w <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">double</span><span style="color: #008000;color: black;">&#41;</span>bmp<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Width</span><span style="color: #008000;color: black;">;</span>
            <span style="color: #0600FF; font-weight: bold;color: blue;">for</span> <span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">int</span> x <span style="color: #008000;color: black;">=</span> <span style="color: #FF0000;color: maroon;">0</span><span style="color: #008000;color: black;">;</span> x <span style="color: #008000;color: black;">&lt;</span> bmp<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Width</span><span style="color: #008000;color: black;">;</span> x<span style="color: #008000;color: black;">++</span><span style="color: #008000;color: black;">&#41;</span>
            <span style="color: #008000;color: black;">&#123;</span>
                Color c <span style="color: #008000;color: black;">=</span> GetTriColour<span style="color: #008000;color: black;">&#40;</span>x <span style="color: #008000;color: black;">/</span> w, Color<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Lime</span>, Color<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Yellow</span>, Color<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Red</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
                <span style="color: #0600FF; font-weight: bold;color: blue;">for</span> <span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">int</span> y <span style="color: #008000;color: black;">=</span> <span style="color: #FF0000;color: maroon;">0</span><span style="color: #008000;color: black;">;</span> y <span style="color: #008000;color: black;">&lt;</span> bmp<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Height</span><span style="color: #008000;color: black;">;</span> y<span style="color: #008000;color: black;">++</span><span style="color: #008000;color: black;">&#41;</span>
                    bmp<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">SetPixel</span><span style="color: #008000;color: black;">&#40;</span>x, y, c<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
            <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008000;color: black;">&#40;</span><span style="color: #000000;">System.<span style="color: #0000FF;color: black;">IO</span></span><span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">MemoryStream</span> ms <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> <span style="color: #000000;">System.<span style="color: #0000FF;color: black;">IO</span></span><span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">MemoryStream</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#41;</span>
            <span style="color: #008000;color: black;">&#123;</span>
                bmp<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Save</span><span style="color: #008000;color: black;">&#40;</span>ms, ImageFormat<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Png</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
                ms<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">WriteTo</span><span style="color: #008000;color: black;">&#40;</span>Response<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">OutputStream</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
            <span style="color: #008000;color: black;">&#125;</span>
            Response<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">ContentType</span> <span style="color: #008000;color: black;">=</span> <span style="color: #666666;color: maroon;">&quot;image/png&quot;</span><span style="color: #008000;color: black;">;</span>
        <span style="color: #008000;color: black;">&#125;</span>
    <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> Color GetTriColour<span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">double</span> percent, Color left, Color centre, Color right<span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>percent <span style="color: #008000;color: black;">&lt;</span> <span style="color: #FF0000;color: maroon;">0</span> <span style="color: #008000;color: black;">||</span> percent <span style="color: #008000;color: black;">&gt;</span> <span style="color: #FF0000;color: maroon;">1</span><span style="color: #008000;color: black;">&#41;</span>
            <span style="color: #0600FF; font-weight: bold;color: blue;">throw</span> <span style="color: #008000;color: blue;">new</span> Exception<span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;Percent must be between 0 and 1&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;color: green;">//double weight = Math.Sin(percent * Math.PI);</span>
        <span style="color: #6666cc; font-weight: bold;color: blue;">double</span> weight <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: black;">&#40;</span>Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Cos</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#40;</span>percent <span style="color: #008000;color: black;">*</span> <span style="color: #FF0000;color: maroon;">2</span> <span style="color: #008000;color: black;">-</span> <span style="color: #FF0000;color: maroon;">1</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">*</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">PI</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">+</span> <span style="color: #FF0000;color: maroon;">1</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">/</span> <span style="color: #FF0000;color: maroon;">2</span><span style="color: #008000;color: black;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;color: blue;">return</span> GetColourFromLinearGradient<span style="color: #008000;color: black;">&#40;</span>weight,
           percent <span style="color: #008000;color: black;">&lt;</span> <span style="color: #FF0000;color: maroon;">0.5</span> <span style="color: #008000;color: black;">?</span> left <span style="color: #008000;color: black;">:</span> right, centre<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> Color GetColourFromLinearGradient<span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">double</span> percent, Color start, Color end<span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
        <span style="color: #6666cc; font-weight: bold;color: blue;">double</span> a, r, g, b<span style="color: #008000;color: black;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>percent <span style="color: #008000;color: black;">&lt;</span> <span style="color: #FF0000;color: maroon;">0</span> <span style="color: #008000;color: black;">||</span> percent <span style="color: #008000;color: black;">&gt;</span> <span style="color: #FF0000;color: maroon;">1</span><span style="color: #008000;color: black;">&#41;</span>
            <span style="color: #0600FF; font-weight: bold;color: blue;">throw</span> <span style="color: #008000;color: blue;">new</span> Exception<span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;Percent must be between 0 and 1&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
        <span style="color: #6666cc; font-weight: bold;color: blue;">double</span> npercent <span style="color: #008000;color: black;">=</span> <span style="color: #FF0000;color: maroon;">1.0</span> <span style="color: #008000;color: black;">-</span> percent<span style="color: #008000;color: black;">;</span>
&nbsp;
        a <span style="color: #008000;color: black;">=</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Min</span><span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">A</span>, end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">A</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">+</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Abs</span><span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">A</span> <span style="color: #008000;color: black;">-</span> end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">A</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">*</span> <span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">A</span> <span style="color: #008000;color: black;">&gt;</span> end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">A</span> <span style="color: #008000;color: black;">?</span> npercent <span style="color: #008000;color: black;">:</span> percent<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        r <span style="color: #008000;color: black;">=</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Min</span><span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">R</span>, end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">R</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">+</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Abs</span><span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">R</span> <span style="color: #008000;color: black;">-</span> end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">R</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">*</span> <span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">R</span> <span style="color: #008000;color: black;">&gt;</span> end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">R</span> <span style="color: #008000;color: black;">?</span> npercent <span style="color: #008000;color: black;">:</span> percent<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        g <span style="color: #008000;color: black;">=</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Min</span><span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">G</span>, end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">G</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">+</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Abs</span><span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">G</span> <span style="color: #008000;color: black;">-</span> end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">G</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">*</span> <span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">G</span> <span style="color: #008000;color: black;">&gt;</span> end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">G</span> <span style="color: #008000;color: black;">?</span> npercent <span style="color: #008000;color: black;">:</span> percent<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        b <span style="color: #008000;color: black;">=</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Min</span><span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">B</span>, end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">B</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">+</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Abs</span><span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">B</span> <span style="color: #008000;color: black;">-</span> end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">B</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">*</span> <span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">B</span> <span style="color: #008000;color: black;">&gt;</span> end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">B</span> <span style="color: #008000;color: black;">?</span> npercent <span style="color: #008000;color: black;">:</span> percent<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;color: blue;">return</span> Color<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">FromArgb</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">int</span><span style="color: #008000;color: black;">&#41;</span>a, <span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">int</span><span style="color: #008000;color: black;">&#41;</span>r, <span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">int</span><span style="color: #008000;color: black;">&#41;</span>g, <span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">int</span><span style="color: #008000;color: black;">&#41;</span>b<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
<span style="color: #008000;color: black;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.helyar.net/2009/3-colour-gradient/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

