Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

108
LINES

< > BotCompany Repo | #1034075 // OnePath - 2d path where each step moves only one pixel (horizontal, vertical or diagonal, or no movement)

JavaX fragment (include) [tags: use-pretranspiled]

Libraryless. Click here for Pure Java version (8798L/49K).

1  
sclass OnePath {
2  
  new ByteBuffer steps;
3  
  
4  
  *() {}
5  
  *(S path) {
6  
    int n = l(path);
7  
    steps.allocate(n);
8  
    for i to n:
9  
      steps.add(parseDigit(path, i));
10  
  }
11  
  
12  
  *(OnePath path) {
13  
    steps = new ByteBuffer(path.steps);
14  
  }
15  
16  
  // uses first point as origin, so there will be l(points)-1 steps.
17  
  // Unless you set close to true, then it adds the first point at the end again.
18  
  
19  
  *(Iterable<Pt> points, bool close) {
20  
    fromPoints(points, close);
21  
  }
22  
  
23  
  void fromPoints(Iterable<Pt> points, bool close) {
24  
    var it = iterator(points);
25  
    if (empty(it)) ret;
26  
    Pt firstPoint = it.next(), p = firstPoint;
27  
    while (it.hasNext()) {
28  
      Pt p2 = it.next();
29  
      steps.add(ptToDigit(ptMinus(p2, p)));
30  
      p = p2;
31  
    }
32  
    
33  
    if (close)
34  
      steps.add(ptToDigit(ptMinus(firstPoint, p)));
35  
  }
36  
  
37  
  int size aka length aka nSteps() { ret steps.size(); }
38  
  
39  
  toString { ret pathString(); }
40  
  
41  
  S pathString() {
42  
    ret singleDigitBytesToString(steps);
43  
  }
44  
  
45  
  // includes first point, so returns length()+1 points in total
46  
  ItIt<Pt> pointIterator(Pt startPt default origin()) {
47  
    ret new ItIt<Pt> {
48  
      int i = 0, n = length();
49  
      Pt p = startPt;
50  
      
51  
      public bool hasNext() { ret i <= n; }
52  
      
53  
      public Pt next() {
54  
        var p = this.p;
55  
        if (i < n) this.p = translatePt(this.p, getStepAsPt(i));
56  
        ++i;
57  
        ret p;
58  
      }
59  
    };
60  
  }
61  
  
62  
  L<Pt> pointList aka pointsList() { ret ptBuffer(pointIterator()); }
63  
  
64  
  int getStep(int i) { ret steps.get(i); }
65  
  
66  
  Pt getStepAsPt(int i) {
67  
    ret onePathDirections()[steps.get(i)];
68  
  }
69  
  
70  
  static int ptToDigit(Pt p) {
71  
    ret p.y < 0 ? p.x < 0 ? 1 : p.x == 0 ? 2 : 3
72  
      : p.y == 0 ? p.x < 0 ? 8 : p.x == 0 ? 0 : 4
73  
      : p.x < 0 ? 7 : p.x == 0 ? 6 : 5;
74  
  }
75  
  
76  
  Pt origin() { ret main origin(); }
77  
  Pt endPoint() { ret last(pointIterator()); }
78  
  
79  
  Pt drift() {
80  
    ret ptMinus(endPoint(), origin());
81  
  }
82  
  
83  
  void addStep(Pt etc p) {
84  
    int step = onePathLookupDirection(p);
85  
    if (step < 0) fail("Invalid one path step: " + p);
86  
    addStep(step);
87  
  }
88  
  
89  
  void addStep(int step) {
90  
    assertBetween(0, 8, step);
91  
    steps.add(step);
92  
  }
93  
  
94  
  void insertStep(int idx, Pt etc p) {
95  
    int step = onePathLookupDirection(p);
96  
    if (step < 0) fail("Invalid one path step: " + p);
97  
    insertStep(idx, step);
98  
  }
99  
  
100  
  void insertStep(int idx, int step) {
101  
    assertBetween(0, 8, step);
102  
    steps.add(idx, step);
103  
  }
104  
  
105  
  Rect bounds() {
106  
    ret boundsOfPts(pointIterator());
107  
  }
108  
}

download  show line numbers  debug dex  old transpilations   

Travelled to 4 computer(s): bhatertpkbcr, ekrmjmnbrukm, mowyntqkapby, mqqgnosmbjvj

No comments. add comment

Snippet ID: #1034075
Snippet name: OnePath - 2d path where each step moves only one pixel (horizontal, vertical or diagonal, or no movement)
Eternal ID of this version: #1034075/37
Text MD5: 19eb1574de3c0617ea68c1158629dfff
Transpilation MD5: d2b173ee14ba936f53f6d633ea6ca12a
Author: stefan
Category: javax
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2022-05-06 20:11:37
Source code size: 2597 bytes / 108 lines
Pitched / IR pitched: No / No
Views / Downloads: 290 / 639
Version history: 36 change(s)
Referenced in: [show references]