校园导游系统-Java实现

news2024/11/15 8:27:25

一. 题目

设计一个校园导游系统。设计学校的校园平面图,选取若干个具有代表性的景点抽象成一个无向带权图,以图中顶点表示校内各景点,边上的权值表示两景点之间的距离。存放景点代号、名称、简介等信息供用户查询。为来访客人提供图中任意景点相关信息的查询。为来访客人提供图中任意景点之间的问路查询。可以为校园平面图增加或删除景点或边,修改边上的权值。主要功能如下:

(1)景点介绍:系统能输出学校全部景点信息,包括景点编号,景点名称及景点介绍。

(2)线路浏览:采用迪杰斯特拉算法,根据用户输入的其实景点编号,求出从该景点到其他景点之间的最短路径及距离。

(3)查询景点间最短路径:根据用户输入的起始景点及目的景点编号,查询任意两个景点之间的最短路径线路及距离。

(4)景点信息查询:根据用户输入的景点编号输出该景点相关信息。

(5)查询景点间可行路径:任意两个景点之间的路径可能有很多条,求出两景点间所有可行路径中,限制只输出路径长度不超过N个景点的路线。

二、需求分析、功能要求及功能模块图

1.功能要求

(1)景点介绍:系统能输出学校全部景点信息,包括景点编号,景点名称及景点介绍。

(2)线路浏览:采用迪杰斯特拉算法,根据用户输入的其实景点编号,求出从该景点到其他景点之间的最短路径及距离。

(3)查询景点间最短路径:根据用户输入的起始景点及目的景点编号,查询任意两个景点之间的最短路径线路及距离。

(4)景点信息查询:根据用户输入的景点编号输出该景点相关信息。

(5)查询景点间可行路径:任意两个景点之间的路径可能有很多条,求出两景点间所有可行路径中,限制只输出路径长度不超过N个景点的路线。

2.需求分析

  (1)先创建顶点类,包括景点编号,景点名称及景点介绍。

  (2)再创建边类,包括边的终点和边的权重(此题指的是距离)

  (3)创建SystemService类,具体实现3种查询路径功能。

第一种是指定地点到指定地点,

第二种是指定地点到多个地点,

第三种是多个地点到多个地点。

第一种和第二种均可以用迪杰斯特拉算法解决,因为迪杰斯特拉是单源最短路径算法。

第三种可以用弗洛伊德算法解决,因为弗洛伊德是多源最短路径算法。

  (4)创建SystemView类,创建无向图邻接表,对SystemService具体的功能加以调用,同时打印菜单,接收用户输入

  (5)创建CampusTourGuide类,实例化SystemView对象,打印菜单

3.功能模块图

设计思想

1.先分层  -> 有哪些类 , 类与类直接的调用关系

2.明确哪些功能在哪个类

3.确定功能后,分析功能

4.具体实现功能

5.重复3,4步

四.  代码实现

//Vertex类

public class Vertex {
    String id;          //编号
    String name;        //名称
    List<Edge> edges;   //点的邻边
    int dist = Integer.MAX_VALUE;       //距离
    Vertex prev;        //点的前驱
    String detail;      //景点的描述

    public Vertex(String id, String name, String detail) {
        this.id = id;
        this.name = name;
        this.detail = detail;
    }

    @Override
    public String toString() {
        return "景点{" +
                "编号='" + id + '\'' +
                ", 名称='" + name + '\'' +
                ", 介绍='" + detail + '\'' +
                '}';
    }
}

//Edge类
public class Edge {
    Vertex linked;      //边的终点
    int weight;         //边的权重

    public Edge(Vertex linked, int weight) {
        this.linked = linked;
        this.weight = weight;
    }
}

//SystemView 类


public class SystemView {
    SystemService systemService = new SystemService();
    Scanner myScanner = new Scanner(System.in);
    //2个静态属性,存放对应顶点的下标
    static int input01;
    static int input02;




    //1.创建顶点
    Vertex v1 = new Vertex("v1","西门","西侧入口");
    Vertex v2 = new Vertex("v2","操场","锻炼,看比赛");
    Vertex v3 = new Vertex("v3","宿舍","休息");
    Vertex v4 = new Vertex("v4","食堂","吃饭");
    Vertex v5 = new Vertex("v5","东门","东侧入口");
    Vertex v6 = new Vertex("v6","教学楼","教学");
    List<Vertex> graph = List.of(v1, v2, v3, v4, v5, v6);

