java 平滑曲线_java画圆滑曲线的问题

这个可以用插值来做import java.awt.Color;

import java.awt.Graphics;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import javax.swing.JFrame;

public class Interpose extends JFrame {

public Interpose() {

super();

setBounds(0, 0, 600, 600);

addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent ev) {

dispose();

System.exit(0);

}

});

setVisible(true);

}

//Lagrange interpose

public double Lagrange(double x[], double y[], double value) {

double sum = 0;

double L;

for (int i = 0; i < x.length; i++) {

L = 1;

for (int j = 0; j < x.length; j++) {

if (j != i)

L = L * (value - x[j]) / (x[i] - x[j]);

}

sum = sum + L * y[i];

}

return sum;

}

public void paint(Graphics g) {

//double[] X = { 100, 50, 150, 200 };

//double[] Y = { 150, 200, 300, 50 };

double[] X = { 123.334, 134.4532,133.1233 };

double[] Y = { 224.567, 245.565,257.899}; double min=Double.MAX_VALUE;

double max=Double.MIN_VALUE;

for(int i=0;i

if(X[i]>max) max=X[i];

if(X[i]

}

g.setColor(Color.red);

for (double x = min; x <= max; x = x + 0.01) {

g.drawLine((int) x, (int) Lagrange(X, Y, x), (int) x,

(int) Lagrange(X, Y, x));

}

}

public static void main(String[] args) {

new Interpose();

}

}

你的数据中的Y坐标太小,效果不明显,我把它拉伸了10倍,

2008年8月15日 19:41

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贝塞尔曲线是一种平滑曲线,通过控制点来定义曲线的形状。在Java中,可以通过使用Java 2D API的Path2D类来绘制和操作贝塞尔曲线。 下面是一个简单的贝塞尔曲线平滑算法的实现: ```java import java.awt.geom.Path2D; public class BezierCurve { public static Path2D smoothCurve(double[] x, double[] y) { Path2D path = new Path2D.Double(); path.moveTo(x[0], y[0]); // 为了形成闭合曲线,最后一个点需要在两个端点之间插值 double[] x0 = new double[x.length + 2]; double[] y0 = new double[y.length + 2]; System.arraycopy(x, 0, x0, 1, x.length); System.arraycopy(y, 0, y0, 1, y.length); x0[0] = x[0] * 2 - x[1]; y0[0] = y[0] * 2 - y[1]; x0[x0.length - 1] = x[x.length - 1] * 2 - x[x.length - 2]; y0[y0.length - 1] = y[y.length - 1] * 2 - y[y.length - 2]; for (int i = 1; i < x0.length - 2; i++) { double x1 = x0[i]; double y1 = y0[i]; double x2 = x0[i + 1]; double y2 = y0[i + 1]; double xc = (x1 + x2) / 2; double yc = (y1 + y2) / 2; path.quadTo(x1, y1, xc, yc); } // 为了能够在Path2D上使用close方法,需要添加一个结束点 path.lineTo(x[x.length - 1], y[y.length - 1]); path.closePath(); return path; } } ``` 这个算法使用了二次贝塞尔曲线(Path2D.quadTo)来连接所有的点。在连接相邻的点之间,算法会通过计算中点来计算控制点。为了形成闭合曲线,最后一个点需要在两个端点之间插值。最后,为了能够在Path2D上使用close方法,需要添加一个结束点。 使用这个算法可以将一组点平滑地连接成一个贝塞尔曲线: ```java import javax.swing.*; import java.awt.*; public class BezierCurveTest extends JPanel { private static final int WIDTH = 400; private static final int HEIGHT = 400; private static final double[] X = { 50, 100, 150, 200, 250, 300, 350 }; private static final double[] Y = { 200, 250, 150, 300, 100, 350, 50 }; public BezierCurveTest() { setPreferredSize(new Dimension(WIDTH, HEIGHT)); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); // 绘制原始点 g2d.setColor(Color.BLUE); for (int i = 0; i < X.length; i++) { g2d.fillOval((int) X[i] - 3, (int) Y[i] - 3, 6, 6); } // 绘制贝塞尔曲线 g2d.setColor(Color.RED); Path2D path = BezierCurve.smoothCurve(X, Y); g2d.draw(path); g2d.dispose(); } public static void main(String[] args) { JFrame frame = new JFrame("Bezier Curve Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new BezierCurveTest()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } } ``` 这个示例程序中,我们使用了一组随机生成的点来绘制贝塞尔曲线。可以看到,通过使用贝塞尔曲线平滑算法,我们可以将这些点连接成一个平滑曲线

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值