Avatar billede alex_sleiborg Nybegynder
10. september 2007 - 14:11 Der er 11 kommentarer og
1 løsning

override on paint

Hej... Jeg er igang med at tegne en rotere en terning, ved hjælp af gdi+. Det virker også fint, hvis jeg har en eventhandler der ser sådan ud.

        private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            Graphics g = e.Graphics;

            OffsetWorldCoordinatesNegativeY(g);

            g.FillRectangle(Brushes.DarkSlateBlue, ClientRectangle);
            TheCube.Draw(g);

        }

Og en timer der ser sådan ud
        private void timer_Tick(object sender, EventArgs e)
        {
            TheCube = (ThreeDObject)((ICloneable)TheCubeOriginal).Clone(); // recopy original object
            TheCube.SortPolygonsInZOrder();
            TheCube.RotateAt(TheCube.GetCenter(), AngleCount);
            AngleCount += 1;
            Invalidate();
        }

Men jeg vil gerne samle det hele i en override on paint metode. Men kan ikke få den til at tegne objektet? Hvordan gør jeg det?
Avatar billede nielle Nybegynder
10. september 2007 - 16:06 #1
Sådan?

        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = e.Graphics;

            OffsetWorldCoordinatesNegativeY(g);

            g.FillRectangle(Brushes.DarkSlateBlue, ClientRectangle);
            TheCube.Draw(g);

            // base.OnPaint(e);
        }
Avatar billede alex_sleiborg Nybegynder
11. september 2007 - 10:54 #2
Sådan ser den ud nu, men det virker ikke

        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            OffsetWorldCoordinatesNegativeY(e.Graphics);

            e.Graphics.FillRectangle(Brushes.DarkSlateBlue, ClientRectangle);
           
            TheCube = (ThreeDObject)((ICloneable)TheCubeOriginal).Clone(); // recopy original object
            TheCube.SortPolygonsInZOrder();
            TheCube.RotateAt(TheCube.GetCenter(), AngleCount);
            AngleCount += 1;
            Invalidate();

            for (int i = 0; i < Polygons.Count; i++)
            {
                ((ThreeDPolygon)Polygons[i]).Draw(e.Graphics);
                ((ThreeDPolygon)Polygons[i]).Fill(e.Graphics, Color.FromArgb(i * 10 + 50, i * 30 + 50, i * 30 + 50));

            }
            base.OnPaint(e);
        }
Avatar billede nielle Nybegynder
11. september 2007 - 12:36 #3
Hvad mener du ptæcis med at den ikke virker?

Hvad sker der?
Hvad skert der ikke?
Hvad forventede du at der skulle ske?
Avatar billede alex_sleiborg Nybegynder
11. september 2007 - 13:27 #4
Jeg forventer den skal tegne den terning. Men der eneste der sker er, at baggrunden ændrer farve som den skal.
Avatar billede nielle Nybegynder
11. september 2007 - 14:26 #5
Det vil sige at noget af koden bliver udført, eller hvad?

e.Graphics.FillRectangle(Brushes.DarkSlateBlue, ClientRectangle);

Din Invalidate skal i hvertfald ikke stå midt i koden.
Avatar billede alex_sleiborg Nybegynder
13. september 2007 - 10:15 #6
Ja, noget af den bliver udført... Nej invalidate skal stå i bunden, men det gør desværre ingen forskel
Avatar billede nielle Nybegynder
13. september 2007 - 18:49 #7
1) Enten bliver det tegnede lavet via noget helt andet kode end den postede - et helt andet sted i dit program. Det burde være let at eftervise dette ved f.eks. at ændre farven på din Brush.

