贝塞尔曲线java实现
主类:BezierFrame
package bezierT;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout; import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.LineBorder; public class BezierFrame extends JFrame
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JFrame frame = new JFrame();
frame.setTitle("BezierTest");
frame.setSize(264,360);
BezierPanel bezier = new BezierPanel();
bezier.setBorder(new LineBorder(Color.black));
bezier.setPreferredSize(new Dimension(254, 254));
frame.add(bezier);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
} }
实现类:BezierPanel
package bezierT; import javax.swing.*; import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Random; class BezierPanel extends JComponent
{
private static int SIZE = 8;
private int current;
private Point2D[] points; public BezierPanel()
{
Point2D p1= new Point2D.Double(64,190);
Point2D p2= new Point2D.Double(64,150);
Point2D p3= new Point2D.Double(64,104);
Point2D p4= new Point2D.Double(64, 64);
points = new Point2D[]{p1,p2,p3,p4}; addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent event)
{
Point2D p =event.getPoint();
for(int i = 0; i < points.length; i++)
{
double x = points[i].getX() - SIZE/2;
double y = points[i].getY() - SIZE/2;
Rectangle2D r = new Rectangle2D.Double(x, y, SIZE, SIZE);
if(r.contains(p))
{
current = i;
break;
}
}
}
public void mouseReleased(MouseEvent event)
{
current = -1;
}
}); addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseDragged(MouseEvent event)
{
if (current == -1 ) {
return;
}
if(current != -1)
points[current] = event.getPoint(); repaint();
}
});
current = -1;
}
public Point2D cubicBezier(double t, Point2D[] p)
{
Point2D[] temp = new Point2D[p.length];
for(int k=0; k < p.length; k++)
temp[k]=p[k];
for(int i=0; i< 3; i++)
{
for(int j = 0; j < 4-i-1 ; j++)
{
double x = (1-t)*temp[j].getX() + t*temp[j+1].getX();
double y = (1-t)*temp[j].getY()+ t*temp[j+1].getY();
temp[j] = new Point2D.Double(x,y);
}
}
return temp[0];
} public void drawBezier(Graphics g, Point2D[] p)
{
for(double t = 0; t < 1; t+=0.002)
{
Point2D p1= cubicBezier(t,p);
Point2D p2 = cubicBezier(t+0.001,p);
g.drawLine((int)Math.round(p1.getX()),(int)Math.round(p1.getY()),(int)Math.round(p2.getX()),(int)Math.round(p2.getY()));
}
}
public void paintComponent(Graphics g)
{
if(points == null) return;
Graphics2D g2 = (Graphics2D) g;
for(int i = 0; i < points.length; i++)
{
double x = points[i].getX() - SIZE/2;
double y = points[i].getY() - SIZE/2;
g2.drawString(String.valueOf(i+1), (float)(x+SIZE), (float)(y+SIZE));
g2.fill(new Rectangle2D.Double(x, y, SIZE, SIZE));
}
drawBezier(g,points);
}
}
贝塞尔曲线java实现的更多相关文章
- Android 贝塞尔曲线 折线图
1.贝塞尔曲线:http://baike.baidu.com/view/60154.htm,在这里理解什么是贝塞尔曲线 2.直接上图: 3.100多行代码就可以画出贝塞尔曲线,直接上代码 packag ...
- 贝塞尔曲线:原理、自定义贝塞尔曲线View、使用!!!
一.原理 转自:http://www.2cto.com/kf/201401/275838.html Android动画学习Demo(3) 沿着贝塞尔曲线移动的Property Animation Pr ...
- Android中贝塞尔曲线的绘制方法
贝塞尔曲线,很多人可能不太了解,什么叫做贝塞尔曲线呢?这里先做一下简单介绍:贝塞尔曲线也可以叫做贝济埃曲线或者贝兹曲线,它由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋.一般的矢量图形软件常 ...
- Android - Animation 贝塞尔曲线之美
概述 贝塞尔曲线于1962,由法国工程师皮埃尔·贝塞尔所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计.贝塞尔曲线最初由Paul de Casteljau于1959年运用de Casteljau演算 ...
- JS模拟CSS3动画-贝塞尔曲线
一.什么是贝塞尔曲线 1962年,法国工程师皮埃尔·贝塞尔(Pierre Bézier),贝塞尔曲线来为为解决汽车的主体的设计问题而发明了贝塞尔曲线.如今,贝赛尔曲线是计算机图形学中相当重要的一种曲线 ...
- 关于曲线 规划 算法 线性 S曲线 贝塞尔曲线
工控领域经常会涉及速度加减速的算法:线性加减速,S曲线加减速(sin函数,拓展其他三角函数曲线), 贝塞尔曲线,等等. 线性加减速: 设定起始速度V0,目标速度V1,加速时间Ta(s,或加速度) ...
- canvas贝塞尔曲线
贝塞尔曲线 Bézier curve(贝塞尔曲线)是应用于二维图形应用程序的数学曲线. 曲线定义:起始点.终止点.控制点.通过调整控制点,贝塞尔曲线的形状会发生变化. 1962年,法国数学家Pierr ...
- 贝塞尔曲线(UIBezierPath)属性、方法汇总
UIBezierPath主要用来绘制矢量图形,它是基于Core Graphics对CGPathRef数据类型和path绘图属性的一个封装,所以是需要图形上下文的(CGContextRef),所以一般U ...
- 深度掌握SVG路径path的贝塞尔曲线指令
一.数字.公式.函数.变量,哦,NO! 又又一次说起贝塞尔曲线(英语:Bézier curve,维基百科详尽中文释义戳这里),我最近在尝试实现复杂的矢量图形动画,发现对贝塞尔曲线的理解馒头那么厚,是完 ...
随机推荐
- 源码安装zabbix遇到的报错集锦
报错1:checking for mysql_config... configure: error: MySQL library not found 解决办法:查找mysql_config #find ...
- Logstash利用ruby将有用的日志放到一个ES_INDEX将无用的日志放到另一个ES_INDEX
input{ kafka { bootstrap_servers => "127.0.0.1:9092" client_id => "nginxlog&quo ...
- react 20180504
react 入门 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 使用 RAII 完成线程等待
当使用 std::thread 对象执行线程时,必须要调用 join() (或者 detach(),由于 detach() 可以立即调用,所以这里只考虑 join()) #include <io ...
- Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第六集之基本命令使用】
学习命令的方法:linux中所有操作都是命令操作,可想而知命令有多少,更严重的是每个命令有很多参数,记命令容易,记参数就难了,所以建议: 自己准备一个博客,把通常用到的命令及其功能记载下来,用到的时候 ...
- XV Open Cup named after E.V. Pankratiev. GP of Three Capitals
A. Add and Reverse 要么全部都选择$+1$,要么加出高$16$位后翻转位序然后再补充低$16$位. #include<stdio.h> #include<iostr ...
- PropertyEditor、Formatter、Converter的应用
@ResponseBody @RequestMapping("date.do") public String data(Date date) { return date.toStr ...
- C# WinForm:无法访问已释放的对象
C#在父窗口中调用子窗口的过程: 1. 创建子窗口对象 2. 显示子窗口对象 笔者的程序中,主窗体MainFrm通过菜单调用子窗口ChildFrm.在窗体中定义了子窗口对象,然后在菜单项点击事件中 ...
- maven和glassfish安装和部署及hello1和hello2的部署
1.安装maven和glassfish及配置环境变 首先搜索并下载maven3.6.0和glassfish4.1.1(版本看按需要选择). 点击安装包进行安装 安装完成后开始配置环境变量 打开系统环境 ...
- eclipse部分常用快捷键
-------------eclipse常用快捷键------------- 1.alt+?或alt+/:自动补全代码或者提示代码 2.ctrl+o:快速outline视图 3.ctrl+shift+ ...