package oripa.paint.creasepattern.tool;
import java.util.ArrayList;
import java.util.Collection;
import oripa.geom.GeomUtil;
import oripa.geom.Line;
import oripa.value.OriLine;
import oripa.value.OriPoint;
public class LineMirror {
/**
*
*
* @param baseLine a line to be the axis of symmetry
* @param lines lines to be mirrored
* @param creasePattern destination of mirrored lines
*/
public Collection<OriLine> createMirroredLines(
OriLine baseLine, Collection<OriLine> lines) {
ArrayList<OriLine> copiedLines = new ArrayList<OriLine>(lines.size());
for (OriLine line : lines) {
if (!line.selected) {
continue;
}
if (line.equals(baseLine)) {
continue;
}
copiedLines.add(createMirroredLine(line, baseLine));
}
return copiedLines;
}
/**
* create a mirrored line.
* @param line a line to be mirrored
* @param baseOriLine a line to be axis of symmetry
* @return mirrored line
*/
private OriLine createMirroredLine(
OriLine line, OriLine baseOriLine) {
OriPoint q0 = createMirroredVertex(line.p0, baseOriLine);
OriPoint q1 = createMirroredVertex(line.p1, baseOriLine);
OriLine mirroredLine = new OriLine(q0, q1, line.typeVal);
return mirroredLine;
}
/**
* create a mirrored vertex.
* @param vertex p vertex to be mirrored
* @param baseOriLine a line to be axis of symmetry
* @return
*/
private OriPoint createMirroredVertex(
OriPoint vertex, OriLine baseOriLine) {
Line baseLine = baseOriLine.getLine();
double dist0 = GeomUtil.Distance(vertex, baseLine);
OriPoint dir0 = new OriPoint();
if (GeomUtil.isRightSide(vertex, baseLine)) {
dir0.set(-baseLine.dir.y, baseLine.dir.x);
} else {
dir0.set(baseLine.dir.y, -baseLine.dir.x);
}
dir0.normalize();
OriPoint q0 = new OriPoint(
vertex.x + dir0.x * dist0 * 2,
vertex.y + dir0.y * dist0 * 2);
return q0;
}
}