逻辑测试题

https://blog.csdn.net/qq_39081315/article/details/121393597

先生成一个点,每生成一个点判断距离,角度,满足加入存点的容器,直到容器大小为4。
随机生成点:
分区域:最大距离20,以20为正方形划分区域为20*20网格,产生点时,先随机挑选一个网格,每次挑选的网格不能是同一个,后续挑选的网格,不能同一列,同一行,且网格之间间隔至少一个网格(不用判断距离)。挑选出网格后在再网格中随机挑选一个点,但还需要判断角度,通过这样缩小随机范围,避免多次尝试。

效果

在这里插入图片描述

代码(直接随机版,无网格)

package org.example.Other;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
 * @Description: TODO
 * @Author: sats@jz
 * @Date: 2025/1/13 14:04
 **/
public class TrajectoryDrawingApp extends JFrame {
    private final int WIDTH = 400;
    private final int HEIGHT = 400;
    /*
     *距离
    */
    private final int MIN_DISTANCE = 30;
    /*
     * 角度
    */
    private final int MAX_JD = 20;
    /*
     * 产生点的信息
    */
    private List<Point> fixedPoints;
    /*
     * 用户轨迹
    */
    private List<Point> userTrajectory;

    public TrajectoryDrawingApp() {
        setTitle("轨迹绘制,按照点绘制");
        setSize(WIDTH, HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);

        fixedPoints = generatePoints(4);
        userTrajectory = new ArrayList<>();

        DrawingPanel panel = new DrawingPanel();
        add(panel);

        setVisible(true);
    }

    private List<Point> generatePoints(int numPoints) {
        List<Point> points = new ArrayList<>();


        while (points.size() < numPoints) {
            Point newPoint = Point(points);
            if (isValidPoint(newPoint, points)) {
                points.add(newPoint);
            }
        }
        System.out.println("产生点的信息: " + points);
        return points;
    }
    /* 根据已经产生的点
     * 缩小随机数范围, 待续
    */
    private Point Point(List<Point> pointList){
        Random random = new Random();
        return new Point(random.nextInt(WIDTH), random.nextInt(HEIGHT));
    }



    private boolean isValidPoint(Point point, List<Point> points) {
        // 距离
        for (Point p : points) {
            if (point.distance(p) < MIN_DISTANCE) {
                return false;
            }
        }
        // 角度
        if (points.size() >= 2) {
            Point p1 = points.get(points.size() - 2);
            Point p2 = points.get(points.size() - 1);

            double angle = calculateAngle(p1, p2, point);
            if (Math.abs(angle - 180) < MAX_JD) {
                return false;
            }
        }


        return true;
    }

    /*
     * 计算三个点的角度
     * 向量p2,p1
     * 向量p3,p2
     * 注意传点先后顺序
    */
    private static double calculateAngle(Point p1, Point p2, Point p3) {

        double v1x = p2.x - p1.x, v1y = p2.y - p1.y;
        double v2x = p3.x - p2.x, v2y = p3.y - p2.y;


        double dotProduct = v1x * v2x + v1y * v2y;
        double mag1 = Math.sqrt(v1x * v1x + v1y * v1y);
        double mag2 = Math.sqrt(v2x * v2x + v2y * v2y);


        return Math.toDegrees(Math.acos(dotProduct / (mag1 * mag2)));
    }

    private class DrawingPanel extends JPanel {
        public DrawingPanel() {
            addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    userTrajectory.clear();
                }