    //2.顶点添加边
    public void addEdges(){
        v1.edges = List.of(new Edge(v3,9)
                ,new Edge(v2,7)
                ,new Edge(v6,14));
        v2.edges = List.of(new Edge(v4,15)
                ,new Edge(v1,7));
        v3.edges = List.of(new Edge(v4,11)
                ,new Edge(v6,2)
                ,new Edge(v1,9));
        v4.edges = List.of(new Edge(v5,6)
                ,new Edge(v3,11)
                ,new Edge(v2,15));
        v5.edges = List.of(new Edge(v4,6)
                ,new Edge(v6,9));
        v6.edges = List.of(new Edge(v5,9)
                ,new Edge(v1,14)
                ,new Edge(v3,2));
    }


    //3.用户输入,并将输入的字符串编号转为Vertex类型的编号
    public Vertex returnVertex(){
        String v = myScanner.next();
        Vertex vertex = null;
        switch (v){
            case "v1":
                vertex = v1;
                input01 = 0;
                input02 = 0;
                break;
            case "v2":
                vertex = v2;
                input01 = 1;
                input02 = 1;
                break;
            case "v3":
                vertex = v3;
                input01 = 2;
                input02 = 2;
                break;
            case "v4":
                vertex = v4;
                input01 = 3;
                input02 = 3;
                break;
            case "v5":
                vertex = v5;
                input01 = 4;
                input02 = 4;
                break;
            case "v6":
                vertex = v6;
                input01 = 5;
                input02 = 5;
                break;
            default:
                System.out.println("不存在该景点");
        }
        return vertex;
    }




    //5.景点介绍:系统能输出学校全部景点信息,包括景点编号,景点名称及景点介绍。
    public void printDeatil_(){
        System.out.println("景点介绍 ");
        systemService.printDetail(graph);
    }

    //6.线路浏览:采用迪杰斯特拉算法,根据用户输入的其实景点编号,
    // 求出从该景点到其他景点之间的最短路径及距离。
    @Test
    public void OneToOther(){
        System.out.println("请输入起始景点编号");
        //用户输入,并将输入的字符串编号转为Vertex类型的编号
        Vertex vertex = returnVertex();

        systemService.dijkstra(vertex,graph);
        //打印最短路径
        systemService.printPath(graph);   //打印起始点 到所有终点
    }


    //7.查询景点间最短路径:根据用户输入的起始景点及目的景点编号,
    // 查询任意两个景点之间的最短路径线路及距离。
    public void OneToOne(){
        System.out.println("请输入起始景点编号");
        //用户输入,并将输入的字符串编号转为Vertex类型的编号
        Vertex vertex = returnVertex();
        systemService.dijkstra(vertex,graph);

        System.out.println("请输入终点景点编号");
        //用户输入,并将输入的字符串编号转为Vertex类型的编号
        vertex = returnVertex();
        systemService.printPath(vertex);   //打印起始点 到指定的一个终点


    }



    //8.景点信息查询:根据用户输入的景点编号输出该景点相关信息。
    public void seekVertexDetail(){
        System.out.println("请输入查询的景点编号");
        //用户输入,并将输入的字符串编号转为Vertex类型的编号
        Vertex vertex = returnVertex();
        System.out.println(vertex);
    }


    //9.查询景点间可行路径:任意两个景点之间的路径可能有很多条,求出两景点间所有可行路径中,限制只输出路径长度不超过N个景点的路线。
    public void restrictedPath(){

        System.out.println("请输入限制的长度");
        int restrictedLength = myScanner.nextInt();

        //弗洛伊德算法
        systemService.folydWarshall(graph,restrictedLength);

    }

//9.查询景点间可行路径:任意两个景点之间的路径可能有很多条,求出两景点间所有可行路径中,限制只输出路径长度不超过N个景点的路线。
//    public void restrictedPath(){
//        System.out.println("请输入起始景点编号");
//        //用户输入,并将输入的字符串编号转为Vertex类型的编号
//        Vertex start = returnVertex();
//        int i = input01;
//        System.out.println("请输入终点景点编号");
//        //用户输入,并将输入的字符串编号转为Vertex类型的编号
//        Vertex destination = returnVertex();
//        int j = input02;
//        System.out.println("请输入限制的长度");
//        int restrictedLength = myScanner.nextInt();
//
//        //弗洛伊德算法
//        systemService.folydWarshall(graph,start,destination,restrictedLength,i,j);
//
//    }



