package oripa.paint.creasepattern.tool;
import java.util.ArrayList;
import java.util.Collection;
import oripa.value.OriLine;
public class TiledLineFactory {
/**
* create lines that fill out the paper.
* @param lines
* @param creasePattern
* @param paperSize
* @return
*/
public Collection<OriLine> createFullyTiledLines(
Collection<OriLine> lines,
Collection<OriLine> creasePattern, double paperSize) {
RectangleDomain domain = new RectangleDomain(lines);
int startRow = (int) (-paperSize / domain.getHeight());
int startCol = (int) (-paperSize / domain.getWidth());
int endRow = (int) (paperSize / domain.getHeight() + 0.5);
int endCol = (int) (paperSize / domain.getWidth() + 0.5);
return createTiledLinesImpl(
startRow, startCol, endRow, endCol,
domain.getWidth(), domain.getHeight(), creasePattern, paperSize);
}
/**
* create lines that fill out given area.
* @param row
* @param col
* @param interX
* @param interY
* @param creasePattern
* @param paperSize
* @return
*/
public Collection<OriLine> createTiledLines(
int row, int col, double interX, double interY,
Collection<OriLine> creasePattern, double paperSize) {
int startRow = 0;
int startCol = 0;
int endRow = row;
int endCol = col;
return createTiledLinesImpl(
startRow, startCol, endRow, endCol,
interX, interY, creasePattern, paperSize);
}
private Collection<OriLine> createTiledLinesImpl(
int startRow, int startCol, int endRow, int endCol,
double interX, double interY,
Collection<OriLine> creasePattern, double paperSize) {
System.out.println("startRow=" + startRow + " startCol=" + startCol + " endRow=" + endRow + " endCol=" + endCol);
ArrayList<OriLine> copiedLines = new ArrayList<OriLine>();
//FIXME Restrictedly speaking, paper is not always in this position. CreasePattern should have the values??
oripa.geom.RectangleClipper clipper =
new oripa.geom.RectangleClipper(
-paperSize / 2, -paperSize / 2, paperSize / 2, paperSize / 2);
for (int x = startCol; x < endCol; x++) {
for (int y = startRow; y < endRow; y++) {
if (x == 0 && y == 0) {
continue;
}
// copies the selected lines
for (OriLine l : creasePattern) {
if (!l.selected) {
continue;
}
OriLine cl = new OriLine(l);
cl.p0.x += interX * x;
cl.p0.y += interY * y;
cl.p1.x += interX * x;
cl.p1.y += interY * y;
if (clipper.clip(cl)) {
copiedLines.add(cl);
}
}
}
}
return copiedLines;
// LineAdder adder = new LineAdder();
// for (OriLine l : copiedLines) {
// adder.addLine(l, creasePattern);
// }
// Painter painter = new Painter();
// painter.resetSelectedOriLines(creasePattern);
}
}