04. januar 2006 - 13:54Der er
15 kommentarer og 1 løsning
Tilfældige farver fra egen liste ud fra KnownColors
Hej alle.
Jeg har lidt problemer med at få sat tilfældige farver på nogle Graphics objekter. Sagen er den, at jeg ikke bare kan bruge alle farver til rådighed, for nogle af farverne ligner hinanden så meget, at man ikke kan se forskel. Jeg tager så de farver jeg kan bruge, og smider dem over i min egen liste, og vælger derudfra så en tilfældig farve. I får lige lidt kode, så I kan se hvad idéen er:
... klip her ... protected ArrayList colarray = new ArrayList(); protected void CreateColorTable() { Array colorsArray = Enum.GetValues(typeof(KnownColor)); KnownColor[] allColors = new KnownColor[colorsArray.Length]; Array.Copy(colorsArray, allColors, colorsArray.Length); for (int i = 27; i < allColors.Length; i++) { switch (i) { case 28: break; ... klip her ... default: colarray.Add(Color.FromName(allColors[i].ToString())); break; } } } protected Color GetRandomColor() { int seed = 140; Random rc = new Random(seed); int rndm = rc.Next(); Color retcol = new Color(); retcol = colarray[rndm]; return retcol; } ... klip her ...
.. (udklip fra min klasse). Det er ligesom om, at filmen knækker ved linjen retcol = colarray[rndm];, hvor den siger, at den ikke kan konvertere mellem object og System.Drawing.Color. Det havde jeg næsten på fornemmelsen, men jeg kan ikke få den til at makke ret. :(
Nå det er sagt, er jeg heller ikke alt for sikker på at min random virker. Meningen er, at den skal finde et tilfældigt tal mellem 0 og 139, da min switch genererer 140 forsk. farver.
Oh, hej. Den bliver svær nu. ;) Alle de rare mennesker, der svarer på mine spm. :)
Ok, først. For lige at være sikker; seed'en er bare et tilfældigt tal, uden nogen betydning, udover, at det er det tal random baserer sine udregninger på, ikke? Så jeg ville i teorien kunne bruge int.MaxValue som seed, uden at det gav nogen ændringer på random'en? Så en random seed ville være det optimale?
Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
Source Error:
Line 357: Random rc = new Random(seed); Line 358: int rndm = rc.Next(0, 139); Line 359: Color retcol = (Color)colarray[rndm]; Line 360: return retcol; Line 361: }
Jeg fatter det snart ikke mere. Nu er den blevet så sløj, at den ikke kan loade siden mere. Fik det til at virke med farverne, men hver gang man reloader siden, er farverne de samme. Så prøvede jeg at udregne mit seed fra sekunder i datetime.now, men der stoppede festen! :( Hvis det ikke er for meget, så smider jeg lige hele koden til skidtet.
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.IO; using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Text; using System.Drawing.Drawing2D; using System.Collections;
namespace ChartLib { public class PieChart { protected DateTime dati = DateTime.Now; protected ArrayList colarray = new ArrayList(); protected void CreateColorTable() { Array colorsArray = Enum.GetValues(typeof(KnownColor)); KnownColor[] allColors = new KnownColor[colorsArray.Length]; Array.Copy(colorsArray, allColors, colorsArray.Length); for (int i = 27; i < allColors.Length; i++) { switch (i) { case 28: break; case 31: break; case 35: break; case 45: break; case 47: break; case 55: break; case 57: break; case 58: break; case 61: break; case 62: break; case 63: break; case 64: break; case 65: break; case 69: break; case 70: break; case 71: break; case 74: break; case 77: break; case 80: break; case 81: break; case 84: break; case 87: break; case 88: break; case 89: break; case 91: break; case 92: break; case 93: break; case 94: break; case 95: break; case 96: break; case 97: break; case 102: break; case 103: break; case 104: break; case 105: break; case 109: break; case 118: break; case 119: break; case 120: break; case 121: break; case 122: break; case 123: break; case 125: break; case 147: break; case 153: break; case 164: break; case 167: break; case 168: break; case 169: break; case 170: break; case 171: break; case 172: break; case 173: break; default: colarray.Add(Color.FromName(allColors[i].ToString())); break; } } } protected Color GetRandomColor() { int seed = dati.Second; Random rc = new Random(seed); int rndm = rc.Next(0, 93); Color retcol = (Color)colarray[rndm]; return retcol; } public MemoryStream CreateChart(string name, DataTable pdt, int width, int height, Color colbg, Color colbrd, Color colpen) { CreateColorTable(); /// pdt - Two column datatable; col1 = name (string), col2 = value (int) int strw = 0; int strh = 0; int strht = 0; Bitmap bmptmp = new Bitmap(width, height, PixelFormat.Format32bppRgb); Graphics grtmp = Graphics.FromImage(bmptmp); long total = 0; foreach (DataRow dr in pdt.Rows) { total += int.Parse(dr[1].ToString()); SizeF sfm = new SizeF(grtmp.MeasureString(dr[0].ToString() + " : " + dr[1].ToString(), new Font("Verdana", 8))); if (sfm.Width > strw) { strw = ((int)sfm.Width); } strh = ((int)sfm.Height); strht += strh + 1; } strw += 20; SizeF sfc = new SizeF(grtmp.MeasureString(name, new Font("Verdana", 8, FontStyle.Bold))); bmptmp.Dispose(); grtmp.Dispose(); if (width < (strw + 100)) { width = strw + 100; } if (height < (strht + strh + 4)) { height = strht + ((strh + 4) * 2); } if (width < (((int)sfc.Width) + 4)) { width = ((int)sfc.Width) + 4; } if (width < 100) { width = 100; } if (height < 100) { height = 100; } int cent = ((int)(width) / 2) - ((int)(sfc.Width) / 2); if (width < cent + 2) { width = cent + 2; } Bitmap bmp = new Bitmap(width, height, PixelFormat.Format32bppRgb); Graphics gr = Graphics.FromImage(bmp); gr.SmoothingMode = SmoothingMode.AntiAlias; gr.Clear(colbg); gr.DrawRectangle(new Pen(colbrd), 0, 0, width - 1, height - 1); Pen ppen = new Pen(colpen); int pw = 0; int ph = 0; int offsetx = 0; int offsety = 0; if ((width - strw) < ((height - strh) + 4)) { pw = (width - strw) - 5; ph = pw; offsetx = strw + 2; offsety = (height / 2) - (ph / 2) + 2; } else { pw = ((height) - 5) - (strh + 4); ph = pw; offsetx = strw + ((width - (pw + strw)) / 2); offsety = strh + 6; }
float os = 270F; int afst = strh + 2; Hashtable htcol = new Hashtable(); foreach (DataRow dr in pdt.Rows) { Color rndcol = GetRandomColor(); while (htcol.ContainsKey(rndcol)) { rndcol = GetRandomColor(); } htcol.Add(rndcol, rndcol); SolidBrush sbb = new SolidBrush(rndcol); gr.FillRectangle(sbb, 2, afst + 1, 10, 10); gr.DrawRectangle(new Pen(colpen), 2, afst + 1, 10, 10); gr.DrawString(dr[0].ToString() + " : " + dr[1].ToString(), new Font("Verdana", 8), SystemBrushes.GrayText, new PointF(22, afst)); afst += strh; float del = (float.Parse(dr[1].ToString()) * 360) / ((float)total); gr.FillPie(sbb, offsetx, offsety, pw, ph, os, del); gr.DrawPie(ppen, offsetx, offsety, pw, ph, os, del); os += del; } gr.DrawString(name, new Font("Verdana", 8, FontStyle.Bold), SystemBrushes.InfoText, new PointF(cent, 2)); MemoryStream memstrm = new MemoryStream(); bmp.Save(memstrm, ImageFormat.Png); gr.Dispose(); bmp.Dispose(); return memstrm; } } }
sorry ... ser først dine posts nu. håber du har fundet en god løsning. mvh
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.