贝塞尔曲线 java

news2025/2/22 21:45:17

参考文章:
理解贝塞尔曲线https://blog.csdn.net/weixin_42301220/article/details/125167672
代码实现参考
https://blog.csdn.net/yinhun2012/article/details/118653732

贝塞尔 一二三阶java代码实现,N阶段可以通过降阶递归实现

public class Test extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        
        //画图测试贝塞尔曲线
        ArrayList<T> list = test1B();
        for (int i = 0; i < list.size(); i++) {
        	//画线的2个点一样即画点
            g2.drawLine((int)list.get(i).p.x,(int)list.get(i).p.y,(int)list.get(i).p.x,(int)list.get(i).p.y);
        }
        list = test2B();
        for (int i = 0; i < list.size(); i++) {
        	//画线的2个点一样即画点
            g2.drawLine((int)list.get(i).p.x,(int)list.get(i).p.y,(int)list.get(i).p.x,(int)list.get(i).p.y);
            if(i%100==0){//展示部分切线
                g2.drawLine((int)list.get(i).a1.x,(int)list.get(i).a1.y,(int)list.get(i).a2.x,(int)list.get(i).a2.y);
            }
        }
        list = test3B();
        for (int i = 0; i < list.size(); i++) {
        	//画线的2个点一样即画点
            g2.drawLine((int)list.get(i).p.x,(int)list.get(i).p.y,(int)list.get(i).p.x,(int)list.get(i).p.y);
            if(i%100==0){//展示部分切线
                g2.drawLine((int)list.get(i).a1.x,(int)list.get(i).a1.y,(int)list.get(i).a2.x,(int)list.get(i).a2.y);
            }
        }
    }

    static class T{
        Point p;
        Point a1;//p的切线起始点
        Point a2;//p的切线结束点
    }

    //测试贝塞尔曲线
    //1阶 2个点
    static T get1Bse(Point p1,Point p2,double t){
        T tp = new T();
        tp.p = new Point();
        tp.a1 = p1;
        tp.a2 = p2;
        tp.p.x = (1-t)*p1.x + t*p2.x;
        tp.p.y = (1-t)*p1.y + t*p2.y;
        return tp;
    }
    static ArrayList<T> test1B(){
        ArrayList<T> list = new ArrayList<>();
        for (int i = 0; i <= 1000; i++) {
            T tt = get1Bse(new Point(100,100,""),new Point(200,200,""),i*0.001);
            list.add(tt);
        }
        return list;
    }
    //2阶 3个点
    static T get2Bse(Point p1,Point p2,Point p3,double t){
        T tp = new T();
        tp.p = new Point();
        tp.a1 = new Point();
        tp.a2 = new Point();
        tp.a1.x = (1-t)*p1.x + t*p2.x;
        tp.a1.y = (1-t)*p1.y + t*p2.y;
        tp.a2.x = (1-t)*p2.x + t*p3.x;
        tp.a2.y = (1-t)*p2.y + t*p3.y;
        tp.p.x = (1-t)*(1-t)*p1.x + 2*t*(1-t)*p2.x + t*t*p3.x;
        tp.p.y = (1-t)*(1-t)*p1.y + 2*t*(1-t)*p2.y + t*t*p3.y;
        return tp;
    }
    static ArrayList<T> test2B(){
        ArrayList<T> list = new ArrayList<>();
        for (int i = 0; i <= 1000; i++) {
            T tt = get2Bse(new Point(100,300,""),new Point(200,300,""),new Point(200,400,""),i*0.001);
            list.add(tt);
        }
        return list;
    }
    //3阶 4个点
    static T get3Bse(Point p1,Point p2,Point p3,Point p4,double t){
        Point p5 = new Point();
        Point p6 = new Point();
        Point p7 = new Point();
        p5.x = (1-t)*p1.x + t*p2.x;
        p5.y = (1-t)*p1.y + t*p2.y;
        p6.x = (1-t)*p2.x + t*p3.x;
        p6.y = (1-t)*p2.y + t*p3.y;
        p7.x = (1-t)*p3.x + t*p4.x;
        p7.y = (1-t)*p3.y + t*p4.y;

        T tp = new T();
        tp.p = new Point();
        tp.a1 = new Point();
        tp.a2 = new Point();
        tp.a1.x = (1-t)*p5.x + t*p6.x;
        tp.a1.y = (1-t)*p5.y + t*p6.y;
        tp.a2.x = (1-t)*p6.x + t*p7.x;
        tp.a2.y = (1-t)*p6.y + t*p7.y;
        tp.p.x = (1-t)*(1-t)*p5.x + 2*t*(1-t)*p6.x + t*t*p7.x;
        tp.p.y = (1-t)*(1-t)*p5.y + 2*t*(1-t)*p6.y + t*t*p7.y;
        return tp;
    }
    static ArrayList<T> test3B(){
        ArrayList<T> list = new ArrayList<>();
        for (int i = 0; i <= 1000; i++) {
            T tt = get3Bse(new Point(100,500,""),new Point(200,600,""),new Point(300,450,""),new Point(400,300,""),i*0.001);
            list.add(tt);
        }
        return list;
    }
    /*
    n阶的实现: todo
因为贝塞尔曲线的规则可以让n个顶点的问题降维到n-1的顶点的计算,那么我们递归套娃,是不是将n个顶点的问题变成由最基本的3个顶点(2阶)计算规则来实现呢?
例如:5个顶点的问题,先降到成4个顶点,再降维到3个顶点
     */
}

