Package trafficjams.model.registers

Examples of trafficjams.model.registers.RoadMap


        return instance;
    }

    public RoadMap makeRoadMap(int crossCount, int autoCount, int tryCount) throws Exception {
        System.out.println("Try to get road map: "+(crossCount-tryCount+1));
        RoadMap retVal = new RoadMap();
        float gorLength = Numbers.mapWidth / (float)crossCount /*- 2*/ ;
        float vertLength = Numbers.mapHeight / (float) crossCount /*- 2*/ ;
        ICrossRoad[][] a_crossRoads= new ICrossRoad[crossCount][crossCount];
        ArrayList<ICrossRoad> l_crossRoads = new ArrayList<ICrossRoad>(crossCount*crossCount);
        ArrayList<IRoad> roads = new ArrayList<IRoad>();
        Road r = null;

        //создаем перекрестки и дороги ввиде сетки, уже смещенной
        for (int i = 0 ; i<crossCount; ++i){
            if (i==0){
                for (int j = 0 ; j < crossCount; ++j){
                    CrossRoad currCross = new CrossRoad(retVal);
                    l_crossRoads.add(currCross);
                    currCross.setCoord(new Point(gorLength*i + gorLength*rand(), vertLength*j + vertLength * rand()));
                    a_crossRoads[i][j] = currCross;
                    if (j==0){
                        continue;
                    }
                    r = new Road(retVal);
                    roads.add(r);
                    r.setFCross(a_crossRoads[i][j-1]);
                    r.setLCross(currCross);

                    ((CrossRoad)a_crossRoads[i][j-1]).setRoadForDirection(r, right);
                    currCross.setRoadForDirection(r, left);

                }
                continue;
            }

            for (int j = 0 ; j < crossCount; ++j){
                CrossRoad currCross = new CrossRoad(retVal);
                l_crossRoads.add(currCross);
                currCross.setCoord(new Point(gorLength*i + gorLength*rand(), vertLength*j + vertLength * rand()));
                a_crossRoads[i][j] = currCross;
                r = new Road(retVal);
                roads.add(r);
                r.setFCross(a_crossRoads[i-1][j]);
                r.setLCross(currCross);
                ((CrossRoad)a_crossRoads[i-1][j]).setRoadForDirection(r, down);
                currCross.setRoadForDirection(r, up);
                if (j==0){
                    continue;
                }
                r = new Road(retVal);
                roads.add(r);
                r.setFCross(a_crossRoads[i][j-1]);
                r.setLCross(currCross);

                ((CrossRoad)a_crossRoads[i][j-1]).setRoadForDirection(r, right);
                currCross.setRoadForDirection(r, left);

            }
        }

        //убиваем координаты выходящие за границы(выставляем в границы)
        this.removeNegatives(l_crossRoads);

        //выбираем дороги для уничтожения
        ArrayList<IRoad> toDelete = new ArrayList<IRoad>();
        for (IRoad __r : roads){
            if (Math.random()<Numbers.percent){
                toDelete.add(__r);
            }
        }

        //удаляем дороги
        for (IRoad __r : toDelete){
            if (!roads.remove(__r))
                throw new Exception("дорога не удалилась!");
            Road _r = (Road) __r;
            ((CrossRoad)_r.getFCross()).deleteRoad(_r);
            ((CrossRoad)_r.getLCross()).deleteRoad(_r);
        }

        //удаляем перекрестки в которые входят 0 или 2 дороги (и соединяем дорогий то что разъединилось)
        for (int i = 0 ; i<crossCount ; ++i){
            for (int j = 0 ; j<crossCount; ++j){
                CrossRoad cr = (CrossRoad) a_crossRoads[i][j];
                if (cr.getType()  == 0){
                    if (!l_crossRoads.remove(a_crossRoads[i][j]))
                        throw new Exception("перекресток не удалился!");
                    a_crossRoads[i][j] = null;
                }
                if (cr.getType()  == 2){
                    if (!l_crossRoads.remove(a_crossRoads[i][j]))
                        throw new Exception("перекресток не удалился!");
                    a_crossRoads[i][j] = null;
                    IRoad[] rd = cr.get2Roads();
                    CrossRoad c0 = (CrossRoad)((Road)rd[0]).getOtherEnd(cr);
                    CrossRoad c1 = (CrossRoad)((Road)rd[1]).getOtherEnd(cr);

                    if (!(roads.remove(rd[0]) && roads.remove(rd[1])))
                        throw new Exception("road remove error");

                    IRoad newRoad = this.createConnector(c0,c1);
                    roads.add(newRoad);
                    ((CrossRoad) c0).setRoadForDirection(newRoad, c0.deleteRoad(rd[0]));
                    ((CrossRoad) c1).setRoadForDirection(newRoad, c1.deleteRoad(rd[1]));
                }
            }
        }

        //проверяем на связность
        if (!this.isCorrect(l_crossRoads, roads, tryCount)){
            return this.makeRoadMap(crossCount,autoCount,--tryCount);
        }

        //проверяем перекрестки и инициализируем очереди
        for (ICrossRoad iCrossRoad: l_crossRoads){
            CrossRoad crossRoad = (CrossRoad) iCrossRoad;
            if (crossRoad.getType()==2){
                return this.makeRoadMap(crossCount, autoCount, --tryCount);
            }
            crossRoad.initQueues();
        }

        ///выставляем длины дорог
        float maxLength = 0;
        float minLength = Math.max(Numbers.mapHeight, Numbers.mapWidth);
        for (IRoad __r : roads){
            Road _r = (Road)__r;
            float l = 0;
            float x1 = _r.getFCross().getCoord().getX();
            float x2 = _r.getLCross().getCoord().getX();
            float y1 = _r.getFCross().getCoord().getY();
            float y2 = _r.getLCross().getCoord().getY();
            l = (float) Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
            _r.setLength(l);
            if (l>maxLength){
                maxLength = l;
            }
            if (l<minLength){
                minLength = l ;
            }
        }
        retVal.setMaxSpeed(maxLength / Numbers.HOUR_IN_SECONDS ) ;
        retVal.setMinDist(minLength  / Numbers.AUTO_SHORROAD_COUNT);
        retVal.setCrossBuffer(retVal.getMinDist() * Numbers.CROSS_BUFFER_PERCENT);
        //и макс скорость и мин дистанцию

        retVal.setL_crossRoads(l_crossRoads);
        retVal.setA_crossRoads(a_crossRoads);
        retVal.setRoads((ArrayList<IRoad>)roads);
        return retVal;
    }   //makeRoadMap
