agg_dda_line.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. //----------------------------------------------------------------------------
  2. // Anti-Grain Geometry - Version 2.4
  3. // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
  4. //
  5. // C# port by: Lars Brubaker
  6. // larsbrubaker@gmail.com
  7. // Copyright (C) 2007
  8. //
  9. // Permission to copy, use, modify, sell and distribute this software
  10. // is granted provided this copyright notice appears in all copies.
  11. // This software is provided "as is" without express or implied
  12. // warranty, and with no claim as to its suitability for any purpose.
  13. //
  14. //----------------------------------------------------------------------------
  15. // Contact: mcseem@antigrain.com
  16. // mcseemagg@yahoo.com
  17. // http://www.antigrain.com
  18. //----------------------------------------------------------------------------
  19. //
  20. // classes dda_line_interpolator, dda2_line_interpolator
  21. //
  22. //----------------------------------------------------------------------------
  23. using System;
  24. namespace MatterHackers.Agg
  25. {
  26. //===================================================dda_line_interpolator
  27. public sealed class dda_line_interpolator
  28. {
  29. private int m_y;
  30. private int m_inc;
  31. private int m_dy;
  32. //int m_YShift;
  33. private int m_FractionShift;
  34. //--------------------------------------------------------------------
  35. public dda_line_interpolator(int FractionShift)
  36. {
  37. m_FractionShift = FractionShift;
  38. }
  39. //--------------------------------------------------------------------
  40. public dda_line_interpolator(int y1, int y2, int count, int FractionShift)
  41. {
  42. m_FractionShift = FractionShift;
  43. m_y = (y1);
  44. m_inc = (((y2 - y1) << m_FractionShift) / (int)(count));
  45. m_dy = (0);
  46. }
  47. //--------------------------------------------------------------------
  48. //public void operator ++ ()
  49. public void Next()
  50. {
  51. m_dy += m_inc;
  52. }
  53. //--------------------------------------------------------------------
  54. //public void operator -- ()
  55. public void Prev()
  56. {
  57. m_dy -= m_inc;
  58. }
  59. //--------------------------------------------------------------------
  60. //public void operator += (int n)
  61. public void Next(int n)
  62. {
  63. m_dy += m_inc * (int)n;
  64. }
  65. //--------------------------------------------------------------------
  66. //public void operator -= (int n)
  67. public void Prev(int n)
  68. {
  69. m_dy -= m_inc * (int)n;
  70. }
  71. //--------------------------------------------------------------------
  72. public int y()
  73. {
  74. return m_y + (m_dy >> (m_FractionShift));
  75. } // - m_YShift)); }
  76. public int dy()
  77. {
  78. return m_dy;
  79. }
  80. }
  81. //=================================================dda2_line_interpolator
  82. public sealed class dda2_line_interpolator
  83. {
  84. private enum save_size_e { save_size = 2 };
  85. //--------------------------------------------------------------------
  86. public dda2_line_interpolator()
  87. {
  88. }
  89. //-------------------------------------------- Forward-adjusted line
  90. public dda2_line_interpolator(int y1, int y2, int count)
  91. {
  92. m_cnt = (count <= 0 ? 1 : count);
  93. m_lft = ((y2 - y1) / m_cnt);
  94. m_rem = ((y2 - y1) % m_cnt);
  95. m_mod = (m_rem);
  96. m_y = (y1);
  97. if (m_mod <= 0)
  98. {
  99. m_mod += count;
  100. m_rem += count;
  101. m_lft--;
  102. }
  103. m_mod -= count;
  104. }
  105. //-------------------------------------------- Backward-adjusted line
  106. public dda2_line_interpolator(int y1, int y2, int count, int unused)
  107. {
  108. m_cnt = (count <= 0 ? 1 : count);
  109. m_lft = ((y2 - y1) / m_cnt);
  110. m_rem = ((y2 - y1) % m_cnt);
  111. m_mod = (m_rem);
  112. m_y = (y1);
  113. if (m_mod <= 0)
  114. {
  115. m_mod += count;
  116. m_rem += count;
  117. m_lft--;
  118. }
  119. }
  120. //-------------------------------------------- Backward-adjusted line
  121. public dda2_line_interpolator(int y, int count)
  122. {
  123. m_cnt = (count <= 0 ? 1 : count);
  124. m_lft = ((y) / m_cnt);
  125. m_rem = ((y) % m_cnt);
  126. m_mod = (m_rem);
  127. m_y = (0);
  128. if (m_mod <= 0)
  129. {
  130. m_mod += count;
  131. m_rem += count;
  132. m_lft--;
  133. }
  134. }
  135. /*
  136. //--------------------------------------------------------------------
  137. public void save(save_data_type* data)
  138. {
  139. data[0] = m_mod;
  140. data[1] = m_y;
  141. }
  142. //--------------------------------------------------------------------
  143. public void load(save_data_type* data)
  144. {
  145. m_mod = data[0];
  146. m_y = data[1];
  147. }
  148. */
  149. //--------------------------------------------------------------------
  150. //public void operator++()
  151. public void Next()
  152. {
  153. m_mod += m_rem;
  154. m_y += m_lft;
  155. if (m_mod > 0)
  156. {
  157. m_mod -= m_cnt;
  158. m_y++;
  159. }
  160. }
  161. //--------------------------------------------------------------------
  162. //public void operator--()
  163. public void Prev()
  164. {
  165. if (m_mod <= m_rem)
  166. {
  167. m_mod += m_cnt;
  168. m_y--;
  169. }
  170. m_mod -= m_rem;
  171. m_y -= m_lft;
  172. }
  173. //--------------------------------------------------------------------
  174. public void adjust_forward()
  175. {
  176. m_mod -= m_cnt;
  177. }
  178. //--------------------------------------------------------------------
  179. public void adjust_backward()
  180. {
  181. m_mod += m_cnt;
  182. }
  183. //--------------------------------------------------------------------
  184. public int mod()
  185. {
  186. return m_mod;
  187. }
  188. public int rem()
  189. {
  190. return m_rem;
  191. }
  192. public int lft()
  193. {
  194. return m_lft;
  195. }
  196. //--------------------------------------------------------------------
  197. public int y()
  198. {
  199. return m_y;
  200. }
  201. private int m_cnt;
  202. private int m_lft;
  203. private int m_rem;
  204. private int m_mod;
  205. private int m_y;
  206. }
  207. //---------------------------------------------line_bresenham_interpolator
  208. public sealed class line_bresenham_interpolator
  209. {
  210. private int m_x1_lr;
  211. private int m_y1_lr;
  212. private int m_x2_lr;
  213. private int m_y2_lr;
  214. private bool m_ver;
  215. private int m_len;
  216. private int m_inc;
  217. private dda2_line_interpolator m_interpolator;
  218. public enum subpixel_scale_e
  219. {
  220. subpixel_shift = 8,
  221. subpixel_scale = 1 << subpixel_shift,
  222. subpixel_mask = subpixel_scale - 1
  223. }
  224. //--------------------------------------------------------------------
  225. public static int line_lr(int v)
  226. {
  227. return v >> (int)subpixel_scale_e.subpixel_shift;
  228. }
  229. //--------------------------------------------------------------------
  230. public line_bresenham_interpolator(int x1, int y1, int x2, int y2)
  231. {
  232. m_x1_lr = (line_lr(x1));
  233. m_y1_lr = (line_lr(y1));
  234. m_x2_lr = (line_lr(x2));
  235. m_y2_lr = (line_lr(y2));
  236. m_ver = (Math.Abs(m_x2_lr - m_x1_lr) < Math.Abs(m_y2_lr - m_y1_lr));
  237. if (m_ver)
  238. {
  239. m_len = (int)Math.Abs(m_y2_lr - m_y1_lr);
  240. }
  241. else
  242. {
  243. m_len = (int)Math.Abs(m_x2_lr - m_x1_lr);
  244. }
  245. m_inc = (m_ver ? ((y2 > y1) ? 1 : -1) : ((x2 > x1) ? 1 : -1));
  246. m_interpolator = new dda2_line_interpolator(m_ver ? x1 : y1,
  247. m_ver ? x2 : y2,
  248. (int)m_len);
  249. }
  250. //--------------------------------------------------------------------
  251. public bool is_ver()
  252. {
  253. return m_ver;
  254. }
  255. public int len()
  256. {
  257. return m_len;
  258. }
  259. public int inc()
  260. {
  261. return m_inc;
  262. }
  263. //--------------------------------------------------------------------
  264. public void hstep()
  265. {
  266. m_interpolator.Next();
  267. m_x1_lr += m_inc;
  268. }
  269. //--------------------------------------------------------------------
  270. public void vstep()
  271. {
  272. m_interpolator.Next();
  273. m_y1_lr += m_inc;
  274. }
  275. //--------------------------------------------------------------------
  276. public int x1()
  277. {
  278. return m_x1_lr;
  279. }
  280. public int y1()
  281. {
  282. return m_y1_lr;
  283. }
  284. public int x2()
  285. {
  286. return line_lr(m_interpolator.y());
  287. }
  288. public int y2()
  289. {
  290. return line_lr(m_interpolator.y());
  291. }
  292. public int x2_hr()
  293. {
  294. return m_interpolator.y();
  295. }
  296. public int y2_hr()
  297. {
  298. return m_interpolator.y();
  299. }
  300. }
  301. }