<JAVA图像学习笔记>十字路口交通模拟--操作系统模拟课后小项目

项目的要求很简单:

  模拟出十字路口的交通控制情况;

  考虑东、西、南、北四个方向,每条路分为两个车道,每个路口设置一盏显示灯。为简单起见, 每种灯显示时间为8秒。

  当东西(或南北)方向红灯时,所有车辆(除了消防车、救护车、警车)均排队等待,当东西(或南北)方向绿灯时,所有车辆按序行驶(不准超车)。

制作这个小框体程序我选择的平台是JAVA,实现结果效果图如下所示:

  首先分析整个项目题目上的要求,在十字路口上通过的车辆可以抽象为两类:普通车辆和特殊车辆(包括警车,消防车,救护车等),所谓普通的车辆和特殊种类的车辆之间的差别是是否需要在红绿灯路口之前进行等待操作,特殊车辆享有优先权并且可以直接通过路口,而普通的车辆必须严格遵守交通规则。

由于整个题目的环境假定为交通十字路口,那么有如下几个隐式的条件要求:

(1)不失一般性的,任意车辆在前方有车辆在等待的情况下必须也进行等待操作。

(2)车辆与车辆之间无论是正面还是侧面之间都不允许发生碰撞且最好保持一个“安全距离”,换句话讲,一个严格的要求是车辆之间不允许发生重叠。

(3)红绿灯按照一个既定的规律进行变换,控制普通车辆的行进与停止

(4)车辆的次序或者方向要实现随机分配,即整个路口可以处理各种车辆位置的情况

在这个项目之中我们不妨假设车辆的行进路径只有单方向,即不会出现车辆转弯的状况,这样一来就大大简化了整个项目的难度。所以因为所有车辆都是直行,所以在整个十字路口的范围内我们需要一定数量的信号来处理路口内部车辆行进的分配问题,其次是红绿灯的分配也需要一个信号量来处理车辆和红绿灯变换之间的关系。

如右图所示,MyMutex.center是表示整个十字路口正中央的信号辆所代表的位置,东西南北是个方向分别在这个信号量表示中为上下左右四个方向,每个方向有4条道路,其中的道路两两并行,每组方向相反。举个具体的例子就是(车辆靠右侧通行)北(上)边最右侧的车道驶来的车辆与西(左)边最左侧的车道驶来的车辆可能会在图中的MyMutex.center[0][0]处相遇,在相遇的同时只有一辆车辆允许通行,若已经有车辆通过该交汇处,那么已经进入并且占有信号量的车

辆优先通过,反之亦然。

在上述的条件的约束之下,我们决定使用可视化界面来实现整个十字路口车辆分配的问题。

不妨把车辆抽象成为矩形,利用java.awt库下的类做出两个模拟的车辆的模样,分别代表特殊车辆和普通车辆。(特殊车辆一律用警车图案来概括)

那么车辆行驶的过程就是车辆图案的平移过程,经过草图设计我们暂定车辆LOGO的大小为30*50(道路的宽度为50)也就是说会在车辆的两侧个留出10pixel的矩形作为所谓安全距离,整个车辆的平移的过程经过测试评估最终确定为每0.2s移动10像素,会留下较好的动画效果和观察准度。

接下来是实现整个界面底层的环节:

(1)所有车辆模型的实质是java.awt库内的矩形和线条,车辆模型的移动的实质就是线条和矩形的移动过程,但是在移动的过程之中,首先需要图案进行旋转处理以使之对应东西走向上的车辆,为了避免反复重复计算出每个线条的位置,我们做出8个容器来存储每个方向上每个车道上的车辆初始线条位置,从次之后的每次绘制只需要在容器中取出每个线条再对之进行比较简单的平移操作即可。

(2)我们整个界面的动画是通过不断调用JComponent类的repaint()方法来实现的,所以我们首先需要重写paint()方法,从P/V操作的角度考虑,对于每一条路径上的车辆可能会处理的情况如下所示:

(3)整个界面的宏观角度来看,整个程序的流程过程图如下所示:

(4)根据上述设计,个人感觉java中的synchronized关键字不太适合这个项目,因为直接使用synchronized很有使得两个同时相碰的车辆发生死锁现象,所以我的解决方法是根据java代码执行的特点,将八个线程的运行run() 函数内容直接依次排序,实质上是相当于给八个线程设定了默认的优先级这样一来就解决了死锁的现象。

代码分享: ## 由于作业Deadline还没有到我就先发布一些关键的绘制部分的代码块,等到Deadline一过就把源码全部展示出来 ##

(1)paint()函数重载后的写法

    public void paint(Graphics g){
        super.paint(g);
        Graphics2D g2=(Graphics2D)g;
        /////Traffic Lights
        g2.setPaint(Color.black);
        g2.fill(signalpane);
        g2.setPaint(Color.red.darker());
        g2.fill(redsignal);
        g2.setPaint(Color.green.darker());
        g2.fill(greensignal);

        /////PaintRoad
        g2.setPaint(Color.gray.brighter());
        Rectangle2D roadh=new Rectangle2D.Float(250,0,200,700);
        Rectangle2D roadv=new Rectangle2D.Float(0,250,700,200);
        g2.fill(roadh);
        g2.fill(roadv);

        /////

        /////Graphics Defination
        g2.setPaint(Color.black);
        g.drawLine(250, 0, 250, 700);
        g.drawLine(350, 0, 350, 700);
        g.drawLine(450, 0, 450, 700);
        g.drawLine(0, 250, 700, 250);
        g.drawLine(0, 350, 700, 350);
        g.drawLine(0,450,700, 450);
        g2.setPaint(Color.gray.darker());
        g.drawLine(300,0,300,700);
        g.drawLine(400,0,400,700);
        g.drawLine(0,300,700,300);
        g.drawLine(0,400,700,400);
        Rectangle2D centerroad=new Rectangle2D.Float(250,250,200,200);
        ///////////////////////Road Drawing
        ///////////////////////Color can be attached
        g2.setPaint(Color.gray.brighter());
        g2.fill(centerroad);
        g2.setPaint(Color.black);
        g2.draw(centerroad);
        ////////////////////////Specail Car Outline painting
        ////////////////////////Located from 500,20 size 30,50
        ///////////////////////Combined by llright,rlight,specialCarOut,specialCarIn,specialCarLightLeft,specialCarLightRight
        g2.fill(specialCarOut);
        g2.setPaint(Color.gray);
        g2.draw(specialCarLightLeft);
        g2.draw(specialCarLightRight);
        g2.draw(specialCarOut);
        g2.setPaint(Color.white);
        g2.fill(specialCarIn);
        g2.setPaint(Color.red);
        g2.fill(specialCarLightLeft);
        g2.setPaint(Color.blue);
        g2.fill(specialCarLightRight);
        g2.setPaint(Color.yellow);
        g2.fill(sllight);
        g2.fill(srlight);
        //////////////////////////////////////Normal Car Outline Painting
        //////////////////////////////////////Located from 550,20 size 30,50

        g2.setPaint(Color.gray);
        g2.draw(normalCarIn);
        g2.draw(normalCarOut);
        g2.setPaint(Color.red);
        g2.fill(normalCarOut);
        g2.setPaint(Color.magenta);
        g2.fill(normalCarIn);
        g2.setPaint(Color.yellow);
        g2.fill(nllight);
        g2.fill(nrlight);
        //////////////////
        /////////////////Painting Finished
        /////////////////For switch to change
        if(bLight==true){
            g2.setPaint(Color.green.brighter());
            g2.fill(greensignal);
            g2.setPaint(Color.black);
            g2.fill(redsignal);
        }else{
            g2.setPaint(Color.black);
            g2.fill(greensignal);
            g2.setPaint(Color.red.brighter());
            g2.fill(redsignal);
        }

        ////Testing Field

        ////nn
        Iterator iter=northCars.iterator();
        while(iter.hasNext()){
            Car c=(Car)iter.next();
            paintCar(g2,c);
        }
        ////sn
        iter=snorthCars.iterator();
        while(iter.hasNext()){
            Car c=(Car)iter.next();
            paintCar(g2,c);
        }
        ////ns
        iter=southCars.iterator();
        while(iter.hasNext()){
            Car c=(Car)iter.next();
            paintCar(g2,c);
        }
        ////ss
        iter=ssouthCars.iterator();
        while(iter.hasNext()){
            Car c=(Car)iter.next();
            paintCar(g2,c);
        }
        ///ne
        iter=eastCars.iterator();
        while(iter.hasNext()){
            Car c=(Car)iter.next();
            paintCar(g2,c);
        }
        ////se
        iter=seastCars.iterator();
        while(iter.hasNext()){
            Car c=(Car)iter.next();
            paintCar(g2,c);
        }
        /////nw
        iter=westCars.iterator();
        while(iter.hasNext()){
            Car c=(Car)iter.next();
            paintCar(g2,c);
        }
        ////sw
        iter=swestCars.iterator();
        while(iter.hasNext()){
            Car c=(Car)iter.next();
            paintCar(g2,c);
        }
        ///////////////////Testtttting!!!!!!

        ///////////////////
    }