                @Override
                public void mouseReleased(MouseEvent e) {
                    System.out.println("鼠标轨迹:");
                    for (Point p : userTrajectory) {
                        System.out.println("(" + p.x + ", " + p.y + ")");
                    }
                }
            });

            addMouseMotionListener(new MouseMotionAdapter() {
                @Override
                public void mouseDragged(MouseEvent e) {
                    userTrajectory.add(e.getPoint());
                    repaint();
                }
            });
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            // 产生的点
            g.setColor(Color.RED);
            for (int i = 0; i < fixedPoints.size(); i++) {
                Point p = fixedPoints.get(i);
                g.fillOval(p.x - 5, p.y - 5, 10, 10);

//                int labelX = Math.min(p.x + 10, WIDTH - 30); // 文字右边界离画布边缘留出空间
//                int labelY = Math.max(p.y, 10);

                g.drawString("P" + (i + 1), p.x + 10, p.y);
            }

            // 鼠标
            g.setColor(Color.BLUE);
            for (int i = 1; i < userTrajectory.size(); i++) {
                Point p1 = userTrajectory.get(i - 1);
                Point p2 = userTrajectory.get(i);
                g.drawLine(p1.x, p1.y, p2.x, p2.y);
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(TrajectoryDrawingApp::new);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【UE5 C++课程系列笔记】27——多线程基础——ControlFlow插件的基本使用

目录 步骤 一、搭建基本同步框架 二、添加委托 三、添加蓝图互动框架 四、修改为异步框架 完整代码 通过一个游戏初始化流程的示例来介绍“ControlFlows”的基本使用。 步骤 一、搭建基本同步框架 1. 勾选“ControlFlows”插件 2. 新建一个空白C类&#xff0c;这里…

前端性能优化方面

页面加载过程 网页资源的加载通常需要以下基本步骤&#xff1a; 地址栏输入网页服务器地址 浏览器获取网页html文件 解析html文件中存在的js、css、图片等资源&#xff0c;通过网络线程加载 在特定时机执行js代码&#xff0c;可以在js中动态加载需要的静态资源 执行js里存在的f…

解锁“搭子小程序”开发新机遇,助力企业数字化转型

搭子作为一种新型的社交方式&#xff0c;逐渐进入到了年轻人的生活中&#xff0c;在日常旅游、学习、逛街等&#xff0c;年轻人都可以找到志同道合的“搭子”&#xff0c;提高生活的幸福指数。 随着搭子市场的发展&#xff0c;通过互联网寻找搭子已经成为了年轻人的必备方式。…

Open FPV VTX开源之ardupilot配置

Open FPV VTX开源之ardupilot配置 1. 源由2. 配置3. 总结4. 参考资料5. 补充5.1 飞控固件版本5.2 配置Ardupilot的BF OSD5.3 OSD偏左问题 1. 源由 飞控嵌入式OSD - ardupilot配置使用ardupliot配套OSD图片。 Choose correct font depending on Flight Controller SW. ──>…

Harmony NEXT开发ArkUI框架速成二基础语法

程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java、嵌入式、鸿蒙、人工智能等,专注于程序员成长那点儿事,希望在成长的路上有你相伴&#xff01;君志所向,一往无前&#xff01; 1.ArkUI基础语法 1.1 ArkTS页面组成 在创建的时候&#xff0c;可以创建Page也可以直…

【树莓派3B】香瓜树莓派3B之语音识别机器人

本文最后修改时间&#xff1a;2018年04月03日 11:27 一、本节简介 本节用树莓派3代B型开发板做一个语音识别机器人&#xff0c;实现基础的语音对话功能。 注&#xff1a;转载原文路径 https://github.com/WhisperHear/Voice_Recognition_Control_Robot#userconsent# 上文个…

雷达流量监测系统:精准监控水流,确保水资源安全

水是生命之源&#xff0c;水资源的有效管理和保护直接关系到人类的生存与发展。随着全球气候变化和人口增加&#xff0c;水资源的短缺问题日益严重&#xff0c;如何高效监控和管理水资源&#xff0c;成为了水利、环保、农业等多个领域亟待解决的重要问题。而在这一过程中&#…

战场物联网:通信挑战与最新解决方案综述

论文标题 The Internet of Battle Things: A Survey on Communication Challenges and Recent Solutions 作者信息 Rachel Kufakunesu, Herman Myburgh, Allan De Freitas 论文出处 Discover Internet of Things (2025) 5:3 | The internet of battle things: a survey on…

GitLab 国际站中国大陆等地区停服,如何将数据快速迁移到云效

代码托管平台 GitLab 国际站&#xff08;GitLab.com&#xff09;近日发布公告&#xff0c;官宣即将停止对中国大陆、香港、澳门地区的用户账号提供服务&#xff0c;并提供 60 天过渡期自行迁移账户数据&#xff0c;超期未迁移的账号可能会被 GitLab 清除。这一重要决策引起了全…

React方向:react中5种Dom的操作方式

1、通过原生JS获取Dom去操作 通过document.querySelector(#title)原生js的方式去拿到dom节点&#xff0c;然后去进行操作。 import {Component} from "react";class App extends Component {//定义获取Dom的函数handleGetDom(){let title document.querySelector(#t…

更灵活的对象之间的联动 - 观察者模式(Observer Pattern)

观察者模式&#xff08;Observer Pattern&#xff09; 观察者模式&#xff08;Observer Pattern&#xff09;观察者模式&#xff08;Observer Pattern&#xff09;概述观察者模式&#xff08;Observer Pattern&#xff09; 结构图观察者模式&#xff08;Observer Pattern&#…

Webpack 5 混淆插件terser-webpack-plugin生命周期作用时机和使用注意事项

参考案例代码 海南酷森科技有限公司/webpack-simple-demo Terser&#xff08;简要的/简短的&#xff09; 混淆依据 混淆是发生在代码已经 bundle 之后的事情 变量或者函数在被引用或赋值时才能被混淆 孤立的函数或者变量可能会被移除&#xff0c;但不会被混淆&#xff0c;要…

‌OCP英文全称是什么

在数据库领域&#xff0c;OCP全称为Oracle Certified Professional&#xff0c;是Oracle公司提供的Oracle数据库中级认证&#xff0c;专门针对数据库管理员(Database Administrator&#xff0c;简称DBA)和数据库开发人员。以下是关于OCP认证的详细介绍&#xff1a; 认证领域与…

MyBatis实现数据库的CRUD

本文主要讲解使用MyBatis框架快速实现数据库中最常用的操作——CRUD。本文讲解的SQL语句都是MyBatis基于注解的方式定义的&#xff0c;相对简单。 Mybatis中#占位符和$拼接符的区别 “#”占位符 在使用MyBatis操作数据库的时候&#xff0c;可以直接使用如下SQL语句删除一条数…

微调神经机器翻译模型全流程

MBART: Multilingual Denoising Pre-training for Neural Machine Translation 模型下载 mBART 是一个基于序列到序列的去噪自编码器&#xff0c;使用 BART 目标在多种语言的大规模单语语料库上进行预训练。mBART 是首批通过去噪完整文本在多种语言上预训练序列到序列模型的方…

RTX 5090 加持,科研服务器如何颠覆 AI 深度学习构架?

RTX 5090作为英伟达旗舰级GPU&#xff0c;凭借Ada Lovelace架构&#xff0c;融合创新的SM多单元流处理器、第三代RT Core与第四代Tensor Core&#xff0c;打造出极为强劲的计算体系。其24GB GDDR6X显存搭配1TB/s带宽&#xff0c;能以极低延迟和超高吞吐量处理大规模张量数据&am…

【2025最新】机器学习类计算机毕设选题80套,适合大数据,人工智能

【2025最新】机器学习类型计算机毕设选题 1-10套 基于Spring Boot的物流管理系统的设计与实现 基于机器学习的虚假招聘信息的分析与预测 基于机器学习的影响数据科学家职业变动因素的分析与预测 基于Spring Boot的历史文物交流平台的设计与实现 基于机器学习的肥胖影响因素的分…

【PPTist】幻灯片放映

放映功能的代码都在 src/hooks/useScreening.ts&#xff0c;我们看一下 从当前页开始 放映的功能。 // 进入放映状态&#xff08;从当前页开始&#xff09; const enterScreening () > {enterFullscreen()screenStore.setScreening(true) }首先是 enterFullscreen()&#…

MySQL 16 章——变量、流程控制和游标

一、变量 在MySQL数据库的存储过程和存储函数中&#xff0c;可以使用变量来存储查询或计算的中间结果数据&#xff0c;或者输出最终的结果数据 在MySQL数据库中&#xff0c;变量分为系统变量和用户自定义变量 &#xff08;1&#xff09;系统变量 1.1.1系统变量分类 变量由…

T-SQL编程

目录 1、T-SQL的元素 1.1 标识符 1. 常规标识符 2. 分隔标识符 1.2 变量 1. 全局变量 2. 局部变量 1.3 运算符 1. 算数运算符 2. 赋值运算符 3. 位运算符 4. 比较运算符 5. 逻辑运算符 6. 字符串连接运算符 7. 一元运算符 8. 运算符的优先级和结合性 1.4 批处…