贝塞尔曲线生成算法

从网上搜集来的两控制点贝塞尔曲线生成法:

 

 

         int n=controlPoint.size()-1;  // vector<POINT>存储控制点
         int i,r;
         float u;
         CvPoint *p=new CvPoint[n+1];
         BezierPoint.clear();
         //u的步长决定了曲线点的精度 
         for(u=0;u<=1;u+=0.01){
           
           for(i=0;i<=n;i++)p[i]=controlPoint[i];
           
           for(r=1;r<=n;r++){
                for(i=0;i<=n-r;i++){
                         p[i].x=(1-u)*p[i].x+u*p[i+1].x;
                         p[i].y=(1-u)*p[i].y+u*p[i+1].y;
                }
           }
           BezierPoint.push_back(p[0]);
         }
         delete [] p;
         //到这里贝塞尔曲线生成完毕 
         for(int i = 0 ;i < BezierPoint.size();i++){
             
             cvCircle(canva,BezierPoint[i],1,CV_RGB(0,0,255),1,8,0);
         }  
 

 曲线前部分和直线p0-p1相切

 曲线后部分和直线p2-p3相切


 

3次贝塞尔计算公式:

t : 0 ~ 1;

yt=1-t;
xt=p[m][0]*yt*yt*yt+3*p[m+1][0]*yt*yt*t+3*p[m+2][0]*yt*t*t+p[m+3][0]*t*t*t;
yt=p[m][1]*yt*yt*yt+3*p[m+1][1]*yt*yt*t+3*p[m+2][1]*yt*t*t+p[m+3][1]*t*t*t;

新点:(xt,yt)

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值