View Full Code Here


        this.fileChoozer.show();
    }

    public void previewPressed() {
        try{
            RoadMap map = null;
            RoadMapFactory fact = RoadMapFactory.getInstance();
            map = fact.makeRoadMap(Integer.parseInt(crossCount.getText())  , Integer.parseInt(crossCount.getText()) , Integer.parseInt(crossCount.getText()));
            TrafficRegister.getInstance().setRoadMap(map);

View Full Code Here

        g.drawLine(0,0,(int) Numbers.mapWidth,0);
        g.drawLine((int) Numbers.mapWidth,(int)Numbers.mapHeight,0, (int)Numbers.mapHeight);
        g.drawLine((int) Numbers.mapWidth,(int)Numbers.mapHeight,  (int) Numbers.mapWidth,0);

        if (this.repaintAllowed){
            RoadMap map = TrafficRegister.getInstance().getRoadMap();
            if (map == null)
                return;

            g.setColor(Color.yellow);
            for (ICrossRoad cr : map.getL_CrossRoads() ) {
                Point p = cr.getCoord().toAwtPoint();
                g.fillRect(p.x-5,p.y-5, 10, 10);
            }

            g.setColor(Color.blue);
            for (IRoad r : map.getRoads()){
                Point p1 = r.getFCross().getCoord().toAwtPoint();
                Point p2 = r.getLCross().getCoord().toAwtPoint();
                g.drawLine(p1.x, p1.y, p2.x , p2.y);
            }
View Full Code Here

TOP

Related Classes of trafficjams.model.registers.RoadMap

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.