grid.rs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. extern crate gunpowder_treason as gt;
  2. #[macro_use] extern crate itertools;
  3. const MAP: &'static [u8] =
  4. b"0000000000000000000001110000111100111100111111001111001001000111010011\
  5. 1111101110000001001111010011100111111000000100000001111111111111111100\
  6. 0111111000000000010001111110111011111110000001001110111111100111010011\
  7. 1011111110011101000100001000000111111111000010000001110100010001110000\
  8. 0111010011110111111000000100111101110010011101001111000000100111111011\
  9. 1101110010011100101111011111100010001000000111001001110111110001110110\
  10. 0010011111110111011001110111110101110111001001111101111101100111011111\
  11. 000111000000000000000000000000";
  12. fn main() {
  13. let (w, h) = (11.0, 14.0);
  14. let mut drawing = gt::svg(w, h);
  15. // drawing.add(gt::rect((0.0, 0.0), (11.0, 14.0)));
  16. const N: f64 = 0.5;
  17. let rows: usize = ((w - 1.0) / N).floor() as usize;
  18. let cols: usize = ((h - 1.0) / N).floor() as usize;
  19. let x_offset = (w - (rows as f64 * N)) / 2.0;
  20. let y_offset = (h - (cols as f64 * N)) / 2.0;
  21. let get_cell = |x: usize, y: usize| {
  22. let idx = x + y * rows;
  23. if idx < MAP.len() {
  24. Some(MAP[idx] as char)
  25. } else {
  26. None
  27. }
  28. };
  29. for (x, y) in iproduct!(0..rows-1, 0..cols-1) {
  30. let xc = x_offset + x as f64 * N;
  31. let yc = y_offset + y as f64 * N;
  32. let d = N / 5.0;
  33. let cs = N / 10.0;
  34. if get_cell(x, y)
  35. .and_then(|l| get_cell(x + 1, y)
  36. .map(|r| l != r)).unwrap_or(false) {
  37. drawing.add(gt::line(xc+N, yc).to(xc+N, yc+N));
  38. let xt = if get_cell(x, y) == Some('0') {
  39. xc + N - 0.1
  40. } else {
  41. xc + N + 0.1
  42. };
  43. for n in 0..10 {
  44. let yt = yc + cs * (n as f64 + 0.5);
  45. drawing.add(gt::line(xc+N, yt).to(xt, yt));
  46. }
  47. } else if get_cell(x, y) == Some('1') {
  48. for n in 1..5 {
  49. drawing.add(gt::line(xc+N, yc + d * n as f64));
  50. }
  51. }
  52. if get_cell(x, y)
  53. .and_then(|l| get_cell(x, y+1)
  54. .map(|r| l != r)).unwrap_or(false) {
  55. drawing.add(gt::line(xc, yc+N).to(xc+N, yc+N));
  56. let yt = if get_cell(x, y) == Some('0') {
  57. yc + N - 0.1
  58. } else {
  59. yc + N + 0.1
  60. };
  61. for n in 0..10 {
  62. let xt = xc + cs * (n as f64 + 0.5);
  63. drawing.add(gt::line(xt, yc+N).to(xt, yt));
  64. }
  65. } else if get_cell(x, y) == Some('1') {
  66. for n in 1..5 {
  67. drawing.add(gt::line(xc + d * n as f64, yc+N));
  68. }
  69. }
  70. }
  71. if let Err(e) = drawing.output("grid") {
  72. eprintln!("{}", e);
  73. }
  74. }