(2)线条/图案容器

public static Vector<Car> northCars=new Vector<>();
    public static Vector<Car> southCars=new Vector<>();
    public static Vector<Car> eastCars=new Vector<>();
    public static Vector<Car> westCars=new Vector<>();
    public static Vector<Car> snorthCars=new Vector<>();
    public static Vector<Car> ssouthCars=new Vector<>();
    public static Vector<Car> seastCars=new Vector<>();
    public static Vector<Car> swestCars=new Vector<>();
    public static boolean bLight=true;

(3)车辆坐标容器

    protected static Vector<Shape> northshape=new Vector<>();
    protected static Vector<Shape> southshape=new Vector<>();
    protected static Vector<Shape> eastshape=new Vector<>();
    protected static Vector<Shape> westshape=new Vector<>();
    protected static Vector<Shape> snorthshape=new Vector<>();
    protected static Vector<Shape> ssouthshape=new Vector<>();
    protected static Vector<Shape> seastshape=new Vector<>();
    protected static Vector<Shape> swestshape=new Vector<>();

(4)actionPerformed接口方法实现

    public void actionPerformed(ActionEvent e){
        Object source=e.getSource();
        if(source==timer){
            Iterator it;
            ////nn
            it=northCars.iterator();
            while(it.hasNext()){
                Car car=(Car)it.next();
                if(car.y==700)it.remove();
                if(car.y==250){
                    if(bLight==true)continue;///Stop
                //}else if(car.y==250){
                    if(MyMutex.center[0][0]==0)MyMutex.center[0][0]--;else continue;///Stop
                }else if(car.y==340){
                    MyMutex.center[0][0]++;
                }else if(car.y==300){
                    if(MyMutex.center[1][0]==0)MyMutex.center[1][0]--;else continue;///Stop
                }else if(car.y==390){
                    MyMutex.center[1][0]++;
                }else if(car.y==350){
                    if(MyMutex.center[2][0]==0)MyMutex.center[2][0]--;else continue;
                }else if(car.y==440){
                    MyMutex.center[2][0]++;
                }else if(car.y==400){
                    if(MyMutex.center[3][0]==0)MyMutex.center[3][0]--;else continue;
                }else if(car.y==490){
                    MyMutex.center[3][0]++;
                }
                car.y+=10;
            }
            ///////ns
            it=snorthCars.iterator();
            while(it.hasNext()){
                Car car=(Car)it.next();
                if(car.y==700)it.remove();
                if(car.y==250){
                    //if(bLight==true)continue;///Stop
                //}else if(car.y==250){
                    if(MyMutex.center[0][1]==0)MyMutex.center[0][1]--;else continue;///Stop
                }else if(car.y==340){
                    MyMutex.center[0][1]++;
                }else if(car.y==300){
                    if(MyMutex.center[1][1]==0)MyMutex.center[1][1]--;else continue;///Stop
                }else if(car.y==390){
                    MyMutex.center[1][1]++;
                }else if(car.y==350){
                    if(MyMutex.center[2][1]==0)MyMutex.center[2][1]--;else continue;
                }else if(car.y==440){
                    MyMutex.center[2][1]++;
                }else if(car.y==400){
                    if(MyMutex.center[3][1]==0)MyMutex.center[3][1]--;else continue;
                }else if(car.y==490){
                    MyMutex.center[3][1]++;
                }
                car.y+=10;
            }
            /////sn
            it=southCars.iterator();
            while(it.hasNext()){
                Car car=(Car)it.next();
                if(car.y==0)it.remove();
                if(car.y==450){
                    if(bLight==true)continue;///Stop
                //}else if(car.y==450){
                    if(MyMutex.center[3][3]==0)MyMutex.center[3][3]--;else continue;///Stop
                }else if(car.y==360){
                    MyMutex.center[3][3]++;
                }else if(car.y==400){
                    if(MyMutex.center[2][3]==0)MyMutex.center[2][3]--;else continue;///Stop
                }else if(car.y==310){
                    MyMutex.center[2][3]++;
                }else if(car.y==350){
                    if(MyMutex.center[1][3]==0)MyMutex.center[1][3]--;else continue;
                }else if(car.y==260){
                    MyMutex.center[1][3]++;
                }else if(car.y==300){
                    if(MyMutex.center[0][3]==0)MyMutex.center[0][3]--;else continue;
                }else if(car.y==210){
                    MyMutex.center[0][3]++;
                }
                car.y-=10;
            }
            ////ss
            it=ssouthCars.iterator();
            while(it.hasNext()){
                Car car=(Car)it.next();
                if(car.y==0)it.remove();
                if(car.y==450){
                    //if(bLight==true)continue;///Stop
                //}else if(car.y==450){
                    if(MyMutex.center[3][2]==0)MyMutex.center[3][2]--;else continue;///Stop
                }else if(car.y==360){
                    MyMutex.center[3][2]++;
                }else if(car.y==400){
                    if(MyMutex.center[2][2]==0)MyMutex.center[2][2]--;else continue;///Stop
                }else if(car.y==310){
                    MyMutex.center[2][2]++;
                }else if(car.y==350){
                    if(MyMutex.center[1][2]==0)MyMutex.center[1][2]--;else continue;
                }else if(car.y==260){
                    MyMutex.center[1][2]++;
                }else if(car.y==300){
                    if(MyMutex.center[0][2]==0)MyMutex.center[0][2]--;else continue;
                }else if(car.y==210){
                    MyMutex.center[0][2]++;
                }
                car.y-=10;
            }
            ///ne
            it=eastCars.iterator();
            while(it.hasNext()){
                Car car=(Car)it.next();
                if(car.x==0)it.remove();
                if(car.x==450){
                    if(bLight==false)continue;///Stop
                //}else if(car.x==450){
                    if(MyMutex.center[0][3]==0)MyMutex.center[0][3]--;else continue;///Stop
                }else if(car.x==360){
                    MyMutex.center[0][3]++;
                }else if(car.x==400){
                    if(MyMutex.center[0][2]==0)MyMutex.center[0][2]--;else continue;///Stop
                }else if(car.x==310){
                    MyMutex.center[0][2]++;
                }else if(car.x==350){
                    if(MyMutex.center[0][1]==0)MyMutex.center[0][1]--;else continue;
                }else if(car.x==260){
                    MyMutex.center[0][1]++;
                }else if(car.x==300){
                    if(MyMutex.center[0][0]==0)MyMutex.center[0][0]--;else continue;
                }else if(car.x==210){
                    MyMutex.center[0][0]++;
                }
                car.x-=10;
            }
            //se
            it=seastCars.iterator();
            while(it.hasNext()){
                Car car=(Car)it.next();
                if(car.x==0)it.remove();
                if(car.x==450){
                    //if(bLight==false)continue;///Stop
                //}else if(car.x==450){
                    if(MyMutex.center[1][3]==0)MyMutex.center[1][3]--;else continue;///Stop
                }else if(car.x==360){
                    MyMutex.center[1][3]++;
                }else if(car.x==400){
                    if(MyMutex.center[1][2]==0)MyMutex.center[1][2]--;else continue;///Stop
                }else if(car.x==310){
                    MyMutex.center[1][2]++;
                }else if(car.x==350){
                    if(MyMutex.center[1][1]==0)MyMutex.center[1][1]--;else continue;
                }else if(car.x==260){
                    MyMutex.center[1][1]++;
                }else if(car.x==300){
                    if(MyMutex.center[1][0]==0)MyMutex.center[1][0]--;else continue;
                }else if(car.x==210){
                    MyMutex.center[1][0]++;
                }
                car.x-=10;
            }
            //nw
            it=westCars.iterator();
            while(it.hasNext()){
                Car car=(Car)it.next();
                if(car.x==700)it.remove();
                if(car.x==250){
                    if(bLight==false)continue;///Stop
                //}else if(car.x==250){
                    if(MyMutex.center[3][0]==0)MyMutex.center[3][0]--;else continue;///Stop
                }else if(car.x==340){
                    MyMutex.center[3][0]++;
                }else if(car.x==300){
                    if(MyMutex.center[3][1]==0)MyMutex.center[3][1]--;else continue;///Stop
                }else if(car.x==390){
                    MyMutex.center[3][1]++;
                }else if(car.x==350){
                    if(MyMutex.center[3][2]==0)MyMutex.center[3][2]--;else continue;
                }else if(car.x==440){
                    MyMutex.center[3][2]++;
                }else if(car.x==400){
                    if(MyMutex.center[3][3]==0)MyMutex.center[3][3]--;else continue;
                }else if(car.x==490){
                    MyMutex.center[3][3]++;
                }
                car.x+=10;
            }
            ///sw
            it=swestCars.iterator();
            while(it.hasNext()){
                Car car=(Car)it.next();
                if(car.x==700)it.remove();
                if(car.x==250){
                    //if(bLight==false)continue;///Stop
                //}else if(car.x==250){
                    if(MyMutex.center[2][0]==0)MyMutex.center[2][0]--;else continue;///Stop
                }else if(car.x==340){
                    MyMutex.center[2][0]++;
                }else if(car.x==300){
                    if(MyMutex.center[2][1]==0)MyMutex.center[2][1]--;else continue;///Stop
                }else if(car.x==390){
                    MyMutex.center[2][1]++;
                }else if(car.x==350){
                    if(MyMutex.center[2][2]==0)MyMutex.center[2][2]--;else continue;
                }else if(car.x==440){
                    MyMutex.center[2][2]++;
                }else if(car.x==400){
                    if(MyMutex.center[2][3]==0)MyMutex.center[2][3]--;else continue;
                }else if(car.x==490){
                    MyMutex.center[2][3]++;
                }
                car.x+=10;
            }
            adjust();
            repaint();
        }else if(source==timerLight){
            bLight=!bLight;
            if(bLight)hint.setText("Now Right-Left Road is Accessible!");
            else hint.setText("Now Up-Down Road is Accessible!");
        }else if(source==testTimer){
            //northCars.add(new Car(0,0,260,50));
            //snorthCars.add(new Car(0,1,310,50));
            //southCars.add(new Car(1,0,440,650));
            //ssouthCars.add(new Car(1,1,410,650));
            //eastCars.add(new Car(2,0,650,260));
            //seastCars.add(new Car(2,1,650,310));
            //westCars.add(new Car(3,0,50,440));
            //swestCars.add(new Car(3,1,50,410));
        }else if(source==westn){
            westCars.add(new Car(3,0,50,440));
        }else if(source==wests){
            swestCars.add(new Car(3,1,50,410));
        }else if(source==eastn){
            eastCars.add(new Car(2,0,650,260));
        }else if(source==easts){
            seastCars.add(new Car(2,1,650,310));
        }else if(source==northn){
            northCars.add(new Car(0,0,260,50));
        }else if(source==norths){
            snorthCars.add(new Car(0,1,310,50));
        }else if(source==southn){
            southCars.add(new Car(1,0,440,650));
        }else if(source==souths){
            ssouthCars.add(new Car(1,1,410,650));
        }

        /////Swtich Table For Source Handling

    }