效果图
在这里插入图片描述

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

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

相关文章

FPGA+DDR+SERDES+USB3.0单向传输机方案,数据只能单向传输,避免反向攻击,确保系统安全

FPGADDRSERDESUSB3.0方案&#xff0c;设备包含发送端接收端&#xff0c;物料上采用光纤通讯&#xff0c;数据只能单向传输&#xff0c;避免反向攻击&#xff0c;确保系统安全 客户应用:高安全、高可靠性要求的场景 主要性能: 1.支持USB3.0传输&#xff0c;实测可达到350MB/s 2.…

Unreal Engine(虚幻引擎)的版本特点

Unreal Engine&#xff08;虚幻引擎&#xff09;是Epic Games开发的游戏引擎&#xff0c;广泛应用于游戏开发、影视制作、建筑设计、虚拟现实等领域。Unreal Engine版本指的是该引擎的发布版本&#xff0c;不同版本之间在功能、性能和稳定性等方面存在差异。北京木奇移动技术有…

转发_重定向

1.Servlet/JSP单独使用的弊端 当我们用Servlet或者JSP单独处理请求的时候 Servlet&#xff1a;拼接大量的html字符串 造成可读性差、难以维护JSP&#xff1a;使得html和Java代码互相交织 也造成了可读性差、难以维护的后果 最合适的做法就是两者结合使用 2.ServletJSP处理请…

Node.js安装与配置环境 v20.13.1(LTS)

1 下载 Node.js — Run JavaScript Everywhere LTS -- long-term support&#xff0c;长期维护版本 如果要下载其他版本在download里选择下载 2 安装 一路点击next&#xff0c;默认安装路径C:\Program Files\nodejs 3 环境变量配置 1&#xff09;Path环境变量增加nodejs安装…

GUI-图形化的用户界面

一、概述 所谓GUI&#xff0c;即图形化的用户界面/接口&#xff08;Graphical User Interface&#xff09;&#xff0c;实现了采用图形方式显示的计算机操作用户界面。比如下面的QQ登录界面&#xff1a; 为了不被落下&#xff0c;Java依旧稳定发挥&#xff0c;它也提供了一套…

【全开源】Java U U跑腿同城跑腿小程序源码快递代取帮买帮送源码小程序+H 5+公众号跑腿系统

特色功能&#xff1a; 智能定位与路线规划&#xff1a;UU跑腿小程序能够利用定位技术&#xff0c;为用户提供附近的跑腿服务&#xff0c;并自动规划最佳路线&#xff0c;提高配送效率。订单管理&#xff1a;包括订单查询、订单状态更新、订单评价等功能&#xff0c;全行业覆盖…

Excel Module: Iteration #1 EasyExcel生成下拉列表模版时传入动态参数查询下拉数据

系列文章 EasyExcel生成带下拉列表或多级级联列表的Excel模版自定义校验导入数据(修订) 目录 系列文章前言仓库一、实现1.1 下拉元数据对象1.2 构建下拉元数据的映射关系1.3 框架方式1.3.1 框架实现1.3.2 框架用例模版类加载下拉业务导出接口 1.4 EasyExcel方式1.4.1 EasyExce…

ESP8266基础资源了解

封装的硬件资源 参考1&#xff0c;参考2 常说的esp8266指的是有一个屏蔽罩盖着的模块&#xff0c;里面包含了esp8266芯片和一个能够存储数据和程序的flash&#xff0c;因为esp8266没有存储功能。 使用arduino常用的nodemcu是包含这个模块并含有电源LDO和串口下载的设计电路如…

【知识碎片】2024_05_09

