Revision: 6644
http://sourceforge.net/p/jump-pilot/code/6644
Author: michaudm
Date: 2020-11-25 11:30:14 +0000 (Wed, 25 Nov 2020)
Log Message:
-----------
Remodeler : fixes on z interpolation
Modified Paths:
--------------
core/trunk/src/org/openjump/core/ui/plugin/edittoolbox/cursortools/RemodelerTool.java
Modified:
core/trunk/src/org/openjump/core/ui/plugin/edittoolbox/cursortools/RemodelerTool.java
===================================================================
---
core/trunk/src/org/openjump/core/ui/plugin/edittoolbox/cursortools/RemodelerTool.java
2020-11-25 10:32:59 UTC (rev 6643)
+++
core/trunk/src/org/openjump/core/ui/plugin/edittoolbox/cursortools/RemodelerTool.java
2020-11-25 11:30:14 UTC (rev 6644)
@@ -170,6 +170,7 @@
newPath = clipNewPath(selection, newPath);
// Compute the location of the insertion points in selection
+ // (i.e. location of the first and last points of the clipped newPath)
LocationIndexedLine selectionIndexedLine = new
LocationIndexedLine(selection);
LinearLocation loc1 =
selectionIndexedLine.indexOf(newPath.getStartPoint().getCoordinate());
LinearLocation loc2 =
selectionIndexedLine.indexOf(newPath.getEndPoint().getCoordinate());
@@ -229,6 +230,7 @@
newPath = clipNewPath(selection, newPath);
// Compute the location of the insertion points in selection
+ // (i.e. location of the first and last points of the clipped newPath)
LocationIndexedLine selectionIndexedLine = new
LocationIndexedLine(selection);
LinearLocation loc1 =
selectionIndexedLine.indexOf(newPath.getStartPoint().getCoordinate());
LinearLocation loc2 =
selectionIndexedLine.indexOf(newPath.getEndPoint().getCoordinate());
@@ -254,7 +256,8 @@
return selection.getFactory().createLineString(list.toCoordinateArray());
}
-
+ // Extract the useful part of the newPath, from the first to the last
+ // intersection with the selection
private LineString clipNewPath(LineString selection, LineString newPath) {
Coordinate c1 = firstIntersectionAlongNewPath(selection, newPath);
Coordinate c2 = firstIntersectionAlongNewPath(selection,
(LineString)newPath.reverse());
@@ -265,7 +268,7 @@
}
- // Walk along newPath from the start point and findthe first intersection
with selection
+ // Walk along newPath from the start point and find the first intersection
with selection
private Coordinate firstIntersectionAlongNewPath(LineString selection,
LineString newPath) {
for (int i = 0 ; i < newPath.getNumPoints()-1 ; i++) {
LineSegment newPathSegment = new LineSegment(newPath.getCoordinateN(i),
newPath.getCoordinateN(i+1));
@@ -298,6 +301,7 @@
return new GeometryFactory().createLineString(toArray(getCoordinates()));
}
+ // Used to interpolate the two insertion points on the original LineString
private double interpolateZ(LinearLocation loc, LineString lineString) {
if (loc.getSegmentFraction()==0.0) {
return lineString.getPointN(loc.getSegmentIndex()).getCoordinate().z;
@@ -304,9 +308,9 @@
} else {
double previousZ =
lineString.getPointN(loc.getSegmentIndex()).getCoordinate().z;
double nextZ =
lineString.getPointN(loc.getSegmentIndex()+1).getCoordinate().z;
- if (Double.isNaN(previousZ) && Double.isNaN(nextZ)) return Double.NaN;
- else if (Double.isNaN(previousZ)) return nextZ;
- else if (Double.isNaN(nextZ)) return previousZ;
+ if (Double.isNaN(previousZ) || Double.isNaN(nextZ)) return Double.NaN;
+ //else if (Double.isNaN(previousZ)) return nextZ;
+ //else if (Double.isNaN(nextZ)) return previousZ;
else {
return previousZ + (nextZ-previousZ)*loc.getSegmentFraction();
}
@@ -313,6 +317,8 @@
}
}
+ // Used to interpolate z between indice start and indice end where start and
end
+ // have valid values
private void interpolateZbetweenIndices(LineString lineString, int start,
int end) {
double zi = lineString.getCoordinateN(start).z;
double zj = lineString.getCoordinateN(end).z;
@@ -324,11 +330,13 @@
double dz = zj-zi;
double partialLength = 0;
for (int i = start+1 ; i < end ; i++) {
- partialLength +=
lineString.getPointN(i).distance(lineString.getPointN(i+1));
+ partialLength +=
lineString.getPointN(i-1).distance(lineString.getPointN(i));
lineString.getPointN(i).getCoordinate().z = zi + dz *
(partialLength/totalLength);
}
}
+ // Identify non null z along the lineString, and between two points
+ // with valid z, interpolate a z
private void interpolateZ(LineString lineString) {
int start = -1;
for (int i = 0 ; i < lineString.getNumPoints() ; i++) {
_______________________________________________
Jump-pilot-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel