// 生成一段贝叶斯曲线
private static List<Point> getBezier(List<Point> pointList) {
List<Point> bezierPointList = new ArrayList<>();
Iterator it = pointList.iterator();
int si = pointList.size();
int s = si - 1;
float[] f = sf(si);
float p[][] = new float[si][2];
for (int j = 0; it.hasNext(); j++) {
Point q = (Point) it.next();
p[j][0] = q.x;
p[j][1] = q.y;
}
int rate = 100, x0 = (int) p[0][0], y0 = (int) p[0][1], x1, y1;
for (float t = 0; t <= 1; t += 1.0 / rate) {
double xt = 0;
double yt = 0;
for (int i = 0; i < si; i++) {
double m = f[i] * Math.pow(t, i) * Math.pow(1 - t, s - i) * p[i][0];
xt = xt + m;
}
for (int i = 0; i < si; i++) {
double m = f[i] * Math.pow(t, i) * Math.pow(1 - t, s - i) * p[i][1];
yt = yt + m;
}
x1 = (int) (xt);
y1 = (int) (yt);
bezierPointList.add(new Point(x0, y0));
x0 = x1;
y0 = y1;
}
return bezierPointList;
}
public static float[] sf(int nu) {
int n = nu - 1;
float[] list = new float[n + 1];
list[0] = 1;
for (int i = 1; i < n; i++) {
float add = 1;
for (int j = n, k = 1; k <= i; j--, k++) {
add = add * j;
add = add / k;
}
list[i] = add;
}
for (int i = 0; i < nu; i++) {
if (list[i] == 0)
list[i] = 1;
}
return list;
}
转载一个示例:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
class BezierTest extends JFrame {
ArrayList points = new ArrayList();
int si;
BezierTest(String s) {
super(s);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
points = new ArrayList();
setLayout(null);
setBounds(300, 300, 600, 400);
this.setBackground(new Color(204, 204, 255));
setVisible(true);
JOptionPane.showMessageDialog(null, "按鼠标左键画控制点,按右键结束画点");
this.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
points.add(new Point(e.getX(), e.getY()));
repaint(); //让Frame强制重画
}
if (e.getButton() == MouseEvent.BUTTON3) {
si = points.size();
si = si;
System.out.println(si);
JOptionPane.showMessageDialog(null, "finish");
repaint();
}
}
});
}
public void paint(Graphics g) {
Iterator it = points.iterator();
while (it.hasNext()) {
Point q = (Point) it.next();
g.fillOval(q.x, q.y, 5, 5);
}
if (si > 1) {
drawBezier(g);
}
}
public void drawBezier(Graphics g) {
Iterator it = points.iterator();
float t;
float p[][] = new float[si][2];
for (int j = 0; it.hasNext(); j++) {
Point q = (Point) it.next();
p[j][0] = q.x;
p[j][1] = q.y;
int j1 = j + 1;
System.out.println("第" + j1 + "点坐标为:X-" + q.x + " Y-" + q.y);
}
float[] f = new float[si];
f = sf(si);
int rate = 200, x0 = (int) p[0][0], y0 = (int) p[0][1], x1, y1;
for (int i = 0; i < si - 1; i++) {
g.drawLine((int) p[i][0], (int) p[i][1], (int) p[i + 1][0], (int) p[i + 1][1]);
}
g.setColor(Color.blue);
int s = si - 1;
for (t = 0; t <= 1; t += 1.0 / rate) {
double xt = 0;
double yt = 0;
for (int i = 0; i < si; i++) {
double m = f[i] * Math.pow(t, i) * Math.pow(1 - t, s - i) * p[i][0];
xt = xt + m;
}
for (int i = 0; i < si; i++) {
double m = f[i] * Math.pow(t, i) * Math.pow(1 - t, s - i) * p[i][1];
yt = yt + m;
}
x1 = (int) (xt);
y1 = (int) (yt);
g.setColor(Color.red);
g.drawLine(x0, y0, x1, y1);
x0 = x1;
y0 = y1;
}
}
public static float[] sf(int nu) {
int n = nu - 1;
float[] list = new float[n + 1];
list[0] = 1;
for (int i = 1; i < n; i++) {
float add = 1;
for (int j = n, k = 1; k <= i; j--, k++) {
add = add * j;
add = add / k;
}
list[i] = add;
}
for (int i = 0; i < nu; i++) {
if (list[i] == 0)
list[i] = 1;
}
return list;
}
public static void main(String[] args) {
new BezierTest("Bezier");
}
}