Guest User

Untitled

a guest
Jan 22nd, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.83 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Drawing.Drawing2D;
  10.  
  11. namespace VrcholyandHrany
  12. {
  13. // ****************************************************************************************************************************************
  14. // ---------------------------------------------------------------- Vrchol-----------------------------------------------------------------
  15. // ****************************************************************************************************************************************
  16.  
  17.  
  18. public class Vrchol
  19. {
  20. const int prumervrcholu = 10;
  21. const int tloustka_oramovani = 3;
  22. const int nutna_presnost = 10; // Nastavuje toleranci do jake vzdalenosti od vrcholu muzete kliknout, aby program vrchol jeste oznacil ...
  23.  
  24.  
  25. Point bod; // Umisteni vrcholu
  26. GraphicsPath cesta = new GraphicsPath();
  27. List<Hrana> inc_hrany = new List<Hrana>(); // Vsechny hrany incidujici s vrcholem
  28.  
  29. //--------------------------- Konstruktor ------------------------------------
  30. public Vrchol(Point b, ref List<Vrchol> vrcholy)
  31. {
  32. this.bod = b;
  33. cesta.AddEllipse(bod.X, bod.Y, prumervrcholu, prumervrcholu);
  34. vrcholy.Add(this);
  35. }
  36.  
  37. //---------------------------Property ----------------------------------------
  38.  
  39. public List<Hrana> Incidujici
  40. {
  41. get
  42. {
  43. return inc_hrany;
  44. }
  45. }
  46.  
  47. //-------------------- Metody ------------------------------------------------
  48. //Vykresli vrchol
  49. public void Kresli(Graphics g)
  50. {
  51. Pen p = new Pen(Color.Black, tloustka_oramovani);
  52. g.DrawPath(p, this.cesta);
  53. }
  54. //Vykresli vrchol jako oznaceny
  55. public void Oznac(Graphics g)
  56. {
  57. Pen p = new Pen(Color.Red);
  58. Brush stetka = new SolidBrush(Color.Red);
  59. g.DrawPath(p, this.cesta);
  60. g.FillPath(stetka, this.cesta);
  61. }
  62.  
  63. //Prida incidencni hranu
  64. public void HranaInc(Hrana h)
  65. {
  66. inc_hrany.Add(h);
  67. }
  68. //Odebere incidencni hranu
  69. public void HranaNeic(Hrana h)
  70. {
  71. inc_hrany.Remove(h);
  72. }
  73. // Vraci pozici stredu tohoto vrcholu
  74. public Point Pozice()
  75. {
  76. Point a = new Point(0, 0);
  77. a.X = this.bod.X + 5; a.Y = this.bod.Y + 5;
  78. return a;
  79. }
  80. // Vraci true pokud vrchol lezi ve vzdalenosti "nutna_presnost" od bodu kliknuti mysi
  81. public bool Hit(Point b)
  82. {
  83. Pen p = new Pen(Color.Red, nutna_presnost);
  84.  
  85. return cesta.IsOutlineVisible(b, p);
  86. }
  87. // Pohyb s vrcholem pomoci standardni maticove transformace (parametry posun na x a posun po y)
  88. public void Move(int x, int y)
  89. {
  90. using (var mtx = new Matrix(1, 0, 0, 1, x, y)) cesta.Transform(mtx);
  91. this.bod.X = this.bod.X + x;
  92. this.bod.Y = this.bod.Y + y;
  93.  
  94. foreach (var d in this.inc_hrany)
  95. {
  96. d.Tvar();
  97. }
  98.  
  99.  
  100. }
  101.  
  102.  
  103.  
  104. }
  105.  
  106.  
  107. // ************************************************************************************************************************
  108. // ----------------------------------------------------------- Hrana ------------------------------------------------------
  109. // ************************************************************************************************************************
  110.  
  111.  
  112. public class Hrana
  113. {
  114. const int presnost = 30;
  115. const int velikost_pisma = 20;
  116. const float width_sipka = 4.5f;
  117. const int height_sipka = 6;
  118.  
  119. Vrchol vrchol1; // Vzdy vychozi hrana ze ktere jsme hranu vedli
  120. Vrchol vrchol2; // pokud otacime hranu tyto dve promenne prohodime
  121. bool jednosmerna; // true znaci, ze po hrane je mozne se pohybovat pouze ve smeru od vrchol1 do vrcholu2, ale naopak ne
  122. Hrana doublehrana = null; // Pomocna promenna, ktera nam usnadni zivot, ukladama zde hranu ktera jde v opacnem smeru, vyhodne pro mazani otaceni atd...
  123. int vaha;
  124.  
  125. public int posuny, posunx = 0;
  126. GraphicsPath cesta = new GraphicsPath();
  127. GraphicsPath cestavaha = new GraphicsPath(); // Popisek pro vahu hrany
  128.  
  129. //---------------------------------------------------Property ---------------------------------------------------------------------
  130. public Vrchol Vrchol1
  131. {
  132. set { vrchol1 = value; }
  133. get { return vrchol1; }
  134. }
  135.  
  136. public Vrchol Vrchol2
  137. {
  138. set { vrchol2 = value; }
  139. get { return vrchol2; }
  140. }
  141.  
  142. public int Vaha
  143. {
  144. set { this.vaha = value; }
  145. get { return this.vaha; }
  146. }
  147.  
  148.  
  149. public Hrana Doublehrana
  150. {
  151. get { return this.doublehrana; }
  152. set { doublehrana = value; }
  153. }
  154. public bool Jednosmerna
  155. {
  156. get { return this.jednosmerna; }
  157. set { jednosmerna = value; }
  158. }
  159. //-----------------------------------------Konstruktor-------------------------------------------------------------------------
  160.  
  161. public Hrana(Vrchol a, Vrchol b, bool jednosm, int v)
  162. {
  163. this.vrchol1 = a; this.vrchol2 = b;
  164. vaha = v;
  165. this.doublehrana = null; this.jednosmerna = jednosm;
  166.  
  167. }
  168.  
  169. //-----------------------------------------Metody----------------------------------------------------------------------------
  170. public void Tvar()
  171. {
  172. PointF pismo = Point.Empty;
  173.  
  174. this.cesta.Reset(); this.cestavaha.Reset(); // smaz predchozi tvary
  175.  
  176. PointF bodstart = this.vrchol1.Pozice(); // Vychozi bod cesty
  177. PointF bodkonec = this.vrchol2.Pozice(); // Koncovy bod cesty
  178.  
  179. String vahas = " " + this.vaha.ToString();
  180.  
  181. PointF pomocny = new PointF(0, 0);
  182. if (this.doublehrana != null) // Existuje opacna hrana musime vytvorit oblouk
  183. {
  184. PointF poma = new PointF(0, 0); // ridici body pro
  185. PointF pomb = new PointF(0, 0); // Bezierovy krivky
  186. PointF vektor = new PointF(0, 0);
  187.  
  188. //------- Jednoduchy vypocet pro nalezeni spravnych ridicich bodu
  189. vektor.X = (bodstart.Y - bodkonec.Y) / 4;
  190. vektor.Y = (bodkonec.X - bodstart.X) / 4;
  191.  
  192. poma.X = bodstart.X + vektor.X;
  193. poma.Y = bodstart.Y + vektor.Y;
  194. pomb.X = bodkonec.X + vektor.X;
  195. pomb.Y = bodkonec.Y + vektor.Y;
  196.  
  197. //--------- Konec vypoctu
  198.  
  199. cesta.AddBezier(bodstart, poma, pomb, bodkonec);
  200. pomocny.X = (poma.X + pomb.X) / 2; // Bod pro zobrazeni vahy hrany
  201. pomocny.Y = (poma.Y + pomb.Y) / 2;
  202.  
  203.  
  204.  
  205. }
  206. else // Jinak staci jednoducha primka
  207. {
  208. cesta.AddLine(bodstart, bodkonec);
  209.  
  210. pomocny.X = (bodstart.X + bodkonec.X) / 2; // Bod pro zobrazeni vahy hrany
  211. pomocny.Y = (bodstart.Y + bodkonec.Y) / 2;
  212.  
  213.  
  214.  
  215. }
  216. cestavaha.AddString(vahas, new FontFamily("Arial"), (int)FontStyle.Regular, velikost_pisma, pomocny, StringFormat.GenericDefault);
  217.  
  218.  
  219. }
  220.  
  221. /* Vykresli tuto hranu, v zavislosti na parametrech urci koncove znacky pera,
  222. * parametr vazene rozhodne o tom zda vykreslovat vahy hran (ve prostred hrany)
  223.  
  224. */
  225. public void Kresli(Graphics g, bool orientovane, bool vazene, Color color)
  226. {
  227. Pen pero = new Pen(color, 3);
  228. if (orientovane)
  229. {
  230. if (jednosmerna)
  231. {
  232.  
  233. pero.StartCap = LineCap.NoAnchor;
  234. pero.CustomEndCap = new AdjustableArrowCap(width_sipka, height_sipka);
  235.  
  236.  
  237. }
  238. else
  239. {
  240. pero.CustomStartCap = new AdjustableArrowCap(width_sipka, height_sipka);
  241. pero.CustomEndCap = new AdjustableArrowCap(width_sipka, height_sipka);
  242. }
  243. }
  244.  
  245. g.DrawPath(pero, this.cesta);
  246.  
  247. if (vazene)
  248. {
  249. Pen pismo = new Pen(Color.Black, 2); Brush stetec = new SolidBrush(Color.DarkGray);
  250. g.DrawPath(pismo, this.cestavaha); g.FillPath(stetec, this.cestavaha);
  251. }
  252. }
  253.  
  254.  
  255. //Vraci true pokud pozice mysi je dostatecne blizko k nasi hrane ( GraphicPath)
  256. public bool Hit(Point b)
  257. {
  258. Pen p = new Pen(Color.Red, presnost);
  259.  
  260. return cesta.IsOutlineVisible(b, p);
  261. }
  262.  
  263. }
  264. }
Add Comment
Please, Sign In to add comment