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

Crtanje krive (funkcije) ?

[es] :: .NET :: Crtanje krive (funkcije) ?

[ Pregleda: 3622 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

dr.AgOlO
Milan D.
MunZe

Član broj: 16417
Poruke: 95
*.vdial.verat.net.



Profil

icon Crtanje krive (funkcije) ?15.12.2004. u 09:03 - pre 234 meseci
Molio bih za pomoc oko ideje a moze i realizacije :)
Naime, trebao bi da napravim neku metodu ili ... koja ce na osnovu ulaznih tacaka da iscrtava grafik (2D ili 3D u zavisnosti od broja promenljivih x1,x2 ili x3) ali tu postoji jedan problem, to bi trebalo da bude animacija. Ako bilo ko ima ikakvih ideja neka pise.
Zaboravih da napomenem da bi to sve trebalo da se odradi u C#.
Pozdrav.
 
Odgovor na temu

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
*.fiberop.matgnet.com.

Sajt: www.mika.rs


+6 Profil

icon Re: Crtanje krive (funkcije) ?15.12.2004. u 16:28 - pre 234 meseci
Citat:
Molio bih za pomoc oko ideje a moze i realizacije


Siguran sam da ce ljudi pomoci ako postavis konkretno pitanje. Daj reci neke masne detalje

Citat:
postoji jedan problem, to bi trebalo da bude animacija


Kako to mislis 'animacija' ?! Da se prikazuje u realnom vremenu pracenje nekih parametara ? Koliko brzo treba da se osvezava, mozda moze da se odradi preko GDI ?!



munZe konZa ! Vaistinu konza
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

dr.AgOlO
Milan D.
MunZe

Član broj: 16417
Poruke: 95
*.vdial.verat.net.



Profil

icon Re: Crtanje krive (funkcije) ?15.12.2004. u 19:53 - pre 234 meseci
Ma pazi nista preterano kompikovano sto se tice crtanja.
Recimo da ja prosledim toj metodi matricu dimenzija n*m gde je n broj vrsta a m broj kolona. Npr. prvu vrstu niza sacinjavaju tacke za x-osu, drugu vrstu za y-osu i eventualno ako postoji i treca vrsta to su tacke z-ose. E sad ta metoda bi trebalo na osnovu tih podataka i recimo maksimalnih dimenzija x,y,z-osa da iscrta kretanje te tacke tj. liniju koja povezuje sve te tacke.Ali to bi trebalo da se odradi u realtime-u i da to crtanje traje ~ 10-15 sec. (mada bi i to zavisilo od broja elemenata niza).

Pozdrav.
 
Odgovor na temu

idb
Ivan Bulic
Beograd

Član broj: 4436
Poruke: 402



Profil

icon Re: Crtanje krive (funkcije) ?16.12.2004. u 09:17 - pre 234 meseci
Mozda ti je odgovara ovo resenje: 2D Math Curve Presentation for your Project
http://www.codeproject.com/csharp/PlothelpAlltogether.asp
Iz command prompta unosis funkciju (jednu ili vise), program ih lepo parsira i nacrta grafikon.
Pogledaj kako je covek to uradio, pa ces siguno naci i resenje da ti se to polako iscrtava.
Mislim da ces ovim resiti i problem koji si postavio u postu u vezi parcijalnih izvoda http://www.elitesecurity.org/tema/83323
 
Odgovor na temu

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
*.fiberop.matgnet.com.

Sajt: www.mika.rs


+6 Profil

icon Re: Crtanje krive (funkcije) ?16.12.2004. u 13:24 - pre 234 meseci
Ovo sto ti je dao idb je uz male prepravke to sta trazis.

Trebao bi jos da dodas Timer koji ce da odradi iscrtavanje tacku po tacku. Najbolje bi bilo da klasu za isrtavanje zakacis za Graphics nekog panela na formi gde ce biti taj grafik, i da se zakacis za njegov Paint event za eventualno ovezavanje. Samo nisam siguran kako ce se eventi forme ponasati zbog Timera, ali nacelno to je to.

Ako treba da bude bash mega_ultra_super_trubo transparento, onda bi trebao da napravis jedan thread za animaciju.

Vici ako ti nesto treba

BTW bash radim slicnu stvar (obican grafik) za asp.net, pa mi ne bi bio problem da prepravim klasu da radi ovo sta ti zelis. Eto, toliko sam dobar covek :>
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

dr.AgOlO
Milan D.
MunZe

Član broj: 16417
Poruke: 95
*.vdial.verat.net.



Profil