Tips:如果有任何问题欢迎联系我或者留下评论

时间: 2024-11-05 16:04:34

<JAVA图像学习笔记>十字路口交通模拟--操作系统模拟课后小项目的相关文章

Android(java)学习笔记167:Java中操作文件的类介绍

1.File类:对硬盘上的文件和目录进行操作的类.    File类是文件和目录路径名抽象表现形式  构造函数:        1) File(String pathname)       Creates a new File instance by converting the given pathname string into an abstract pathname. 2)File(File parent, String child)       Creates a new File i

[原创]java WEB学习笔记6:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

opencv学习笔记(01)——操作图像的像素

1 #include <opencv2\core\core.hpp> 2 #include <opencv2\highgui\highgui.hpp> 3 #include <opencv2\imgproc\imgproc.hpp> 4 #include <iostream> 5 6 7 void salt(cv::Mat& image, int n) 8 { 9 10 for(int k=0; k<n; k++) 11 { 12 13 int

sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map)

sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map) 这几天学习和查看了jQuery和Property这两个很流行的前端库的御用选择器组件Sizzle.js的源代码,收获还是相对多的!之前一直做使用Java语言开发,其丰富的组件类库使得开发效率那叫一个快呀!突然转来做JavaScript一时间还有点儿不适应(快半年了),不过自从看见那么多漂亮的网站和对JavaScript接触的越来越多,也发现了其中的一些乐趣.正如自己一直坚信的那样,编程语言仅仅是工具,重要的是编程思想!使用Jav

