我想用Java创建一个简单的Paint

问题描述 投票:0回答:1

我想修改程序,将构成字母笔画的一系列点与直线连接起来,以便可以绘制单词,但我真的不知道如何做到这一点,所以我想要一些参考。我尝试使用drawLine绘制它们,但这不是我真正想要的。

这是我的代码:

package tool;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JPanel;

class Point {
    int x, y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

}

public class MyPaintApp extends JFrame {
    int x, y;
    Vector<Point> list = new Vector<>();

    class MyPanel extends JPanel {
        public MyPanel() {
            addMouseMotionListener(new MouseMotionAdapter() {
                public void mouseDragged(MouseEvent event) {
                    x = event.getX();
                    y = event.getY();
                    list.add(new Point(x, y));
                    repaint();
                }
            });
        }

        public void paintComponent(Graphics g) {

            super.paintComponent(g);
            for (Point p : list)
                g.fillOval(p.x, p.y, 4, 4);
        }
    }

    public MyPaintApp() {
        setSize(600, 450);
        setLocation(400, 0);
        setTitle("My Paint");
        add(new MyPanel());
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JPanel;

class Point {
    int x, y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

}

public class MyPaintApp extends JFrame {
    int x, y;
    Vector<Point> list = new Vector<>();
    Vector<Vector<Point>> list1 = new Vector<>();

    class MyPanel extends JPanel {
        public MyPanel() {
            addMouseMotionListener(new MouseMotionAdapter() {
                public void mouseDragged(MouseEvent event) {
                    x = event.getX();
                    y = event.getY();
                    list.add(new Point(x, y));
                    repaint();
                }
            });
        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            for (int i = 0; i < list.size() - 1; i++) {
                Point p1 = list.get(i);
                Point p2 = list.get(i + 1);
                g.drawLine(p1.x, p1.y, p2.x, p2.y);  
            }
        }
    }

    public MyPaintApp() {
        setSize(600, 450);
        setLocation(400, 0);
        setTitle("My Paint");
        add(new MyPanel());
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
java swing paint paintcomponent
1个回答
0
投票

使用

drawLine
方法绝对是正确的解决方案,但我们需要以非常具体的方式使用它。

就像你说的,如果我们只是天真地使用

drawLine
,那么单词就形成了,就像我们想要的那样。然而,我们最终得到了“类似草书”的单词——第一个字符的末尾用一条线连接到第二个字符的开头。

解决这个问题的“正确”解决方案非常复杂,需要做很多非常痛苦和困难的数学运算。但简化版本可能是这样的。

首先检查您的

Vector
,并找到每个连续点之间的平均距离。一旦你有了这个平均距离,你就可以说
if the distance between point a and point b is greater than the average distance, then a is most likely the end of a character, and b is most likely the start of a character. Therefore, don't draw a line, because we don't want cursive-like words

© www.soinside.com 2019 - 2024. All rights reserved.