Avatar billede Max Novice
04. januar 2006 - 13:54 Der 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.

Håber I kan hjælpe med at få det til at virke.

Mvh.
/Mnc
Avatar billede hmortensen Nybegynder
04. januar 2006 - 13:59 #1
Du kan prøve sådan her:
Color retcol = (Color)colarray[rndm];
Avatar billede snepnet Nybegynder
04. januar 2006 - 14:27 #2
hej memnoch :o)

Prøv sådan en random her istedet:
rc.Next(0,139);
og så sørg for at angive en ny seed hver gang.

bruger du version 2.0?

mvh
Avatar billede snepnet Nybegynder
04. januar 2006 - 14:29 #3
altså ikke ny seed for hver gang du kalder metoden - men for hver gang du skal bruge klassen.
mvh
Avatar billede Max Novice
04. januar 2006 - 14:33 #4
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?

Mvh.
/Mnc
Avatar billede Max Novice
04. januar 2006 - 14:34 #5
.. og jep. .Net 2.0 :)
Avatar billede Max Novice
04. januar 2006 - 14:55 #6
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:        }


Source File: C:\web\site\App_Code\ChartLib.cs    Line: 359


.. øv. :( Hvorfor nu lige i den linje?
Avatar billede hmortensen Nybegynder
04. januar 2006 - 14:58 #7
Virker det hvis du sætter indexet statisk ?
colarray[0]
Avatar billede snepnet Nybegynder
04. januar 2006 - 14:59 #8
du har sikkert ikke 140 elementer i liste - men du har også en løkke med noget med 27 ser jeg.

jeg mener din seed resulterer i en rækkefølge... så hvis du bruger samme seed får du samme rækkefølge hver gang.

hvis du benytter 2.0 kan du meget let lave dig en typestærk liste med generics:

List<Color> UsableColors;

go så kan du så:

UsableColors.Add(someColor);

og Color color = UseableColors[index];

mvh
Avatar billede snepnet Nybegynder
04. januar 2006 - 15:01 #9
den skal self. new'es List<Color> UsableColors = new List<Color>();
mvh
Avatar billede Max Novice
04. januar 2006 - 15:52 #10
Hmmm.. Synes ellers jeg testede den, men 140 er på magisk vis blevet 93. :(
Jeg vender lige tilbage senere, for den kager stadig.. :((

Mvh.
/Mnc
Avatar billede Max Novice
04. januar 2006 - 16:00 #11
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.
Avatar billede Max Novice
04. januar 2006 - 16:02 #12
// Først selve klassen

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;
        }
    }
}
Avatar billede Max Novice
04. januar 2006 - 16:05 #13
// og så kaldes den fra Default.aspx.cs med:

        Response.Clear();
        Color colpen = Color.SkyBlue;
        Color colbg = Color.GhostWhite;
        Color colbrd = Color.CadetBlue;
        DataTable dt = new DataTable();
        DataRow dr;
        dt.Columns.Add("Name");
        dt.Columns.Add("Value");
        dr = dt.NewRow();
        dr[0] = "Januar";
        dr[1] = 23;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr[0] = "Februar";
        dr[1]=74;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr[0] = "Marts";
        dr[1]=43;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr[0] = "April";
        dr[1]=66;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr[0] = "Maj";
        dr[1]=65;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr[0] = "Juni";
        dr[1]=12;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr[0] = "Juli";
        dr[1]=78;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr[0] = "August";
        dr[1]=33;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr[0] = "September";
        dr[1]=28;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr[0] = "Oktober";
        dr[1]=19;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr[0] = "November";
        dr[1]=64;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr[0] = "December";
        dr[1]=19;
        dt.Rows.Add(dr);
        dt.AcceptChanges();
        PieChart pc = new PieChart();
        MemoryStream mstr = pc.CreateChart("Antal pr. måned", dt, 640, 480, colbg, colbrd, colpen);
        Response.ContentType = "image/png";
        mstr.WriteTo(Response.OutputStream);
Avatar billede Max Novice
04. januar 2006 - 16:06 #14
Håber I gider kigge på det. Fordobler gerne points, etc. hvis bare skidtet kommer til at køre.. Er lidt træt af det lige nu..

Mvh.
/Mnc
Avatar billede Max Novice
05. januar 2006 - 11:49 #15
Dropper sagen. Har fundet en anden måde at lave de på. Tak for hjælpen begge to. Smid et svar, så fordeler jeg points. :)

Mvh.
/Mnc
Avatar billede snepnet Nybegynder
05. januar 2006 - 12:43 #16
sorry ... ser først dine posts nu.
håber du har fundet en god løsning.
mvh
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester