hexes.rs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. extern crate gunpowder_treason as gt;
  2. #[macro_use] extern crate itertools;
  3. use std::f64::consts::PI;
  4. fn main() {
  5. let mut drawing = gt::svg(11.0, 14.0);
  6. drawing.add(gt::rect((0.0, 0.0), (11.0, 14.0)));
  7. const N: f64 = 0.2;
  8. const THETA: f64 = PI / 3.0;
  9. const COLS: u32 = 16;
  10. const ROWS: u32 = 36;
  11. const XO: f64 = 0.8;
  12. const YO: f64 = 0.8;
  13. for (y, x) in iproduct!(0..ROWS, 0..COLS) {
  14. let d = 2.0 * (N + THETA.cos() * N);
  15. let a = THETA.cos() * N;
  16. let h = THETA.sin() * N;
  17. let h2 = THETA.sin() * N * 2.0;
  18. let by = YO + y as f64 * h2;
  19. drawing.add(
  20. gt::line(XO + d * x as f64, by)
  21. .to(XO + d * x as f64 - a, by + h)
  22. );
  23. drawing.add(
  24. gt::line(XO + d * x as f64, by)
  25. .to(XO + d * x as f64 + N, by)
  26. );
  27. drawing.add(
  28. gt::line(XO + d * x as f64 + N, by)
  29. .to(XO + d * x as f64 + N + a, by + h)
  30. );
  31. if x < COLS - 1 {
  32. drawing.add(
  33. gt::line(XO + d * x as f64 + N + a, by + h)
  34. .to(XO + d * x as f64 + N * 2.0 + a, by + h)
  35. );
  36. }
  37. drawing.add(
  38. gt::line(XO + d * x as f64 - a, by + h)
  39. .to(XO + d * x as f64, by + h * 2.0)
  40. );
  41. if y == ROWS - 1 {
  42. drawing.add(
  43. gt::line(XO + d * x as f64, by + h * 2.0)
  44. .to(XO + d * x as f64 + N, by + h * 2.0)
  45. );
  46. }
  47. drawing.add(
  48. gt::line(XO + d * x as f64 + N + a, by + h)
  49. .to(XO + d * x as f64 + N, by + h * 2.0)
  50. );
  51. }
  52. drawing.to_stdout();
  53. }