本篇记录了关于C语言的一些题目&#xff08;puts&#xff0c;printf函数的返回值&#xff0c;getchar&#xff0c;跳出多重循环&#xff09;&#xff0c;和一道关于位运算的代码&#xff3b;整数转换&#xff3d;。 C语言碎片知识 如下程序的功能是&#xff08; &#xff09; #…

原来pip是有默认路径的。

今天一直报错&#xff1a; bash: /root/data1/anaconda3/envs/li_3_10/bin/pip: /root/lsc/anaconda3/envs/li_3_10/bin/python: bad interpreter: No such file or directory 原来是root/data1/anaconda3/envs/li_3_10/bin/pip: 这个位置的pip 自身带默认路径&#xff0c;然…

使用css的box-reflect属性制作倒影效果

box-reflect 是一个在 CSS 中创建元素倒影效果的非标准属性。尽管它在过去的一些 WebKit 浏览器中&#xff08;如旧版的 Safari 和 Chrome&#xff09;得到了支持&#xff0c;但由于它并未成为 CSS 标准的一部分&#xff0c;因此在现代浏览器中的兼容性较差。以下是对 box-refl…

C++ | Leetcode C++题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; class Solution { public:int removeDuplicates(vector<int>& nums) {int n nums.size();if (n < 2) {return n;}int slow 2, fast 2;while (fast < n) {if (nums[slow - 2] ! nums[fast]) {nums[slow] nums[fast];slo…

03-Fortran基础--Fortran函数和子程序

03-Fortran基础--Fortran函数和子程序 0 引言1 各函数介绍1.1 函数&#xff08;Functions&#xff09;1.2. 子程序&#xff08;Subroutines&#xff09;1.3 递归函数&#xff08;Recursive Functions&#xff09;1.4. 泛型函数&#xff08;Generic Functions&#xff09;1.5. P…

blender 制作圆角立方体模型,倒角实现。cocos 使用。导出fbx

图片&#xff1a; 步骤&#xff1a; 1.首先创建一个立方体&#xff0c;这里可以使用默认的立方体。 2.在属性面板选择如“扳手”图标一样的修改器工具。 3.设置数量和段数实现圆角的圆滑效果&#xff0c;没有菱角。 保存导出相关的教程&#xff1a;

短信平台群发服务有什么优点

短信平台群发服务有什么优点 提高营销效率 短信平台群发服务利用自动化技术&#xff0c;可以帮助企业迅速向大量潜在客户营销信息。相比传统的逐一方式&#xff0c;群发服务可以同时大批目标客户&#xff0c;大大提高了营销效率。企业可以轻松地在短时间内覆盖更多的潜在客户&…

开源免费的定时任务管理系统:Gocron

Gocron&#xff1a;精准调度未来&#xff0c;你的全能定时任务管理工具&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 Gocron是github上一个开源免费的定时任务管理系统。它使用Go语言开发&#xff0c;是一个轻量级定时任务集中调度和管理系统&#xff0c;用于替代L…

Python 2.x与Python 3.x:初学者该如何选择?

自从Python在1994年首次发布以来,已经经历了多个版本的更新和改进。Python 1.x虽然在发展史上具有重要意义,但早已过时,不再用于实际开发。2000年发布的Python 2.x和2008年发布的Python 3.x则成为了Python家族中最常用的两个版本,形成了一个重要的分界线。特别是Python 3.x…

FPGA+HDMI转换方案,用于网络直播切换直播画面,客户应用:直播,自媒体

FPGAHDMI转换方案&#xff0c;用于网络直播切换直播画面 客户应用:直播&#xff0c;自媒体 主要功能: 1.支持多路HDMI高清输入/输出 2.支持各路输入输出灵活切换 3.支持USB接口 4.支持网口 5.支持音频输出接口 6.支持serders

吴恩达机器学习笔记:第 9 周-17大规模机器学习(Large Scale Machine Learning)17.3-17.4

目录 第 9 周 17、 大规模机器学习(Large Scale Machine Learning)17.3 小批量梯度下降17.4 随机梯度下降收敛 第 9 周 17、 大规模机器学习(Large Scale Machine Learning) 17.3 小批量梯度下降 小批量梯度下降算法是介于批量梯度下降算法和随机梯度下降算法之间的算法&…

【SRC实战】利用APP前端加密构造数据包

挖个洞先 https://mp.weixin.qq.com/s/ZnaRn222xJU0MQxWoRaiJg “ 以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合” 01 — 漏洞证明 “ 参数加密的情况&#xff0c;不会逆向怎么办&#xff1f;” 1、新用户首次设置密码时抓包&#xff0c;此处设置为0000…