    //10.打印界面
    public void print(){
        //添加边
        addEdges();

       boolean judge = true;
        while (judge){
            System.out.println("**********       校园导游系统            **********");
            System.out.println("**********       1.景点介绍             **********");
            System.out.println("**********       2.该景点到其他景点路线   **********");
            System.out.println("**********       3.该景点到指定景点路线   **********");
            System.out.println("**********       4.查询景点相关信息      **********");
            //System.out.println("**********       5.查询路指定景点径长度不超过N个景点的路线  **********");
            System.out.println("**********       5.查询所有景点路径长度不超过N个景点的路线  **********");
            System.out.println("**********       6.退出系统             **********");
            System.out.println("请选择");
            int choice = myScanner.nextInt();

            switch (choice){
                case 1:
                    printDeatil_();
                    break;
                case 2:
                    OneToOther();
                    break;
                case 3:
                    OneToOne();
                    break;
                case 4:
                    seekVertexDetail();
                    break;
                case 5:
                    restrictedPath();
                    break;
                case 6:
                    judge = false;
                    System.out.println("退出系统");
                    break;
                default:
                    System.out.println("选择错误,请重新选择");
            }
            System.out.println();
        }
    }

}

//SystemService类



public class SystemService {

    @Test

    //1.景点介绍:系统能输出学校全部景点信息,包括景点编号,景点名称及景点介绍。
    public void printDetail(List<Vertex> graph){
        ArrayList<Vertex> v = new ArrayList<>(graph);
        for (int i = 0; i < v.size(); i++) {
            System.out.println(v.get(i));
        }
    }

    //2.线路浏览:采用迪杰斯特拉算法,根据用户输入的其实景点编号,
    // 求出从该景点到其他景点之间的最短路径及距离。

    public void dijkstra(Vertex v,List<Vertex> graph){
        //1.创建一个存储未访问顶点的集合
        ArrayList<Vertex> list = new ArrayList<>(graph);
        //2.将所有顶点的入度设置为无穷大,其中起点设置为0
        v.dist = 0;
        while (!list.isEmpty()) {
            //3.从集合中选取距离最小的,最为当前顶点
            Vertex curr = chooseMinDistVertex(list);
            //4.访问当前顶点的邻居,若距离小于邻居,则更新
            updataNeighbourDist(list,curr);
            //5.删除当前顶点
            list.remove(curr);
        }
    }

    private void updataNeighbourDist(ArrayList<Vertex> list, Vertex curr) {
        for (Edge edge : curr.edges) {
            Vertex linked = edge.linked;
            if(list.contains(linked)){
                int tempDist = curr.dist + edge.weight;
                if(tempDist < linked.dist){
                    linked.dist = tempDist;
                    linked.prev = curr;
                }
            }
        }
    }




    private Vertex chooseMinDistVertex(ArrayList<Vertex> list) {
        //先假设一个最小顶点
        Vertex min = list.get(0);
        for (int i = 1; i < list.size(); i++) {
            if(list.get(i).dist < min.dist){
                min = list.get(i);
            }
        }
        return min;
    }

    //打印最短路径    打印起始点 到所有终点
    public void printPath(List<Vertex> graph) {
        //1.存储所有顶点
        ArrayList<Vertex> list = new ArrayList<>(graph);
        //2.存储路线顶点
        ArrayList<Vertex> shortRoute = new ArrayList<>();
        Vertex temp;
        for (int i = 0; i < list.size(); i++) {
            //3.将目的地节点,作为当前起点
            temp = list.get(i);
            //4.将目的地节点装入路径图,从目的地开始倒推到起点
            shortRoute.add(temp);
            //5.如果当前节点还有上一个节点
            while (temp.prev != null){
                //将上一节点装入路径图
                shortRoute.add(temp.prev);
                //上一节点变成当前节点,供下一次循环使用
                temp = temp.prev;
            }
            //6.因为我们是反向求路径的,所以将路径图逆序
            Collections.reverse(shortRoute);

            //7.打印最短路径图标题
            System.out.println(shortRoute.get(0).name + " 到 " + shortRoute.get(shortRoute.size()-1).name);
            System.out.println("最短距离为 " + shortRoute.get(shortRoute.size()-1).dist + "米");
            //8.打印最短路径图
            System.out.print("最短路径为 ");
            for (int j = 0; j < shortRoute.size(); j++) {
                System.out.print(shortRoute.get(j).name + " ");
            }
            shortRoute.clear();
            System.out.println();
        }
    }


