主类:BezierFrame

  1. package bezierT;
  2. import java.awt.Color;
  3. import java.awt.Dimension;
  4. import java.awt.EventQueue;
  5. import java.awt.FlowLayout;
  6.  
  7. import javax.swing.JButton;
  8. import javax.swing.JDialog;
  9. import javax.swing.JFrame;
  10. import javax.swing.JPanel;
  11. import javax.swing.UIManager;
  12. import javax.swing.border.LineBorder;
  13.  
  14. public class BezierFrame extends JFrame
  15. {
  16. public static void main(String[] args)
  17. {
  18. EventQueue.invokeLater(new Runnable()
  19. {
  20. public void run()
  21. {
  22. JFrame frame = new JFrame();
  23. frame.setTitle("BezierTest");
  24. frame.setSize(264,360);
  25. BezierPanel bezier = new BezierPanel();
  26. bezier.setBorder(new LineBorder(Color.black));
  27. bezier.setPreferredSize(new Dimension(254, 254));
  28. frame.add(bezier);
  29. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  30. frame.setVisible(true);
  31. }
  32. });
  33. }
  34.  
  35. }

实现类:BezierPanel

  1. package bezierT;
  2.  
  3. import javax.swing.*;
  4.  
  5. import java.awt.*;
  6. import java.awt.geom.*;
  7. import java.awt.event.*;
  8. import java.util.ArrayList;
  9. import java.util.Random;
  10.  
  11. class BezierPanel extends JComponent
  12. {
  13. private static int SIZE = 8;
  14. private int current;
  15. private Point2D[] points;
  16.  
  17. public BezierPanel()
  18. {
  19. Point2D p1= new Point2D.Double(64,190);
  20. Point2D p2= new Point2D.Double(64,150);
  21. Point2D p3= new Point2D.Double(64,104);
  22. Point2D p4= new Point2D.Double(64, 64);
  23. points = new Point2D[]{p1,p2,p3,p4};
  24.  
  25. addMouseListener(new MouseAdapter()
  26. {
  27. public void mousePressed(MouseEvent event)
  28. {
  29. Point2D p =event.getPoint();
  30. for(int i = 0; i < points.length; i++)
  31. {
  32. double x = points[i].getX() - SIZE/2;
  33. double y = points[i].getY() - SIZE/2;
  34. Rectangle2D r = new Rectangle2D.Double(x, y, SIZE, SIZE);
  35. if(r.contains(p))
  36. {
  37. current = i;
  38. break;
  39. }
  40. }
  41. }
  42. public void mouseReleased(MouseEvent event)
  43. {
  44. current = -1;
  45. }
  46. });
  47.  
  48. addMouseMotionListener(new MouseMotionAdapter()
  49. {
  50. public void mouseDragged(MouseEvent event)
  51. {
  52. if (current == -1 ) {
  53. return;
  54. }
  55. if(current != -1)
  56. points[current] = event.getPoint();
  57.  
  58. repaint();
  59. }
  60. });
  61. current = -1;
  62. }
  63. public Point2D cubicBezier(double t, Point2D[] p)
  64. {
  65. Point2D[] temp = new Point2D[p.length];
  66. for(int k=0; k < p.length; k++)
  67. temp[k]=p[k];
  68. for(int i=0; i< 3; i++)
  69. {
  70. for(int j = 0; j < 4-i-1 ; j++)
  71. {
  72. double x = (1-t)*temp[j].getX() + t*temp[j+1].getX();
  73. double y = (1-t)*temp[j].getY()+ t*temp[j+1].getY();
  74. temp[j] = new Point2D.Double(x,y);
  75. }
  76. }
  77. return temp[0];
  78. }
  79.  
  80. public void drawBezier(Graphics g, Point2D[] p)
  81. {
  82. for(double t = 0; t < 1; t+=0.002)
  83. {
  84. Point2D p1= cubicBezier(t,p);
  85. Point2D p2 = cubicBezier(t+0.001,p);
  86. g.drawLine((int)Math.round(p1.getX()),(int)Math.round(p1.getY()),(int)Math.round(p2.getX()),(int)Math.round(p2.getY()));
  87. }
  88. }
  89. public void paintComponent(Graphics g)
  90. {
  91. if(points == null) return;
  92. Graphics2D g2 = (Graphics2D) g;
  93. for(int i = 0; i < points.length; i++)
  94. {
  95. double x = points[i].getX() - SIZE/2;
  96. double y = points[i].getY() - SIZE/2;
  97. g2.drawString(String.valueOf(i+1), (float)(x+SIZE), (float)(y+SIZE));
  98. g2.fill(new Rectangle2D.Double(x, y, SIZE, SIZE));
  99. }
  100. drawBezier(g,points);
  101. }
  102. }

