Revision 53

View differences:

org.gvsig.lrs/trunk/org.gvsig.lrs/org.gvsig.lrs.lib/org.gvsig.lrs.lib.impl/src/main/java/org/gvsig/lrs/lib/impl/LrsCalibrateRouteAlgorithm.java
453 453
                                    isFixedPoint.set(index, true);
454 454
                                    vertices.set(index, vertex);
455 455
                                }else{
456
                                    if (nextVertex!=null && !LrsAlgorithmUtils.equalPoints(nextVertex, fixedPoint)){
456
                                    if (nextVertex!=null
457
                                        && !LrsAlgorithmUtils.equalPoints(nextVertex, fixedPoint)
458
                                        && vertex.distance(fixedPoint)>PRECISION){
459

  
457 460
                                        GeometryManager geomanager = GeometryLocator.getGeometryManager();
458 461
                                        Line segment= (Line) geomanager
459 462
                                            .create(Geometry.TYPES.LINE, Geometry.SUBTYPES.GEOM2DM);
......
645 648
            if (nextFixedPointPos!=null){
646 649
                return nextFixedPointPos;
647 650
            }else{
648
                Integer lineVisited=lineIndexes.get(pos);
649
                for (int i=pos+1;i<vertices.size();i++){
650
                    if (!lineVisited.equals(lineIndexes.get(i))){//Line has changed
651
                        int lastPositionInLine=i-1;
652
                        nextFixedPointPos=findNextFixedPointInNextLines(lastPositionInLine,new ArrayList<Integer>());
653
                        if (nextFixedPointPos!=null){
654
                            return nextFixedPointPos;
655
                        }
656
                        try{
657
                            return findNearestNextFixedPoint(lastPositionInLine);
658
                        }catch (Exception e){
659
                            return null;
660
                        }
661
                    }
651
                int lastPositionInLine=getLastPositionInLine(pos);
652
                nextFixedPointPos=findNextFixedPointInNextLines(lastPositionInLine,new ArrayList<Integer>());
653
                if (nextFixedPointPos!=null){
654
                    return nextFixedPointPos;
662 655
                }
656
                try{
657
                    Integer nearestVertex=findNearestNextPoint(lastPositionInLine);
658
                    return getNextPosFixedPoint(nearestVertex);
659
                }catch (Exception e){
660
                    return null;
661
                }
663 662
            }
664
            return null;
665 663
        }
666 664

  
665
        private Integer getLastPositionInLine (int pos){
666
            Integer lineVisited=lineIndexes.get(pos);
667
            for (int i=pos+1;i<vertices.size();i++){
668
                if (!lineVisited.equals(lineIndexes.get(i))){
669
                    return i-1;
670
                }
671
            }
672
            return vertices.size()-1;
673
        }
674

  
667 675
        private Integer findNextFixedPointInNextLines(int pos,List<Integer> visitedLines){
668 676
            Integer nextFixedPointPos= findNextFixedPointInLine(pos);
669 677
            if (nextFixedPointPos!=null){
670 678
                return nextFixedPointPos;
671 679
            }else{
672
                Point vertex=vertices.get(pos);
673
                for (int j=pos;j<vertices.size();j++){
674
                    if (LrsAlgorithmUtils.equalPoints(vertex, vertices.get(j))){
675
                        Integer fixedPointPos=findNextFixedPointInLine(j);
676
                        if (fixedPointPos!=null){
677
                            return fixedPointPos;
680
                Integer lineIndex=lineIndexes.get(pos);
681
                visitedLines.add(lineIndex);
682
                int lastPositionInLine=getLastPositionInLine(pos);
683
                Point lastVertexInLine=vertices.get(lastPositionInLine);
684
                for (int i=pos+1;i<vertices.size();i++){
685
                    if (LrsAlgorithmUtils.equalPoints(lastVertexInLine, vertices.get(i))){
686
                        if (!visitedLines.contains(lineIndexes.get(i))){
687
                            findNextFixedPointInNextLines(i,visitedLines);
678 688
                        }
679 689
                    }
680 690
                }
......
694 704
            }
695 705
            return null;
696 706
        }
697
        private Integer findNearestNextFixedPoint(int vertexPos) throws GeometryOperationNotSupportedException, GeometryOperationException{
707

  
708

  
709
        private Integer findNearestNextPoint(int vertexPos) throws GeometryOperationNotSupportedException, GeometryOperationException{
698 710
            Point vertex=vertices.get(vertexPos);
699 711
            double nearestDistance = Double.POSITIVE_INFINITY;
700 712
            Integer nearestPointPos=null;
701 713
            for (int i=vertexPos+1;i<vertices.size();i++){
702
                if (isFixedPoint.get(i)){
703
                    Double distance=vertex.distance(vertices.get(i));
704
                    if(nearestDistance>distance){
705
                        nearestDistance=distance;
706
                        nearestPointPos=i;
707
                    }
714
                Double distance=vertex.distance(vertices.get(i));
715
                if(nearestDistance>distance && distance>Double.valueOf(0)){
716
                    nearestDistance=distance;
717
                    nearestPointPos=i;
708 718
                }
709 719
            }
710 720
            return nearestPointPos;

Also available in: Unified diff