Android(java)学习笔记233: 远程服务的应用场景(移动支付案例)

一. 移动支付:       用户需要在移动终端提交账号.密码以及金额等数据 到 远端服务器.然后远端服务器匹配这些信息,进行逻辑判断,进而完成交易,返回交易成功或失败的信息给移动终端.用户提交账号.密码以及金额等数据都是比较敏感的数据,这些数据不能让外界获取.       阿里等等支付宝平台把支付的逻辑封装起来,只给我们提供一个方法去调用,这样提高了安全性.当我们用户提交账号.密码以及金额等数据,点击"支付"的时候,支付宝平台已经调用方法加密数据(这个支付逻辑是远程服务,为了安全,防

java排序学习笔记

前面写了js的排序实现,总得玩玩java的哈. 同样,冒泡.选择.快速(这三个之前实现过也写过文章).堆排序,然后做比较. 主要遇到的难点: - -||想轻松点写个封装计时的逻辑,不想每调用一个排序就要写一个计时代码.想想,还是javascript写起来方便: java的话,我想到的方法是写一个抽象类:抽象出排序方法,实现一个排序计时方法(该方法调用了抽象排序,但在先后排序时加入计时代码[感觉像是aop操作]): 接着所有排序类都继承这个抽象类,并实现排序方法,调用的时候直接调用继承的排序计时方

java JDK8 学习笔记——第16章 整合数据库

第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程序. 2.JDBC标准主要分为两个部分:JDBC应用程序开发者接口和JDBC驱动程序开发者接口.应用程序需要联机数据库,其相关API主要在java.sql和javax.sql两个包中. 3.应用程序使用JDBC联机数据库的通用语法: Connection conn = DriverManager.g

Java并发学习笔记(九)-原子类AtomicInteger

AtomicInteger能够保证对一个整型的操作是原子性.像i++这个操作不是原子操作,存在竞态条件,所以需要加锁,但是加锁的性能不高,如果仅仅为了对一个整数加1.我们来看下他的实现. private volatile int value; AtomicInteger本身持有一个整型变量,所有的操作都是基于这个变量的.变量由violate修饰,这个变量是保证可见性的,具体可见另一篇博客 Java并发学习笔记(六)-互斥性和内存可见性. 来看一下对value加1的操作 public final

[原创]java WEB学习笔记95:Hibernate 目录

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------