Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

problem sa predugackim izracunavanjem

[es] :: .NET :: problem sa predugackim izracunavanjem

[ Pregleda: 899 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

djomlacar
Student

Član broj: 187268
Poruke: 23
*.dynamic.isp.telekom.rs.



Profil

icon problem sa predugackim izracunavanjem08.09.2011. u 14:46 - pre 153 meseci
pozdrav svima,radi se o sledecem: imam program u C#-u koji radi izracunavanje povrsine,i koji RADI na svim racunarima na kojima je pokrenut.Problem je u tome sto na nekim racunarima odradi posao za 6-7 sekundi,a na nekima za 10-15 minuta.Da li neko ima ideju zasto je to tako?kod je sledeci:
Code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace mladja
{
    public partial class Form1 : Form
    {

        private List<Point> polygonP = new List<Point>();//lista tacaka
        private Color _color = Color.Blue; // boja linija
        private float _width = 1; // sirina linije
        private bool isDoubleClicked = false;

        public Form1()
        {
            InitializeComponent();
        }

        
        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if (polygonP.Count > 0)
            {
                this.Text = "Prva: " + polygonP[0].ToString() + " - trenutna: " +
                    new Point(e.X, e.Y).ToString();
            }
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            if (polygonP.Count > 1)
            {
                //draw the lines using a GraphicsPath
                System.Drawing.Drawing2D.GraphicsPath gPath = new System.Drawing.Drawing2D.GraphicsPath();
                gPath.AddLines(polygonP.ToArray());

                e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

                using (Pen p = new Pen(_color, _width))
                    e.Graphics.DrawPath(p, gPath);

                if (isDoubleClicked)
                {
                    
                    e.Graphics.FillPolygon(Brushes.Black, polygonP.ToArray()); //boji poligon
                    //uklanjaju se sve mogucnosti za dalje crtanje(onemogućuje sve ivente)
                    panel1.MouseClick -= panel1_MouseClick;
                    panel1.MouseMove -= panel1_MouseMove;
                    panel1.Paint -= panel1_Paint;
                    panel1.MouseDoubleClick -= panel1_MouseDoubleClick;

                }

                //cleanup
                gPath.Dispose();
            }
        }

        private void panel1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            polygonP.Add(new Point(polygonP[polygonP.Count - 1].X,
                polygonP[polygonP.Count - 1].Y));
            polygonP.Add(new Point(polygonP[0].X,
                polygonP[0].Y));


            this.panel1.Invalidate();

            isDoubleClicked = true;
        }



        private void panel1_MouseClick(object sender, MouseEventArgs e)
        {
            polygonP.Add(new Point(e.X, e.Y));
            this.panel1.Invalidate();
            textBox1.Text += new Point(e.X, e.Y).ToString();
        }


        private void CalculateArea()
        {
            int totalArea = 0;
            int x = this.Location.X + 20;
            int y = this.Location.Y + 20;
            int sbar = 0;
            
            ProgressBar pbar = new ProgressBar();
            pbar.Location = new Point(35, 411);
            pbar.Name = "progressbar";
            pbar.Width = 713;
            pbar.Height = 20;
            Controls.Add(pbar);
            pbar.Minimum = 0;
            pbar.Maximum = panel1.Size.Width - panel1.Location.X - x;


            for (int i = panel1.Location.X + x; i < panel1.Size.Width; i++)
            {
                for (int j = panel1.Location.Y + y; j < panel1.Size.Height; j++)
                {
                    if (GetColor(new Point(i, j)).Name == "ff000000")
                    {
                        totalArea++;
                    }
                }
                sbar += 1;
                pbar.Value = sbar;
            }

            MessageBox.Show("Povrsina je " + totalArea.ToString() + " tacaka");      
        }

        private Color GetColor(Point position)
        {
            using (var bitmap = new Bitmap(1, 1))
            {
                using (var graphics = Graphics.FromImage(bitmap))
                {
                    graphics.CopyFromScreen(position, new Point(0, 0), new Size(1, 1));
                }
                return bitmap.GetPixel(0, 0);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (isDoubleClicked == false)
            {
                MessageBox.Show("Kontura nije zatvorena");
                return;
            }

            
            CalculateArea();
        }

        
    }
}

Napominjem da su svi probani racunari priblizno istih performansi,kao i da je u pitanju isto okruzenje MVS 2010 kao i isti operativni sistem,Windows 7.
 
Odgovor na temu

Boris B.
Ljubljana

Član broj: 213615
Poruke: 286
*.evj-kabel.net.



+14 Profil

icon Re: problem sa predugackim izracunavanjem08.09.2011. u 17:50 - pre 153 meseci
Nije ti dobro to izracunavanje povrsine, nece raditi tacno sa segmentima koji nisu paralelni sa X i Y. Ako imas pravougli trougao sa katetama 4 onda ce ta tvoja povrsina da bude 4+3+2+1 = 10 a ne 4x4/2 = 8 kao sto jeste. I ako koristis antialiasing zaboravi na tacnu boju na ivicama oblika. A sporo ti radi zato sto u funkciji GetColor kreiras, kopiras i unistavas bitmapu i to za svaki piksel WxH (i to jos na kraju uporedjujes sa bojom kao stringom).

Nego kad ti je vec taj oblik u stvari poligon (polygonP), iskoristi onu funkciju sto sam ti napisao pre tri dana, ona ce da radi tacno i brzo.




if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
 
Odgovor na temu

[es] :: .NET :: problem sa predugackim izracunavanjem

[ Pregleda: 899 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.