贝塞尔曲线java实现的更多相关文章

  1. Android 贝塞尔曲线 折线图

    1.贝塞尔曲线:http://baike.baidu.com/view/60154.htm,在这里理解什么是贝塞尔曲线 2.直接上图: 3.100多行代码就可以画出贝塞尔曲线,直接上代码 packag ...

  2. 贝塞尔曲线:原理、自定义贝塞尔曲线View、使用!!!

    一.原理 转自:http://www.2cto.com/kf/201401/275838.html Android动画学习Demo(3) 沿着贝塞尔曲线移动的Property Animation Pr ...

  3. Android中贝塞尔曲线的绘制方法

    贝塞尔曲线,很多人可能不太了解,什么叫做贝塞尔曲线呢?这里先做一下简单介绍:贝塞尔曲线也可以叫做贝济埃曲线或者贝兹曲线,它由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋.一般的矢量图形软件常 ...

  4. Android - Animation 贝塞尔曲线之美

    概述 贝塞尔曲线于1962,由法国工程师皮埃尔·贝塞尔所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计.贝塞尔曲线最初由Paul de Casteljau于1959年运用de Casteljau演算 ...

  5. JS模拟CSS3动画-贝塞尔曲线

    一.什么是贝塞尔曲线 1962年,法国工程师皮埃尔·贝塞尔(Pierre Bézier),贝塞尔曲线来为为解决汽车的主体的设计问题而发明了贝塞尔曲线.如今,贝赛尔曲线是计算机图形学中相当重要的一种曲线 ...

  6. 关于曲线 规划 算法 线性 S曲线 贝塞尔曲线

    工控领域经常会涉及速度加减速的算法:线性加减速,S曲线加减速(sin函数,拓展其他三角函数曲线), 贝塞尔曲线,等等. 线性加减速:    设定起始速度V0,目标速度V1,加速时间Ta(s,或加速度) ...

  7. canvas贝塞尔曲线

    贝塞尔曲线 Bézier curve(贝塞尔曲线)是应用于二维图形应用程序的数学曲线. 曲线定义:起始点.终止点.控制点.通过调整控制点,贝塞尔曲线的形状会发生变化. 1962年,法国数学家Pierr ...

  8. 贝塞尔曲线(UIBezierPath)属性、方法汇总

    UIBezierPath主要用来绘制矢量图形,它是基于Core Graphics对CGPathRef数据类型和path绘图属性的一个封装,所以是需要图形上下文的(CGContextRef),所以一般U ...

  9. 深度掌握SVG路径path的贝塞尔曲线指令

    一.数字.公式.函数.变量,哦,NO! 又又一次说起贝塞尔曲线(英语:Bézier curve,维基百科详尽中文释义戳这里),我最近在尝试实现复杂的矢量图形动画,发现对贝塞尔曲线的理解馒头那么厚,是完 ...

随机推荐

  1. python2 安装 MySQL-python

    yum -y install mysql-devel libxml2 libxml2-dev libxslt* zlib gcc openssl yum install gcc libffi-deve ...

  2. Java Spring Boot VS .NetCore (八) Java 注解 vs .NetCore Attribute

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  3. 斯特林公式 ——Stirling公式(取N阶乘近似值)

  4. 使用Python下载文件

    python -c "with open('/tmp/file.sh', 'wb') as f: import urllib2; f.write(urllib2.urlopen('http: ...

  5. 【C#】时间类型修改

    鉴于前后端分离发展的迅速.前端很多时间控件都会读UTC时间. 安利一个小知识 // // 摘要: // Creates a new System.DateTime object that has th ...

  6. spark伪分布式的安装

    不依赖hadoop 百度分享安装包地址:http://pan.baidu.com/s/1dD4BcGT 点击打开链接 解压 并重命名: 进入spark100目录: 修改配置: Cd conf 配置单击 ...

  7. 2017-10-29—英语发音的一些技巧总结

    学习了这么多年英语还是一句口语也说不出口,大家一定像我一样有hin多的f*k想说. 在很小的时候我们就学了英语音标,知道了有前元音.中元音.后元音(很多同志多年不用应该已经把这些忘得差不多了,like ...

  8. [POJ1220]NUMBER BASE CONVERSION (高精,进制转换)

    题意 任意进制之间的高进的转换 思路 相模倒排,高精处理 代码 我太弱了,下面附一个讨论里发的maigo思路的代码 ],A[]; ],d[]; main(){ for(scanf("%d&q ...

  9. __x__(42)0910第六天__表格布局 老旧的布局方法

    table 布局 不易于维护,耦合太严重了. 不利于搜索引擎检索. 效果图: html代码: <!doctype html> <html> <head> <m ...

  10. 01_ if 练习

    prompt()        弹出一个对话框,该对话框中会带有一个文本框,用户可以在文本框中输入一段内容. 该函数需要一个字符串作为参数,用作对话框的提示文字. 用户输入内容,将会作为函数返回值.可 ...