/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package oo15loipe; /** * @author Camil Staps, s4498062 // Thijs Heijligenberg, s4451414 */ public class Loipe implements InfoLoipe { private final static int DIRECTION_EAST = 0, DIRECTION_SOUTH = 1, DIRECTION_WEST = 2, DIRECTION_NORTH = 3; private int height = 0, width = 0; private Punt start; private Punt[] path; private int path_pointer = 0; private Fragment[][] loipe; public Loipe (String pad) { // First calculate width and height int direction = DIRECTION_NORTH; int maxX = 0, maxY = 0, minX = 0, minY = 0; Punt current_point = new Punt(0,0); for (int i = 0; i < pad.length(); i++) { if (current_point.getX() < minX) minX = current_point.getX(); if (current_point.getX() > maxX) maxX = current_point.getX(); if (current_point.getY() < minY) minY = current_point.getY(); if (current_point.getY() > maxY) maxY = current_point.getY(); switch (pad.charAt(i)) { case 'r': switch (direction) { case DIRECTION_EAST: direction = DIRECTION_SOUTH; break; case DIRECTION_SOUTH: direction = DIRECTION_WEST; break; case DIRECTION_WEST: direction = DIRECTION_NORTH; break; case DIRECTION_NORTH: direction = DIRECTION_EAST; break; } break; case 'l': switch (direction) { case DIRECTION_EAST: direction = DIRECTION_NORTH; break; case DIRECTION_SOUTH: direction = DIRECTION_EAST; break; case DIRECTION_WEST: direction = DIRECTION_SOUTH; break; case DIRECTION_NORTH: direction = DIRECTION_WEST; break; } } switch (direction) { case DIRECTION_EAST: current_point = new Punt(current_point.getX() + 1, current_point.getY()); break; case DIRECTION_SOUTH: current_point = new Punt(current_point.getX(), current_point.getY() + 1); break; case DIRECTION_WEST: current_point = new Punt(current_point.getX() - 1, current_point.getY()); break; case DIRECTION_NORTH: current_point = new Punt(current_point.getX(), current_point.getY() - 1); break; } System.out.println(pad.charAt(i) + ":" + direction); } System.out.println(); System.out.println(maxX); System.out.println(minX); System.out.println(maxY); System.out.println(minY); height = maxY - minY; width = maxX - minX; start = new Punt(-minX, -minY); // Now fill the Loipe loipe = new Fragment[width][height]; path = new Punt[pad.length()]; current_point = new Punt(-minX, -minY); direction = DIRECTION_NORTH; for (int i = 0; i < pad.length(); i++) { path[i] = current_point; if (loipe[current_point.getX()][current_point.getY()] == null) { loipe[current_point.getX()][current_point.getY()] = Fragment.KR; } else { switch (pad.charAt(i)) { case 'r': switch (direction) { case DIRECTION_EAST: loipe[current_point.getX()][current_point.getY()] = Fragment.ZW; break; case DIRECTION_SOUTH: loipe[current_point.getX()][current_point.getY()] = Fragment.NW; break; case DIRECTION_WEST: loipe[current_point.getX()][current_point.getY()] = Fragment.NO; break; case DIRECTION_NORTH: loipe[current_point.getX()][current_point.getY()] = Fragment.ZO; break; } break; case 'l': switch (direction) { case DIRECTION_EAST: loipe[current_point.getX()][current_point.getY()] = Fragment.NW; break; case DIRECTION_SOUTH: loipe[current_point.getX()][current_point.getY()] = Fragment.NO; break; case DIRECTION_WEST: loipe[current_point.getX()][current_point.getY()] = Fragment.ZO; break; case DIRECTION_NORTH: loipe[current_point.getX()][current_point.getY()] = Fragment.ZW; break; } } } switch (pad.charAt(i)) { case 'r': switch (direction) { case DIRECTION_EAST: direction = DIRECTION_SOUTH; break; case DIRECTION_SOUTH: direction = DIRECTION_WEST; break; case DIRECTION_WEST: direction = DIRECTION_NORTH; break; case DIRECTION_NORTH: direction = DIRECTION_EAST; break; } break; case 'l': switch (direction) { case DIRECTION_EAST: direction = DIRECTION_NORTH; break; case DIRECTION_SOUTH: direction = DIRECTION_EAST; break; case DIRECTION_WEST: direction = DIRECTION_SOUTH; break; case DIRECTION_NORTH: direction = DIRECTION_WEST; break; } } switch (direction) { case DIRECTION_EAST: current_point = new Punt(current_point.getX() + 1, current_point.getY()); break; case DIRECTION_SOUTH: current_point = new Punt(current_point.getX(), current_point.getY() + 1); break; case DIRECTION_WEST: current_point = new Punt(current_point.getX() - 1, current_point.getY()); break; case DIRECTION_NORTH: current_point = new Punt(current_point.getX(), current_point.getY() - 1); break; } } } @Override public int getHeight() { return height; } @Override public int getWidth() { return width; } @Override public String toString() { StringBuilder sb = new StringBuilder(); for (Punt p : path) { sb.append(p).append(" -> "); } return sb.toString(); } @Override public Fragment getFragment(int x, int y) { return loipe[x][y]; } @Override public Punt start() { return start; } @Override public Punt stap() { return path[path_pointer++]; } }