package com.revolsys.geometry.algorithm.linematch;
import java.util.ArrayList;
import java.util.List;
import com.revolsys.geometry.model.BoundingBox;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.geometry.model.LineString;
import com.revolsys.geometry.model.Point;
import com.revolsys.geometry.model.segment.LineSegment;
import com.revolsys.geometry.model.segment.LineSegmentDoubleGF;
public class LineSegmentMatch {
private final LineSegment segment;
private final List<LineSegment> segments = new ArrayList<>();
public LineSegmentMatch(final GeometryFactory geometryFactory, final Point start,
final Point end) {
this(new LineSegmentDoubleGF(geometryFactory, start, end));
}
public LineSegmentMatch(final LineSegment segment) {
this.segment = segment;
}
public void addSegment(final LineSegment segment, final int index) {
while (index >= this.segments.size()) {
this.segments.add(null);
}
this.segments.set(index, segment);
}
public BoundingBox getEnvelope() {
return this.segment.getBoundingBox();
}
public LineString getLine() {
return this.segment;
}
public int getMatchCount(final int index) {
if (this.segments.get(index) == null) {
return 0;
}
int matchCount = 0;
for (final LineSegment segment : this.segments) {
if (segment != null) {
matchCount++;
}
}
return matchCount;
}
/**
* @return the segment
*/
public LineSegment getSegment() {
return this.segment;
}
/**
* @param index
* @return the segment
*/
public LineSegment getSegment(final int index) {
return this.segments.get(index);
}
/**
* @return the segments
*/
public int getSegmentCount() {
return this.segments.size();
}
/**
* @return the segments
*/
public List<LineSegment> getSegments() {
return this.segments;
}
public boolean hasMatches(final int index) {
if (index < this.segments.size()) {
final LineSegment segment = this.segments.get(index);
if (segment == null) {
return false;
}
for (int i = 0; i < this.segments.size(); i++) {
if (i != index) {
final LineSegment otherSegment = this.segments.get(i);
if (otherSegment != null) {
return true;
}
}
}
}
return false;
}
public boolean hasMatches(final int index1, final int index2) {
if (index1 < this.segments.size() && index2 < this.segments.size()) {
final LineSegment segment1 = this.segments.get(index1);
final LineSegment segment2 = this.segments.get(index2);
return segment1 != null && segment2 != null;
} else {
return false;
}
}
public boolean hasOtherSegment(final int index) {
for (int i = 0; i < this.segments.size(); i++) {
if (i != index) {
if (this.segments.get(i) != null) {
return true;
}
}
}
return false;
}
public boolean hasSegment(final int index) {
if (index < this.segments.size()) {
return this.segments.get(index) != null;
} else {
return false;
}
}
public boolean isMatchedWithBase(final int index) {
if (this.segments.get(index) == null) {
return false;
} else if (this.segments.get(0) == null) {
return false;
} else {
return true;
}
}
public void removeSegment(final int i) {
this.segments.set(i, null);
}
@Override
public String toString() {
return this.segment.toString();
}
}