    //3.查询景点间最短路径:根据用户输入的起始景点及目的景点编号,
    //     查询任意两个景点之间的最短路径线路及距离。

    //打印最短路径    打印起始点 到指定终点
    public void printPath(Vertex vertex) {
        //1.用于存储路径的集合
        ArrayList<Vertex> shortRoute = new ArrayList<>();
        //2.将目的地节点,作为当前起点
        Vertex temp = vertex;
        //3.将目的地节点装入路径图,从目的地开始倒推到起点
        shortRoute.add(temp);
        //4.如果当前节点还有上一个节点
        while (temp.prev != null) {
            //将上一节点装入路径图
            shortRoute.add(temp.prev);
            //上一节点变成当前节点,供下一次循环使用
            temp = temp.prev;
        }
        //5.因为我们是反向求路径的,所以将路径图逆序
        Collections.reverse(shortRoute);
        //6.打印最短路径图标题
        System.out.println(shortRoute.get(0).name + " 到 " + shortRoute.get(shortRoute.size() - 1).name);
        System.out.println("最短距离为 " + shortRoute.get(shortRoute.size() - 1).dist + "米");
        //7.打印最短路径图
        System.out.print("最短路径为 ");
        for (int j = 0; j < shortRoute.size(); j++) {
            System.out.print(shortRoute.get(j).name + " ");
        }
        shortRoute.clear();
        System.out.println();
    }


    //4.查询景点间可行路径:任意两个景点之间的路径可能有很多条,
    // 求出两景点间所有可行路径中,限制只输出路径长度不超过N个景点的路线。

    @Test
    public void folydWarshall(List<Vertex> graph,int restrictedLength) {
        int size = graph.size();
        //1.创建存储距离的二维数组
        int[][] dist = new int[size][size];
        //2.创建存储前趋顶点的二维数组
        Vertex[][] prev  = new Vertex[size][size];

        //3.二维表格的初始化 ->  直接连接的
        for (int i = 0; i < size; i++) {
            Vertex v = graph.get(i);
            Map<Vertex, Integer> map = v.edges.stream().collect
                    (Collectors.toMap(edge -> edge.linked, edge -> edge.weight));
            for (int j = 0; j < size; j++) {
                Vertex u = graph.get(j);
                if(v == u){     //相同的顶点
                    dist[i][j] = 0;
                }else {          //检查外层和内存顶点是否连接
                    dist[i][j] = map.getOrDefault(u, Integer.MAX_VALUE);
                    //前趋顶点初始化
                    //map.get(u)   检查内层顶点u在外层map集合中是否存在,若存在,则外层v就是内存u的前趋
                    prev[i][j] = map.get(u) != null ? v : null;
                }
            }
        }


        //4.间接连接的,通过中间顶点到达其它顶点
        for (int k = 0; k < size; k++) {
            for (int i = 0; i < size; i++) {
                for (int j = 0; j < size; j++) {
                    //若中间人对俩边能连通 , 并且距离比直连的距离小
                    if(dist[i][k] != Integer.MAX_VALUE && dist[k][j] != Integer.MAX_VALUE
                            && dist[i][k] + dist[k][j] < dist[i][j]){
                        //更新距离
                        dist[i][j] = dist[i][k] + dist[k][j];
                        //更新前趋
                        prev[i][j] = prev[k][j];
                    }
                }
            }
        }

        //5.打印二维距离表格
        //printDist(dist,size);

        //6.打印二维前趋表格
        //printPrev(prev,size);

        //7.打印长度小于n的路径
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                restrictedPath(prev,dist,i,j,graph,restrictedLength);
            }
        }

    }



    //7.打印长度小于n的路径          传入的起点和终点只能是int型表示了
    public void restrictedPath(Vertex[][] prev,int[][] dist,int i,int j,List<Vertex> graph,int restrictedLength){

        if(dist[i][j] <= restrictedLength){
            //1.用于存储路径的栈
            LinkedList<Vertex> stack = new LinkedList<>();
            //2.打印路径标题
            System.out.println(graph.get(i).name + " 到 " + graph.get(j).name
                    + "距离为" + dist[i][j]);
            //3.创建临时变量
            Vertex temp01 = graph.get(i);
            Vertex temp02 = graph.get(j);
            //4.将终点入栈
            stack.push(temp02);
            //5.若终点 不等于 起点
            while (i != j){
                Vertex v = prev[i][j];
                //将上一节点装入栈
                stack.push(v);
                //将刚刚入栈的上一节点的下标赋给j
                j = graph.indexOf(v);
            }
            //6.打印路径
            //System.out.println("路径为 " + stack);//打印的是每个顶点,要想打印的是顶点的name,那就遍历stack
            System.out.print("路径为 ");
            while (!stack.isEmpty()){
                Vertex v = stack.pop();
                System.out.print(v.name + " ");
            }
            System.out.println();


        }
    }




    //打印二维距离表格
    public void printDist(int[][] dist,int size){
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                System.out.print(dist[i][j] + "  ");
            }
            System.out.println();
        }
    }

    //打印二维前趋表格
    public void printPrev(Vertex[][] prev,int size){
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                System.out.print(prev[i][j] + "  ");
            }
            System.out.println();
        }
    }
}