icon Re: Crtanje krive (funkcije) ?16.12.2004. u 18:14 - pre 234 meseci
Bio bih ti veoma zahvalan ako bi to mogao da odradis, ali postoji jedna stvar koju ste mozda prevideli a to je i mogucnost iscrtavanja putanje tacke za tri koordinate (x,y,z). Jos jednom kazem ako ti nije cim probaj da odradis to.

Pozdrav!
 
Odgovor na temu

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
*.ptt.yu.

Sajt: www.mika.rs


+6 Profil

icon Re: Crtanje krive (funkcije) ?19.12.2004. u 11:08 - pre 234 meseci
Pozdrav

Klasa nije jos zavrsena, a kada ce - ne znamo Trenutno sam u nekoj frci-panici, pa ce ovo morati da priceka bolje dane.
Uglavnom, ima ono sta trazis .... pa manje vise. Klasa za sada radi samo sa jedno-dimenzionalnim nizom, ali nije prosto da ubacis da vrednosti za ordinatu
uzimas iz drugog clana niza.

Da pokrenes, napravi jedan panel (ili bilo koji drugi objekat kome mozes uzeti GDI handle) i pozoves konstruktor:

Code:

chart = new CChartDraw(panel1.CreateGraphics(),
        panel1.Width, panel1.Height);


i da na nekom eventu (npr. button click) pokrenes sa metodom StartAnimation();

Posto klasa crta po Bitmap objektu, uz malo dorade mozes da osvezavas sliku na OnPaint eventu.

Code:

#define ANIMATION

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.Collections;

#if DEBUG
using System.Diagnostics;
#endif

namespace ChartDraw
{    
    public class CChartDraw
    {
        private System.Drawing.Graphics gSurface;
        private Bitmap surface;
        private int border_size;
        private Color border_color = Color.White, body_color = Color.LightGray, grid_color = Color.Black,
                line_color = Color.Blue;
        private bool draw_grid = false,    draw_coordinates = false;
        private float line_size = 1;
        private Size area;

#if ANIMATION
        private Point pStart, pEnd;
        private Timer tmr;
        private int eCounter = 0;
        long min = 0, max = 0;
        private float kx=0, ky=0;    
        private ArrayList valuesArray;
        private float line_kx, line_ky;
        private int steps, stepCounter;
        private Bitmap bmp;
#endif
        
        #region Constructors
        public CChartDraw()
        {
            surface = new Bitmap(16, 16);
            gSurface = Graphics.FromImage(surface);

            border_size = 0;
        }

        public CChartDraw(int x, int y)
        {
            surface = new Bitmap(x, y);
            gSurface = Graphics.FromImage(surface);

            border_size = 0;
        }        
        
        public CChartDraw(Graphics g,int width, int height)
        {
            gSurface = g;
            surface = null;

            border_size = 0;

            area = new Size(width, height);

#if ANIMATION
            pStart = new Point(0,0);
            pEnd = new Point(0,0);
#endif
        }
        #endregion


        public float LineSize
        {
            get
            {
                return line_size;
            }
            set
            {
                line_size = value;
            }
        }
        public Color LineColor
        {
            get
            {
                return line_color;
            }
            set
            {
                line_color = value;
            }
        }
        public Color GridColor
        {
            get
            {
                return grid_color;
            }

            set
            {
                grid_color = value;
            }
        }
        public Color BorderColor
        {
            get
            {
                return border_color;
            }
            set
            {
                border_color = value;
            }
        }

        public Color BodyColor
        {
            get
            {
                return body_color;
            }
            set
            {
                body_color = value;
            }
        }

        public bool DrawGrid
        {
            get
            {
                return draw_grid;
            }
            set
            {
                draw_grid = value;
            }
        }
        public bool DrawCoordinates
        {
            get
            {
                return draw_coordinates;
            }
            set
            {
                draw_coordinates= value;
            }
        }
        public int BorderSize
        {
            get
            {
                return border_size;
            }
            set
            {
                border_size = value;
            }
        }
        public void ApplyChart(Graphics g)
        {
            if(surface != null){
                g.DrawImage(surface, 0, 0);
                g.Flush();
            }
        }
        

        public void DrawChart(ArrayList arr)
        {
#if !ANIMATION
            long min = 0, max = 0;
            float kx=0, ky=0;
#endif
            int elements = 0;            
            int xs = 0, ys = area.Height ;            

            foreach(object o in arr)
            {                
                if((int)o > max) max = (int)o;
                if((int)o < min) min = (int)o;
                elements++;
            }
            
            if(elements > 0)
            {                
                kx = (float)(area.Width - (border_size<<1))/elements;
                ky = (float)(area.Height - (border_size<<1))/(max-min);
            }

            gSurface.FillRectangle(new SolidBrush(border_color),0,0, area.Width, area.Height);            
            gSurface.FillRectangle(new SolidBrush(body_color), border_size, border_size,
                    area.Width - (border_size<<1), area.Height - (border_size<<1));

            if(draw_grid)
            {
                // TODO grid
            }

            if(draw_coordinates)
            {
                gSurface.DrawLine(new Pen(new SolidBrush(Color.Black), 2), border_size,
                    area.Height + (min * ky) - border_size,
                    area.Width - border_size,
                    area.Height + (min * ky) - border_size);
            }

            elements = 0;
            
            xs = border_size;
            ys = area.Height - border_size;

            foreach(object o in arr)
            {                
                gSurface.DrawLine(new Pen(line_color, line_size),xs,ys,
                    (xs=(int)(elements*kx)+border_size),
                    (ys=area.Height - (int)((int)o * ky) - border_size + (int)(min*ky)));
                elements++;
            }
        }

        private void PrepareBackground()
        {
        }

#if ANIMATION
        public void StartAnimation(ref ArrayList arr, int interval)
        {
            int elements = 0;            

            valuesArray = arr;
            
            foreach(object o in valuesArray)
            {                
                if((int) o > max) max = (int) o;
                if((int) o < min) min = (int) o;
                elements++;
            }
            
            if(elements > 0)
            {                
                kx = (float) (area.Width - (border_size<<1))/elements;
                ky = (float) (area.Height - (border_size<<1))/(max-min);
            }

            tmr = new Timer();
            tmr.Interval = interval;
            tmr.Tick += new EventHandler(tmr_Tick);            

            bmp = new Bitmap(area.Width, area.Height, gSurface);

            eCounter = 1;
            stepCounter = -1;

            pStart.X = border_size;    // TODO zameni se sa drugim clanom niza
            pStart.Y = area.Height - (int) ((int) valuesArray[0]*ky) - border_size + (int) (min*ky);

            tmr.Start();
        }

        private void tmr_Tick(object sender, EventArgs e)
        {
            int lenX, lenY;
            int x, y;

            if(stepCounter >= steps)
            {                
                stepCounter = -1;
                eCounter++;

                pStart.X = pEnd.X;
                pStart.Y = pEnd.Y;                
            }
            
            if(eCounter >= valuesArray.Count)
            {
                ((Timer) sender).Stop();            
                return;
            }

            if(stepCounter < 0)
            {                
                pEnd.X = (int) (eCounter*kx) + border_size;    // TODO isto zameniti sa drugim clanom niza :)
                pEnd.Y = area.Height - (int) ((int) valuesArray[eCounter] * ky) - border_size + (int) (min*ky);

                lenX = (pEnd.X - pStart.X);
                lenY = (pEnd.Y - pStart.Y);

                // HACK Hmmmmmmmmmmm
                steps = (lenX<0)?lenX*-1:lenX;
                if(steps < ((lenY<0)?lenY*-1:lenY)) steps=((lenY<0)?lenY*-1:lenY);                
            
                line_kx = (float)lenX/steps;
                line_ky = (float)lenY/steps;

                stepCounter = 0;
            }                        

            x = ((int)(stepCounter * line_kx)) + pStart.X;
            y = ((int)(stepCounter * line_ky)) + pStart.Y;
            
            bmp.SetPixel(x,y, line_color);
            if((stepCounter&0x1) > 0) gSurface.DrawImage(bmp, 0,0);
            stepCounter++;
        }        
#endif        
    }
}



Ako bude nekih problema, slobodno pitaj


America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

MAPJAH

Član broj: 21574
Poruke: 6
*.nspoint.net.



Profil

icon Re: Crtanje krive (funkcije) ? Koordinatni sistem22.01.2005. u 12:48 - pre 233 meseci
Postovanje,
imam problem u c# i sa crtanjem prave...
hocu jednu pravu da nacrtam u PictureBox...i sad koordinatni pocetak mi je u gornjem levom uglu...

* imam niz tacaka (pointa)
kako da kreiram koordinatni sistem tako kad ubacijem te tacke da mi crta od donjeg levog ugla...

da li moram da rotiram....ili mogu nekako da podesim da mi je tacka (0,0) bude u donjem levom uglu PictureBox-a..
Hvala
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.3dnet.co.yu.



+311 Profil

icon Re: Crtanje krive (funkcije) ?22.01.2005. u 15:35 - pre 233 meseci
Od visine PictureBox-a oduzmi Y koordinatu tačke i dobices Y' koordinatu te tačke i nju onda koristi kad crtas nesto.
 
Odgovor na temu

[es] :: .NET :: Crtanje krive (funkcije) ?

[ Pregleda: 3622 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

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