2) ... eller det *er* det viste som bliver kørt; dog med den undtagelse at den sidste del faktisk slet ikke udskriver noget (eller udskriver udenfor området). Det er lidt svært at vurdere for mig eftersom at jeg ikke har set koden for din ThreeDPolygon-klasse.
Avatar billede alex_sleiborg Nybegynder
18. september 2007 - 10:34 #8
Her er 3DPolygon klassen

    public class ThreeDPolygon : IComparable, ICloneable
    {
        public Color TheColor = Color.Black;
        public ArrayList Vertices = new ArrayList();
        public ThreeDPolygon()
        {
        }

        float GetZSum(ThreeDPolygon p)
        {
            float sum = 0.0f;
            for (int i = 0; i < Vertices.Count; i++)
            {
                sum += ((ThreeDPoint)p.Vertices[i]).Z;
            }

            return sum;
        }

        float GetXSum(ThreeDPolygon p)
        {
            float sum = 0.0f;
            for (int i = 0; i < Vertices.Count; i++)
            {
                sum += ((ThreeDPoint)p.Vertices[i]).X;
            }

            return sum;
        }

        float GetYSum(ThreeDPolygon p)
        {
            float sum = 0.0f;
            for (int i = 0; i < Vertices.Count; i++)
            {
                sum += ((ThreeDPoint)p.Vertices[i]).Y;
            }

            return sum;
        }

        object ICloneable.Clone()
        {
            ThreeDPolygon copyObject = new ThreeDPolygon();
            for (int i = 0; i < Vertices.Count; i++)
            {
                copyObject.Vertices.Add( ((ICloneable)Vertices[i]).Clone());
            }

            return copyObject;

        }



        int IComparable.CompareTo(object obj)
        {
          ThreeDPolygon ptest = (ThreeDPolygon)obj;
            float sum1 = GetZSum(this);
            float sum2 = GetZSum(ptest);
            if (sum1  >  sum2)
            {
              return 1;
            }

            if (sum1 == sum2)
            {
              sum1 = GetXSum(this);
              sum2 = GetXSum(ptest);
              if (sum1  >  sum2)
                {
                    return 1;
                }
            }

            if (sum1 == sum2)
            {
                sum1 = GetYSum(this);
                sum2 = GetYSum(ptest);
                if (sum1  >  sum2)
                {
                    return 1;
                }
            }


            return -1;
        }

        ThreeDPoint GetLeftmostPoint()
        {
            float xmin = 1000;
            float ymin = 1000;
            float zmin = 1000;
            for (int i = 0; i < Vertices.Count; i++)
            {
                ThreeDPoint nextPoint = (ThreeDPoint)Vertices[i];
                if (nextPoint.X < xmin)
                    xmin = nextPoint.X;
                if (nextPoint.Y < ymin)
                    ymin = nextPoint.Y;
                if (nextPoint.Z < zmin)
                    zmin = nextPoint.Z;
            }

            ThreeDPoint origin = new ThreeDPoint(xmin, ymin, zmin);
            return origin;
        }

        public ThreeDPolygon(ThreeDPoint[] v)
        {
          for (int i = 0; i < v.Length; i++)
            Vertices.Add(v[i]);
        }


        public void AddPoint(float x, float y, float z)
        {
          ThreeDPoint aPoint = new ThreeDPoint(x, y, z);
          Vertices.Add(aPoint);
        }

        public void Transform(ThreeDMatrix m)
        {
            for (int i = 0; i < Vertices.Count; i++)
            {
                ((ThreeDPoint)Vertices[i]).Transform(m);
            }
        }

        public void Scale(float val)
        {
            for (int i = 0; i < Vertices.Count; i++)
            {
                ((ThreeDPoint)Vertices[i]).Scale(val);
            }
        }

        public void Translate(float[] v)
        {
            for (int i = 0; i < Vertices.Count; i++)
            {
                ((ThreeDPoint)Vertices[i]).Translate(v);
            }
        }

        public void RotateAt(ThreeDPoint origin, float angle)
        {
            for (int i = 0; i < Vertices.Count; i++)
            {
                ((ThreeDPoint)Vertices[i]).RotateAt(origin, angle);
            }
        }




        public void RotateX(ThreeDPoint origin, float degrees)
        {
            for (int i = 0; i < Vertices.Count; i++)
            {
              ((ThreeDPoint)Vertices[i]).RotateX(origin, degrees);
            }
        }

        public ThreeDPoint GetCenter()
        {
            ThreeDPoint p = new ThreeDPoint(0, 0, 0);
            for (int i = 0; i < Vertices.Count; i++)
            {
                p = p + (ThreeDPoint)Vertices[i];
            }

            p.DivideThePoint(Vertices.Count);

            return p;

        }

        PointF[] GetVertices2D()
        {
            PointF[] points = new PointF[Vertices.Count];
            for (int i = 0; i < Vertices.Count; i++)
            {
                points[i] = ((ThreeDPoint)Vertices[i]).To2D(GetCenter());
            }

            return points;

        }

        public void Fill(Graphics g, Color aColor)
        {
         
            PointF[] vertices2d = GetVertices2D();
            g.FillPolygon(new SolidBrush(aColor), vertices2d, FillMode.Alternate);
        }

        public void Draw(Graphics g)
        {
            Pen aPen = new Pen(TheColor, 1);
            for (int i = 0; i < Vertices.Count-1; i++)
            {
              g.DrawLine(aPen,
                  ((ThreeDPoint)Vertices[i]).To2D(GetCenter()),
                  ((ThreeDPoint)Vertices[i+1]).To2D(GetCenter()));

            }

            aPen.Dispose();
        }
    }
Avatar billede nielle Nybegynder
18. september 2007 - 17:54 #9
Hmmm, jeg tror desværre at jeg mangler nogle helt centrale ideer om hvilke værdier du har i dine:

Polygons[i].Vertices

ArrayList.

Jeg synes at du skulle prøve emd noget debug kode som enten skriber værdierne runtime til en fil eller til en MessageBox. Måske er der en fejl i en af dine 3D formler et sted sådan at din terning faktisk tegnes udenfor formen.

Et spørgsmål/råd: Hvorfor ikke bruge generics:

List<ThreeDPoint> Vertices

i stedet for ArrayList. På den måde slipper du for en masse typecasts - hvilket:

1) Gør din kode lettere at læse, og
2) Forbedre performance...
Avatar billede alex_sleiborg Nybegynder
20. september 2007 - 13:46 #10
Grunden til der er brugt arraylist, er fordi det er lavet i .net 1.1.

Smid et svar, jeg gider ikke bruge mere tid på det. Det er alligevel et ligegyldigt projekt anyway... Men tak fordi du gad at bruge lidt tid på det:)
Avatar billede nielle Nybegynder
20. september 2007 - 19:05 #11
Ok - troede egentlig at de fleste var skiftet til 2.0 efterhånden?
Avatar billede alex_sleiborg Nybegynder
21. september 2007 - 08:30 #12
Jo, er jeg da også... Men klassen er bare skrevet for mange år siden. Så den er ikke blevet optimeret siden...
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