001: /*
002: * ====================================================================
003: * Copyright (c) 2004 Marc Strapetz, marc.strapetz@smartsvn.com.
004: * All rights reserved.
005: *
006: * This software is licensed as described in the file COPYING, which
007: * you should have received as part of this distribution. Use is
008: * subject to license terms.
009: * ====================================================================
010: */
011:
012: package de.regnis.q.sequence.core;
013:
014: /**
015: * @author Marc Strapetz
016: */
017: abstract class QSequenceDeePathExtender {
018:
019: // Abstract ===============================================================
020:
021: protected abstract int getNextX(QSequenceDeePathExtenderArray xs,
022: int diagonal, int dee);
023:
024: protected abstract int getSnakeX(QSequenceMedia media, int x, int y)
025: throws QSequenceException;
026:
027: protected abstract void reset(QSequenceMedia media,
028: QSequenceDeePathExtenderArray xs);
029:
030: public abstract int getProgress(int diagonal);
031:
032: // Fields =================================================================
033:
034: private final QSequenceDeePathExtenderArray xs;
035:
036: private int snakeStartLeft;
037: private int snakeStartRight;
038: private int startX;
039: private int startY;
040: private int endX;
041: private int endY;
042:
043: // Setup ==================================================================
044:
045: protected QSequenceDeePathExtender(QSequenceDeePathExtenderArray xs) {
046: this .xs = xs;
047: }
048:
049: // Accessing ==============================================================
050:
051: public final int getLeft(int diagonal) {
052: return xs.get(diagonal);
053: }
054:
055: public final int getRight(int diagonal) {
056: return xs.get(diagonal) - diagonal;
057: }
058:
059: public final int getStartX() {
060: return startX;
061: }
062:
063: public final int getStartY() {
064: return startY;
065: }
066:
067: public final int getSnakeStartLeft() {
068: return snakeStartLeft;
069: }
070:
071: public final int getSnakeStartRight() {
072: return snakeStartRight;
073: }
074:
075: public final void extendDeePath(QSequenceMedia media, int dee,
076: int diagonal) throws QSequenceException {
077: startX = endX;
078: startY = endY;
079: int x = getNextX(xs, diagonal, dee);
080: int y = x - diagonal;
081:
082: snakeStartLeft = x;
083: snakeStartRight = y;
084:
085: x = getSnakeX(media, x, y);
086: y = x - diagonal;
087: xs.set(diagonal, x);
088:
089: endX = x;
090: endY = y;
091: }
092:
093: public final void reset(QSequenceMedia media) {
094: startX = -1;
095: startY = -1;
096: endX = -1;
097: endY = -1;
098: reset(media, xs);
099: }
100:
101: public final void print(QSequenceMedia media, int fromDiagonal,
102: int toDiagonal) {
103: final StringBuffer[] lines = new StringBuffer[media
104: .getRightLength() + 1];
105: for (int line = 0; line < lines.length; line++) {
106: lines[line] = new StringBuffer(media.getLeftLength() + 1);
107:
108: lines[line].append('.');
109: for (int ch = 0; ch < media.getLeftLength(); ch++) {
110: lines[line].append(line >= 1
111: && line <= media.getRightLength() ? '*' : '.');
112: }
113: }
114:
115: for (int diagonal = fromDiagonal; diagonal <= toDiagonal; diagonal++) {
116: final int left = getLeft(diagonal);
117: final int right = getRight(diagonal);
118: if (left < 0 || right < 0 || right >= lines.length
119: || left >= lines[right].length()) {
120: continue;
121: }
122:
123: lines[right].setCharAt(left, String.valueOf(
124: Math.abs(diagonal % 9)).charAt(0));
125: }
126: }
127: }
|