//CampusTourGuideAPP类


public class CampusTourGuideAPP {
    public static void main(String[] args) {
        SystemView systemView = new SystemView();
        systemView.print();

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1324852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python多线程中:如何关闭线程?

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 使用 threading.Event 对象关闭子线程 Event 机制工作原理&#xff1a; Event 是线程间通信的一种方式。其作用相当于1个全局flag&#xff0c;主线程通过控制 e…

基于Java版本与鸿鹄企业电子招投标系统的二次开发实践-鸿鹄企业电子招投标系统源代码+支持二开+鸿鹄电子招投标系统

随着市场竞争的加剧和企业规模的扩大&#xff0c;招采管理逐渐成为企业核心竞争力的重要组成部分。为了提高招采工作的效率和质量&#xff0c;我们提出了一种基于电子化平台的解决方案。该方案旨在通过电子化招投标&#xff0c;使得招标采购的质量更高、速度更快&#xff0c;同…

JAVA线上事故:递归导致的OOM

最近因为人员离职&#xff0c;接手一个项目&#xff0c;是xxljob的客户端&#xff0c;部署在k8s上&#xff0c;在排查线上工单时&#xff0c;发现了一个问题&#xff1a; 在管理界面上&#xff0c;我惊讶的发现&#xff0c;三个月的时间&#xff0c;2个Pod&#xff0c;每个都重…

ClickHouse中的CPU调度

本文字数&#xff1a;14267&#xff1b;估计阅读时间&#xff1a;36 分钟 作者&#xff1a;Maksim Kita 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 概述 在这篇文章中&#xff0c;我将描述向量化的工作原理&#xff0c;什么是CP…

ASP.NET MVC权限管理系实战之一验证码功能实现

1&#xff0c;权限的管理系统&#xff1a;开发项目必备的一个的功能&#xff1b;该项目使用 ASP.NET MVC5 SqlServer EF6 IOC容器 BoostStrap 2&#xff0c;登录界面验证码功能实现&#xff0c;整体效果如下&#xff1b; 3&#xff0c;接下来就是代码部分实现&#xff0c;前端…

C#使用HTTP方式对接WebService

C#使用HTTP方式对接WebService C#对接WebService的几种方式 1.直接引用服务 添加服务 添加成功后, 会显示服务详细 调用服务 使用HTTPPost调用WebService option.RequestDataStr GetHttpRequestXml(strXmlBody); // 创建一个 HttpClient 对象 using (HttpClient client …

vba中字典的应用实例

vba中熟练使用字典可以帮我们解决很多问题&#xff0c;以下为字典的应用方法及案例&#xff1a; Sub dictionary() Dim d As New dictionary 定义字典 Dim mykey As Variant Dim myitems d.Add "1100000", "身份证" 字典录入key关键字和item条目 d.Add &q…

数字化技术助力英语习得 iEnglish成智慧化学习新选择

日前,美剧《老友记》中钱德勒的扮演者马修派瑞去世的消息引发不少人的回忆杀。《老友记》官方发文悼念马修派瑞:“对于马修派瑞去世的消息,我们深感悲痛,他是给我们所有人的真正礼物,我们的心和他的家人、爱人、所有的粉丝在一起。” 作为不少国人刷剧学习英语的首选,《老友记…

排序算法——快排

快速排序算法最早是由图灵奖获得者Tony Hoare设计出来的,他在形式化方法理论以 及ALGOL.60编程语言的发明中都有卓越的贡献,是20世纪最伟大的计算机科学家之—。 而这快速排序算法只是他众多贡献中的—个小发明而已。 快速排序&#xff08;Quick Sort&#xff09;的基本算法思…

1_js基本简介数据类型变量的使用

1. 编程语言简介 1.1 计算机编程语言 计算机编程语言是程序设计的最重要的工具&#xff0c;它是指计算机能够接受和处理的、具有一定语法规则的语言。从计算机诞生&#xff0c;计算机语言经历了机器语言、汇编语言和高级语言几个阶段。 高级语言&#xff1a;JavaScript&#x…

vue打包内存问题解决办法<--- Last few GCs ---><--- JS stacktrace --->

**<— Last few GCs —> [18484:0000026763669610] 106760 ms: Mark-sweep 4016.0 <— JS stacktrace —> FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory** 解决办法&#xff1a; set NODE_OPTION…

PaddleOCR Docker 容器快捷调用,快捷调用OCR API

文章目录 搞环境命令行测试Python调用测试转fastapi服务打包成镜像服务快速启动paddleOCR paddleOCR迎来大更新&#xff0c;搞一把新的api接口&#xff0c;直接用起来。 搞环境 搞容器&#xff1a; FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04 ENV DEBIAN_FRONTENDno…

CUDA 学习记录2

1.是否启用一级缓存有什么影响&#xff1a; 启用一级缓存&#xff08;缓存加载操作经过一级缓存&#xff09;&#xff1a;一次内存十五操作以128字节的粒度进行。 不启用一级缓存&#xff08;没有缓存的加载不经过一级缓存&#xff09;&#xff1a;在内存段的粒度上&#xff…

条款6:若不想使用编译器自动生成的函数,就该明确拒绝

有些场景我们不需要编译器默认实现的构造函数&#xff0c;拷贝构造函数&#xff0c;赋值函数&#xff0c;这时候我们应该明确的告诉编译器&#xff0c;我们不需要&#xff0c;一个可行的方法是将拷贝构造函数和赋值函数声明为private。 class HomeForSale { ... }; HomeForSal…

故障排查:shell脚本输出乱码

博客主页&#xff1a;https://tomcat.blog.csdn.net 博主昵称&#xff1a;农民工老王 主要领域&#xff1a;Java、Linux、K8S 期待大家的关注&#x1f496;点赞&#x1f44d;收藏⭐留言&#x1f4ac; 目录 故障详情故障原因解决方法iconv命令介绍 故障详情 最近的工作中遇到一…

Python Opencv实践 - 手势音量控制

本文基于前面的手部跟踪功能做一个手势音量控制功能&#xff0c;代码用到了前面手部跟踪封装的HandDetector.这篇文章在这里&#xff1a; Python Opencv实践 - 手部跟踪-CSDN博客文章浏览阅读626次&#xff0c;点赞11次&#xff0c;收藏7次。使用mediapipe库做手部的实时跟踪&…

Linux静态ip

Linux静态ip Ⅰ、修改静态ip Ⅰ、修改静态ip 修改静态ip必须是root用户 su root //切换root用户 ip a //查看修改前的动态ipvi /etc/sysconfig/network-scripts/ifcfg-ens33 //打开网卡配置文件&#xff0c;修改一处&#xff0c;新增四处 BOOTPROTO&quo…

[Realtek sdk-3.4.14b]RTL8197FH-VG+RTL8812F WiFi使用功率限制功能使用说明

sdk说明 ** Gateway/AP firmware v3.4.14b – Aug 26, 2019**  Wireless LAN driver changes as:  Refine WiFi Stability and Performance  Add 8812F MU-MIMO  Add 97G/8812F multiple mac-clone  Add 97G 2T3R antenna diversity  Fix 97G/8812F/8814B MP issu…

智能优化算法应用:基于人工水母算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工水母算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工水母算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工水母算法4.实验参数设定5.算法结果6.…

MongoDB的原子操作findAndModify和findOneAndUpdate

本文主要介绍MongoDB的原子操作findAndModify和findOneAndUpdate。 目录 MongoDB的原子操作一、findAndModify二、findOneAndUpdate MongoDB的原子操作 MongoDB的原子操作指的是在单个操作中对数据库的数据进行读取和修改&#xff0c;并确保操作是原子的&#xff0c;即要么完全…