贝塞尔 java_贝塞尔曲线java实现

该博客介绍了一个Java实现的BezierPanel类,用于在组件上绘制和交互式编辑贝塞尔曲线。通过监听鼠标事件,用户可以拖动控制点来改变曲线形状。博客还包含了cubicBezier方法用于计算曲线上的点,以及drawBezier方法用于绘制曲线。
摘要由CSDN通过智能技术生成

packagebezierT;import javax.swing.*;import java.awt.*;import java.awt.geom.*;import java.awt.event.*;importjava.util.ArrayList;importjava.util.Random;class BezierPanel extendsJComponent

{private static int SIZE = 8;private intcurrent;privatePoint2D[] points;publicBezierPanel()

{

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= newPoint2D[]{p1,p2,p3,p4};

addMouseListener(newMouseAdapter()

{public voidmousePressed(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= newRectangle2D.Double(x, y, SIZE, SIZE);if(r.contains(p))

{

current=i;break;

}

}

}public voidmouseReleased(MouseEvent event)

{

current= -1;

}

});

addMouseMotionListener(newMouseMotionAdapter()

{public voidmouseDragged(MouseEvent event)

{if (current == -1) {return;

}if(current != -1)

points[current]=event.getPoint();

repaint();

}

});

current= -1;

}public Point2D cubicBezier(doublet, Point2D[] p)

{

Point2D[] temp= newPoint2D[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]= newPoint2D.Double(x,y);

}

}return temp[0];

}public voiddrawBezier(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 voidpaintComponent(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(newRectangle2D.Double(x, y, SIZE, SIZE));

}

drawBezier(g,points);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值