From: Sergio Masci (sergio@titan.demon.co.uk)
Date: Fri 14 Jul 2000 - 19:53:40 IDT
OK, well first off I made a mistake in the 0x2f part of my post. This should have read 0x3f (binary 111111) not 0x2f (binary 101111). This affects both my example and the subsequent file you [Patrick] posted. Secondly to be able to do a smooth transition between any two colours that have three colour components you need to be able to plot a straight line between the two colours in 3D space. Think of each of your colour components as a dimension. This is where the RGB colour cube that you may have seen references to comes from. It is not possible to map every colour in this cube onto a flat 2D surface without having breaks in continuity. Thirdly, while trying to get svgalib working on a new test machine that has suse 6.4 on it (Patrick has a lot to answer for) I came across vgatest (a program I haven't used in years and had forgotten even existed). This program gives a very interesting test pattern in mode 18 and 24. Maybe this could be used as the basis for your colour selection (I think each of the six squares is actually a surface of the colour cube) Useing these squares you should be able to access about 31*31*6 colours (you will still be missing the other 31*31*57 so you will need to add sliders or something to move into the cube, but the blending looks good for the colours used). Lastly, having tried your [Patrick's] code I am inclined to change the 1.5 constant to 1 (having corrected the 0x2f problem). To get rid of the moir (spelling?) pattern you will need to generate the lines either vertically or horizontally Regards Sergio > > Thanks for the example, but it wasn't quite _exactly_ what I was looking > for. I've attached a file with what I was trying to do (well, for the > most part). I haven't quite got a smooth transition to and from > green: it uses 6 bits while red and blue use 5, so I increment and > decrement green by 1.5, since its max value is 0x2f, (~1.5 * 0x1f)...but > is' not smooth... > > > On Tue, 11 Jul 2000, Sergio Masci wrote: > > > > This is another generic graphics programming question, but hopefully > > > someone will know the answer. > > > > > > How do I iteratate through the colors? It seems like it should be simple, > > > but it's not behaving as expected. I'm writing a little something that > > > draws a color wheel on the screen at 800x600x64K. Just for kicks, suppose > > > that it's just drawing vertical lines, so the code looks like this: > > > > > > ... > > > color = 0; > > > for (xnow = 0; xnow < xmax; xnow++) > > > gl_line(xnow,0,xnow,ymax,color++); > > > ... > > > > > > I come up with about 13 identical sections of color fading. > > > the same happens if I do > > > > > > vga_setcolor(color++); > > > vga_drawline(xnow,0,xnow,ymax); > > > > > > > > > Is there a way that I can do what I am trying simply? > > > > > > Regards, > > > > > > -patrick > > > > > > I don't use the gl libraries or the vga_setcolor or vga_drawline > > functions so I cannot give a concrete answer BUT it looks to me as > > though the colour is a direct copy of the hardware pixel used in the > > 800x600x64K mode. In this mode the colours are packed into a 16 bit word > > something like 6:5:5 or 6:6:4 I cannot remember exactly. > > > > Try experimenting with the following: > > > > float fx, fy, fz; > > int x, y > > red, green, blue, pixel; > > > > for (x=0; x<800; x++) > > { > > for (y=0; y<600; y++) > > { > > fx = (float)x / 799; > > fy = (float)y / 599; > > fz = sqrt(x * x + y * y) / sqrt(799*799 + 599*599); > > > > red = 0x2f * fx; > > blue = 0x1f * fy; > > green = 0x1f * fz; > > > > pixel = (red << 10) | (green << 5) | blue; > > > > vga_setcolor(pixel); > > vga_drawline(x,y,x,y); > > } > > } > > > > You should end up with a box, one corner of which should be black, > > diagnally opposit will be white, one other corner should be blue and the > > last should be red (no pure green since this component is generated from > > blue and red and so does not exist in this square without them). > > > > Regards > > Sergio > > >
This archive was generated by hypermail 2.1.4 : Wed 21 Jan 2004 - 22:10:23 IST