java画bezier曲线_java 画的4个点的Bezier曲线

该博客演示了如何使用Java来绘制由四个点定义的贝塞尔曲线。代码中定义了一个`test2`类,该类继承自`JPanel`并实现了`MouseListener`和`MouseMotionListener`接口,允许用户通过鼠标交互式地改变控制点位置,从而动态更新贝塞尔曲线。当用户点击面板时,会创建新的控制点,最多允许四个点。鼠标拖动时,对应的控制点会移动,进而改变曲线形状。贝塞尔曲线的绘制利用了参数方程,并在每次移动控制点后重新绘制。
摘要由CSDN通过智能技术生成

//其中第2和第3个实心点为控制点,可以鼠标拖动,但是不能太快,不然曲线点的坐标x,y计算跟不上。

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import java.awt.event.MouseMotionListener;

import java.awt.geom.Ellipse2D;

import java.awt.geom.Point2D;

import javax.swing.JFrame;

import javax.swing.JPanel;

public class test2 extends JPanel implements MouseListener,MouseMotionListener{

private static final long serialVersionUID = 1L;

private Point2D[] controlPoint;

private Ellipse2D.Double[] ellipse;

private static final double SIDELENGTH = 8;

private int numPoints;

private double t=0.002;

public test2(){

numPoints = 0;

controlPoint = new Point2D[4];

ellipse = new Ellipse2D.Double[4];

this.addMouseListener(this);

this.addMouseMotionListener(this);

}

@Override

protected void paintComponent(Graphics g) {

// TODO Auto-generated method stub

super.paintComponent(g);

Graphics2D g2 = (Graphics2D)g;

g2.setColor(Color.MAGENTA);

for(int i=0; i

if(i>0 && i

g2.fill(ellipse[i]);

}else {

g2.draw(ellipse[i]);

}

if(numPoints>1 && i

g2.drawLine((int)controlPoint[i].getX(), (int)controlPoint[i].getY(), (int)controlPoint[i+1].getX(), (int)controlPoint[i+1].getY());

}

if(numPoints == 4) {

double x,y;

g2.setColor(Color.RED);

for(double k=t; k<=1+t; k+=t) {

x = (1-k)*(1-k)*(1-k)*controlPoint[0].getX() + 3*k*(1-k)*(1-k)*controlPoint[1].getX()

+ 3*k*k*(1-k)*controlPoint[2].getX() + k*k*k*controlPoint[3].getX();

y = (1-k)*(1-k)*(1-k)*controlPoint[0].getY() + 3*k*(1-k)*(1-k)*controlPoint[1].getY()

+ 3*k*k*(1-k)*controlPoint[2].getY() + k*k*k*controlPoint[3].getY();

//System.out.println(x + " " + y );

g2.drawLine((int)x, (int)y, (int)x, (int)y);

}

}

}

@Override

public Dimension getPreferredSize() {

// TODO Auto-generated method stub

return new Dimension(600,600);

}

public static void main(String[] agrs) {

JFrame f = new JFrame();

test2 t2 = new test2();

f.add(t2);

f.pack();

f.setVisible(true);

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

@Override

public void mouseClicked(MouseEvent e) {

// TODO Auto-generated method stub

if(numPoints <4) {

double x = e.getX();

double y = e.getY();

controlPoint[numPoints] = new Point2D.Double(x, y);

Ellipse2D.Double current = new Ellipse2D.Double(x-SIDELENGTH/2, y-SIDELENGTH/2, SIDELENGTH, SIDELENGTH);

ellipse[numPoints] = current;

numPoints++;

repaint();

}

}

@Override

public void mousePressed(MouseEvent e) {

// TODO Auto-generated method stub

}

private int find(Point2D p){

int flag = 5;

for(int i=0; i

if( ellipse[i].contains(p)) {

flag = i;

return flag;

}

}

return flag;

}

@Override

public void mouseReleased(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mouseEntered(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mouseExited(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mouseDragged(MouseEvent e) {

// TODO Auto-generated method stub

int flag = find((Point2D)e.getPoint());

if( flag<5) {

double x = e.getX();

double y = e.getY();

controlPoint[flag] = new Point2D.Double(x, y);

Ellipse2D.Double current = new Ellipse2D.Double(x-SIDELENGTH/2, y-SIDELENGTH/2, SIDELENGTH, SIDELENGTH);

ellipse[flag] = current;

repaint();

}

}

@Override

public void mouseMoved(MouseEvent e) {

// TODO Auto-generated method stub

}

}

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值