我想修改程序,将构成字母笔画的一系列点与直线连接起来,以便可以绘制单词,但我真的不知道如何做到这一点,所以我想要一些参考。我尝试使用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);
}
}
使用
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
。