Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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;
- using System.Drawing.Drawing2D;
- namespace VrcholyandHrany
- {
- // ****************************************************************************************************************************************
- // ---------------------------------------------------------------- Vrchol-----------------------------------------------------------------
- // ****************************************************************************************************************************************
- public class Vrchol
- {
- const int prumervrcholu = 10;
- const int tloustka_oramovani = 3;
- const int nutna_presnost = 10; // Nastavuje toleranci do jake vzdalenosti od vrcholu muzete kliknout, aby program vrchol jeste oznacil ...
- Point bod; // Umisteni vrcholu
- GraphicsPath cesta = new GraphicsPath();
- List<Hrana> inc_hrany = new List<Hrana>(); // Vsechny hrany incidujici s vrcholem
- //--------------------------- Konstruktor ------------------------------------
- public Vrchol(Point b, ref List<Vrchol> vrcholy)
- {
- this.bod = b;
- cesta.AddEllipse(bod.X, bod.Y, prumervrcholu, prumervrcholu);
- vrcholy.Add(this);
- }
- //---------------------------Property ----------------------------------------
- public List<Hrana> Incidujici
- {
- get
- {
- return inc_hrany;
- }
- }
- //-------------------- Metody ------------------------------------------------
- //Vykresli vrchol
- public void Kresli(Graphics g)
- {
- Pen p = new Pen(Color.Black, tloustka_oramovani);
- g.DrawPath(p, this.cesta);
- }
- //Vykresli vrchol jako oznaceny
- public void Oznac(Graphics g)
- {
- Pen p = new Pen(Color.Red);
- Brush stetka = new SolidBrush(Color.Red);
- g.DrawPath(p, this.cesta);
- g.FillPath(stetka, this.cesta);
- }
- //Prida incidencni hranu
- public void HranaInc(Hrana h)
- {
- inc_hrany.Add(h);
- }
- //Odebere incidencni hranu
- public void HranaNeic(Hrana h)
- {
- inc_hrany.Remove(h);
- }
- // Vraci pozici stredu tohoto vrcholu
- public Point Pozice()
- {
- Point a = new Point(0, 0);
- a.X = this.bod.X + 5; a.Y = this.bod.Y + 5;
- return a;
- }
- // Vraci true pokud vrchol lezi ve vzdalenosti "nutna_presnost" od bodu kliknuti mysi
- public bool Hit(Point b)
- {
- Pen p = new Pen(Color.Red, nutna_presnost);
- return cesta.IsOutlineVisible(b, p);
- }
- // Pohyb s vrcholem pomoci standardni maticove transformace (parametry posun na x a posun po y)
- public void Move(int x, int y)
- {
- using (var mtx = new Matrix(1, 0, 0, 1, x, y)) cesta.Transform(mtx);
- this.bod.X = this.bod.X + x;
- this.bod.Y = this.bod.Y + y;
- foreach (var d in this.inc_hrany)
- {
- d.Tvar();
- }
- }
- }
- // ************************************************************************************************************************
- // ----------------------------------------------------------- Hrana ------------------------------------------------------
- // ************************************************************************************************************************
- public class Hrana
- {
- const int presnost = 30;
- const int velikost_pisma = 20;
- const float width_sipka = 4.5f;
- const int height_sipka = 6;
- Vrchol vrchol1; // Vzdy vychozi hrana ze ktere jsme hranu vedli
- Vrchol vrchol2; // pokud otacime hranu tyto dve promenne prohodime
- bool jednosmerna; // true znaci, ze po hrane je mozne se pohybovat pouze ve smeru od vrchol1 do vrcholu2, ale naopak ne
- Hrana doublehrana = null; // Pomocna promenna, ktera nam usnadni zivot, ukladama zde hranu ktera jde v opacnem smeru, vyhodne pro mazani otaceni atd...
- int vaha;
- public int posuny, posunx = 0;
- GraphicsPath cesta = new GraphicsPath();
- GraphicsPath cestavaha = new GraphicsPath(); // Popisek pro vahu hrany
- //---------------------------------------------------Property ---------------------------------------------------------------------
- public Vrchol Vrchol1
- {
- set { vrchol1 = value; }
- get { return vrchol1; }
- }
- public Vrchol Vrchol2
- {
- set { vrchol2 = value; }
- get { return vrchol2; }
- }
- public int Vaha
- {
- set { this.vaha = value; }
- get { return this.vaha; }
- }
- public Hrana Doublehrana
- {
- get { return this.doublehrana; }
- set { doublehrana = value; }
- }
- public bool Jednosmerna
- {
- get { return this.jednosmerna; }
- set { jednosmerna = value; }
- }
- //-----------------------------------------Konstruktor-------------------------------------------------------------------------
- public Hrana(Vrchol a, Vrchol b, bool jednosm, int v)
- {
- this.vrchol1 = a; this.vrchol2 = b;
- vaha = v;
- this.doublehrana = null; this.jednosmerna = jednosm;
- }
- //-----------------------------------------Metody----------------------------------------------------------------------------
- public void Tvar()
- {
- PointF pismo = Point.Empty;
- this.cesta.Reset(); this.cestavaha.Reset(); // smaz predchozi tvary
- PointF bodstart = this.vrchol1.Pozice(); // Vychozi bod cesty
- PointF bodkonec = this.vrchol2.Pozice(); // Koncovy bod cesty
- String vahas = " " + this.vaha.ToString();
- PointF pomocny = new PointF(0, 0);
- if (this.doublehrana != null) // Existuje opacna hrana musime vytvorit oblouk
- {
- PointF poma = new PointF(0, 0); // ridici body pro
- PointF pomb = new PointF(0, 0); // Bezierovy krivky
- PointF vektor = new PointF(0, 0);
- //------- Jednoduchy vypocet pro nalezeni spravnych ridicich bodu
- vektor.X = (bodstart.Y - bodkonec.Y) / 4;
- vektor.Y = (bodkonec.X - bodstart.X) / 4;
- poma.X = bodstart.X + vektor.X;
- poma.Y = bodstart.Y + vektor.Y;
- pomb.X = bodkonec.X + vektor.X;
- pomb.Y = bodkonec.Y + vektor.Y;
- //--------- Konec vypoctu
- cesta.AddBezier(bodstart, poma, pomb, bodkonec);
- pomocny.X = (poma.X + pomb.X) / 2; // Bod pro zobrazeni vahy hrany
- pomocny.Y = (poma.Y + pomb.Y) / 2;
- }
- else // Jinak staci jednoducha primka
- {
- cesta.AddLine(bodstart, bodkonec);
- pomocny.X = (bodstart.X + bodkonec.X) / 2; // Bod pro zobrazeni vahy hrany
- pomocny.Y = (bodstart.Y + bodkonec.Y) / 2;
- }
- cestavaha.AddString(vahas, new FontFamily("Arial"), (int)FontStyle.Regular, velikost_pisma, pomocny, StringFormat.GenericDefault);
- }
- /* Vykresli tuto hranu, v zavislosti na parametrech urci koncove znacky pera,
- * parametr vazene rozhodne o tom zda vykreslovat vahy hran (ve prostred hrany)
- */
- public void Kresli(Graphics g, bool orientovane, bool vazene, Color color)
- {
- Pen pero = new Pen(color, 3);
- if (orientovane)
- {
- if (jednosmerna)
- {
- pero.StartCap = LineCap.NoAnchor;
- pero.CustomEndCap = new AdjustableArrowCap(width_sipka, height_sipka);
- }
- else
- {
- pero.CustomStartCap = new AdjustableArrowCap(width_sipka, height_sipka);
- pero.CustomEndCap = new AdjustableArrowCap(width_sipka, height_sipka);
- }
- }
- g.DrawPath(pero, this.cesta);
- if (vazene)
- {
- Pen pismo = new Pen(Color.Black, 2); Brush stetec = new SolidBrush(Color.DarkGray);
- g.DrawPath(pismo, this.cestavaha); g.FillPath(stetec, this.cestavaha);
- }
- }
- //Vraci true pokud pozice mysi je dostatecne blizko k nasi hrane ( GraphicPath)
- public bool Hit(Point b)
- {
- Pen p = new Pen(Color.Red, presnost);
- return cesta.IsOutlineVisible(b, p);
- }
- }
- }
Add Comment
Please, Sign In to add comment