Ignore:
Timestamp:
2011-07-13T10:40:46+02:00 (13 years ago)
Author:
benshu
Message:
  • added methods to Path which fix arguments which are less than 0 or greater than length (#josm6578)
Location:
applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/gui
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/gui/LaneGui.java

    r26182 r26316  
    22
    33import static java.lang.Math.max;
     4import static java.lang.Math.min;
    45import static org.openstreetmap.josm.plugins.turnlanes.gui.GuiUtil.area;
    56
     
    8889            final double newLength = getModel().getOutgoingRoadEnd().isFromEnd() ? offset : getRoad().getLength()
    8990                    - offset;
    90            
    91             length = newLength;
    92             if (updateModel && newLength > 0) {
    93                 getModel().setLength(newLength * getRoad().getContainer().getMpp());
     91            final double adjustedLength = min(max(newLength, 0.1), getRoad().getLength());
     92           
     93            length = adjustedLength;
     94            if (updateModel) {
     95                getModel().setLength(adjustedLength * getRoad().getContainer().getMpp());
    9496            }
    9597           
     
    326328           
    327329            outer = inner.offset(W, SL, SL + AL, 0);
    328             area(area, inner.subpath(0, L), outer.subpath(0, L + WW));
    329            
    330             lengthSlider.move(inner.getPoint(L));
     330            area(area, inner.subpath(0, L, true), outer.subpath(0, L + WW, true));
     331           
     332            lengthSlider.move(inner.getPoint(L, true));
    331333           
    332334            if (L > leftLength) {
    333                 innerLine.append(inner.subpath(max(0, leftLength + WW), L).getIterator(), leftLength >= 0
     335                innerLine.append(inner.subpath(leftLength + WW, L, true).getIterator(), leftLength >= 0
    334336                        || getModel().getOutgoingRoadEnd().isFromEnd());
    335                 final Point2D op = outer.getPoint(L + WW);
     337                final Point2D op = outer.getPoint(L + WW, true);
    336338                innerLine.lineTo(op.getX(), op.getY());
    337339            }
    338340        } else if (getModel().getKind() == Lane.Kind.EXTRA_RIGHT) {
    339341            outer = inner.offset(W, L, L + WW, 0);
    340             area(area, inner.subpath(0, L + WW), outer.subpath(0, L));
    341            
    342             lengthSlider.move(outer.getPoint(L));
     342            area(area, inner.subpath(0, L + WW, true), outer.subpath(0, L, true));
     343           
     344            lengthSlider.move(outer.getPoint(L, true));
    343345        } else {
    344346            outer = inner.offset(W, -1, -1, W);
     
    346348           
    347349            if (leftLength < L) {
    348                 innerLine.append(inner.subpath(max(0, leftLength + WW), L).getIterator(), leftLength >= 0
     350                innerLine.append(inner.subpath(leftLength + WW, L, true).getIterator(), leftLength >= 0
    349351                        || getModel().getOutgoingRoadEnd().isFromEnd());
    350352            }
  • applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/gui/Path.java

    r26154 r26316  
    209209        @Override
    210210        public SimplePathIterator getIterator() {
    211             return new SimplePathIterator(previous.getIteratorInternal(angle), PathIterator.SEG_LINETO, endX, endY, 0, 0, 0,
    212                 0);
     211            return new SimplePathIterator(previous.getIteratorInternal(angle), PathIterator.SEG_LINETO, endX, endY, 0,
     212                    0, 0, 0);
    213213        }
    214214       
     
    217217            final double PL = previous.getLength();
    218218            final double ML = PL + length;
     219           
     220            if (from > ML) {
     221                throw new IllegalArgumentException("from > length");
     222            } else if (to > ML) {
     223                throw new IllegalArgumentException("to > length");
     224            }
    219225           
    220226            if (to < PL) {
     
    229235                return new Line(new Start(start.getX(), start.getY(), angle), end.getX(), end.getY(), EL - from);
    230236            } else {
    231                 return new Line(previous.subpath(from, to), end.getX(), end.getY(), EL - PL);
     237                return new Line(previous.subpath(from, PL), end.getX(), end.getY(), EL - PL);
    232238            }
    233239        }
     
    237243            final double PL = previous.getLength();
    238244            final double ML = PL + length;
     245           
     246            if (offset > ML) {
     247                throw new IllegalArgumentException("offset > length");
     248            }
    239249           
    240250            if (offset <= ML && offset >= PL) {
     
    376386                final double w2 = we - (m2 - ML) * (we - ws) / (m2 - m1);
    377387               
    378                 return new Curve(prev, fromRadius - s * w1, toRadius - s * w2, offsetAngle(prev, angle), length, fromAngle);
     388                return new Curve(prev, fromRadius - s * w1, toRadius - s * w2, offsetAngle(prev, angle), length,
     389                        fromAngle);
    379390            }
    380391        }
     
    408419            final double ML = PL + length;
    409420           
     421            if (from > ML) {
     422                throw new IllegalArgumentException("from > length");
     423            } else if (to > ML) {
     424                throw new IllegalArgumentException("to > length");
     425            }
     426           
    410427            if (to < PL) {
    411428                return previous.subpath(from, to);
     
    427444                return new Curve(new Start(start.getX(), start.getY(), fa), fromR, toR, a, l, fa);
    428445            } else {
    429                 return new Curve(previous.subpath(from, to), fromR, toR, a, l, fromAngle);
     446                return new Curve(previous.subpath(from, PL), fromR, toR, a, l, fromAngle);
    430447            }
    431448        }
     
    457474           
    458475            return new SimplePathIterator(previous.getIteratorInternal(getEndAngle()), PathIterator.SEG_CUBICTO, //
    459                 cp1.getX(), cp1.getY(), cp2.getX(), cp2.getY(), endX, endY //
     476                    cp1.getX(), cp1.getY(), cp2.getX(), cp2.getY(), endX, endY //
    460477            );
    461478           
     
    574591    public abstract Path subpath(double from, double to);
    575592   
     593    public Path subpath(double from, double to, boolean fixArgs) {
     594        if (fixArgs) {
     595            from = min(max(from, 0), getLength());
     596            to = min(max(to, 0), getLength());
     597        }
     598       
     599        return subpath(from, to);
     600    }
     601   
    576602    public abstract Point2D getPoint(double offset);
     603   
     604    public Point2D getPoint(double offset, boolean fixArgs) {
     605        if (fixArgs) {
     606            offset = min(max(offset, 0), getLength());
     607        }
     608       
     609        return getPoint(offset);
     610    }
    577611}
Note: See TracChangeset for help on using the changeset viewer.