Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
- package zad6;
- /**
- *
- * @author troll
- */
- /*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
- import static zad6.Zad6.jb;
- import static zad6.Zad6.jp;
- import java.awt.Color;
- import java.awt.Cursor;
- import java.awt.Dimension;
- import java.awt.FlowLayout;
- import java.awt.Graphics;
- import java.awt.Graphics2D;
- import java.awt.Image;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.event.MouseEvent;
- import java.awt.event.MouseListener;
- import java.awt.event.MouseMotionListener;
- import java.awt.geom.Ellipse2D;
- import java.awt.geom.Rectangle2D;
- import java.awt.image.BufferedImage;
- import java.util.ArrayList;
- import javax.swing.JButton;
- import javax.swing.JFileChooser;
- import javax.swing.JFrame;
- import javax.swing.JPanel;
- /**
- *
- * @author Pawel
- */
- class MyPanel extends JPanel implements MouseListener, MouseMotionListener {
- static ArrayList<Integer> xPoints, yPoints, x, y, pointsListX, pointsListY;
- static ArrayList<Rectangle2D.Double> shapes;
- int startX = 0, startY = 0, endX, endY;
- int index = 0, pos = -1;
- boolean needClear = false;
- double step = 0.01;
- public static double countNewton(double n, int k) {
- double Wynik = 1; // Deklaracja zmiennych
- int i;
- for (i = 1; i <= k; i++) // Od 1 do k wykonujemy :
- {
- Wynik = Wynik * (n - i + 1) / i; // Obliczanie ze wzoru iteracyjnego
- }
- return Wynik; // Zwróć Wynik
- }
- public void bezierFunc(int degree, int pointsCounter) {
- for (double p = 0; p <= 1; p += step) {
- double xPoint = 0;
- for (int i = 0; i <= degree; ++i) {
- double Newton = countNewton(degree, i); //Obliczamy wartość współczynnika Newtona
- double ti = Math.pow(p, i); //Pierwszy element wzoru t do potęgi i-tej
- double lti = Math.pow((1 - p), (degree - i)); //Drugi element wzoru (1-t) do potęgi (ni)
- xPoint = xPoint + (Newton * ti * lti * x.get(i)); //Tworzymy składową x-ową
- }
- if (xPoint > x.get(pointsCounter - 1)) {
- break;
- }
- xPoints.add((int) xPoint);
- double yPoint = 0;
- for (int i = 0; i <= degree; ++i) {
- double yNewton = countNewton(degree, i);
- double yti = Math.pow(p, i);
- double ylti = Math.pow((1 - p), (degree - i));
- yPoint = yPoint + (yNewton * yti * ylti * y.get(i));
- }
- yPoints.add((int) yPoint);
- }
- }
- public MyPanel() {
- this.addMouseListener(this);
- this.addMouseMotionListener(this);
- pointsListX = new ArrayList<>();
- pointsListY = new ArrayList<>();
- shapes = new ArrayList<>();
- xPoints = new ArrayList<>();
- yPoints = new ArrayList<>();
- x = new ArrayList<>();
- y = new ArrayList<>();
- jb.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- needClear = true;
- try {
- bezierFunc(x.size() - 1, x.size());
- } catch (ArrayIndexOutOfBoundsException abc) {
- }
- repaint();
- }
- });
- }
- @Override
- public void paintComponent(Graphics g) {
- super.paintComponent(g);
- Graphics2D g2 = (Graphics2D) g;
- if (pointsListX.size() > 0) {
- for (int a = 0; a < shapes.size(); a++) {
- g2.fill(shapes.get(a));
- }
- }
- int[] xs, ys;
- xs = new int[xPoints.size()];
- ys = new int[yPoints.size()];
- for (int a = 0; a < xPoints.size(); a++) {
- xs[a] = xPoints.get(a);
- ys[a] = yPoints.get(a);
- }
- g.drawPolyline(xs, ys, xPoints.size());
- g.dispose();
- }
- @Override
- public void mouseClicked(MouseEvent e) {
- }
- @Override
- public void mousePressed(MouseEvent e) {
- boolean contains = false;
- for (int i = 0; i < shapes.size(); i++) {
- if (shapes.get(i).intersects(e.getX(), e.getY(), 5, 5)) {
- contains = true;
- pos = i;
- return;
- }
- }
- if (!contains) {
- if (needClear) {
- xPoints.clear();
- yPoints.clear();
- pointsListX.clear();
- pointsListY.clear();
- x.clear();
- y.clear();
- shapes.clear();
- needClear = false;
- }
- x.add(e.getX());
- y.add(e.getY());
- pointsListX.add(e.getX());
- pointsListY.add(e.getY());
- Rectangle2D.Double rec = new Rectangle2D.Double(e.getX(), e.getY(), 10, 10);
- shapes.add(rec);
- repaint();
- }
- }
- @Override
- public void mouseReleased(MouseEvent e) {
- pos = -1;
- }
- @Override
- public void mouseEntered(MouseEvent e) {
- setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
- }
- @Override
- public void mouseExited(MouseEvent e) {
- }
- @Override
- public void mouseDragged(MouseEvent e) {
- if (pos == -1) {
- return;
- }
- shapes.get(pos).setFrame(e.getX(), e.getY(), shapes.get(pos).getWidth(), shapes.get(pos).getHeight());
- x.set(pos, e.getX());
- y.set(pos, e.getY());
- try {
- xPoints.clear();
- yPoints.clear();
- bezierFunc(x.size() - 1, x.size());
- } catch (ArrayIndexOutOfBoundsException abc) {
- }
- repaint();
- }
- @Override
- public void mouseMoved(MouseEvent e) {
- }
- }
- public class Zad6 {
- public static int value;
- static JButton jb;
- JFrame jf;
- static JPanel jp, container, container2;
- JFileChooser fc;
- BufferedImage bf, bf2;
- Image img;
- public Zad6() {
- value = 0;
- fc = new JFileChooser();
- jf = new JFrame("Bezier");
- jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- jf.setSize(new Dimension(800, 600));
- jb = new JButton("Draw!");
- jp = new JPanel();
- container = new MyPanel();
- container.setPreferredSize(new Dimension(500, 500));
- container.setBackground(Color.white);
- jp.setPreferredSize(new Dimension(800, 600));
- jp.setLayout(new FlowLayout());
- jf.add(jp);
- jp.add(container);
- jp.add(jb);
- jf.pack();
- jf.setVisible(true);
- }
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) {
- new Zad6();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement