Я хотел бы сделать очень простое приложение, которое при инициализации приложения рисуется прямой статической линией, а затем дает пользователю возможность нарисовать другую линию (пользователь попытается следовать первой строке) и в конце вычислить, какое было отклонение или разница между этими двумя строками.
Мне приходит в голову сначала сохранить все точки (координаты) X1, Y1 строки A и то же самое для строки B в отдельных массивах и перебрать оба массива и вычислить разницу, используя формулу Пифагора из https://www.mathplanet.com/education/algebra-2/conic-sections/distance-between-two-points-and-the-midpoint
Моя текущая реализация такова:
import java.awt.*;
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.util.ArrayList;
import javax.swing.*;
public class DrawLine extends JPanel implements ActionListener, MouseListener, MouseMotionListener {
private static final long serialVersionUID = 1L;
LinePoint[] lineA = new LinePoint[300];
LinePoint[] lineB = new LinePoint[300];
public void paintComponent(Graphics g) {
for(int i = 0; i < lineA.length; i++) {
lineA[i] = new LinePoint();
}
int initialLocationPoint = 10;
for(int i = 0; i<lineA.length; i++) {
lineA[i].x = initialLocationPoint;
lineA[i].y = 100;
g.drawOval((int)lineA[i].x, (int)lineA[i].y, 1, 1);
initialLocationPoint +=1;
}
}
public double calculateDifference() {
double deviation = 0.0;
double deviationPerPoint = 0.0;
for (int i = 0; i < lineA.length; i++) {
deviationPerPoint = Math.sqrt( Math.pow(2, (lineB[i].x - lineA[i].x)) + Math.pow(2,(lineB[i].y - lineA[i].y)));
}
deviation = deviation +deviationPerPoint;
return deviation;
}
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("Draw Line");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBackground(Color.white);
frame.setSize(400, 400);
DrawLine panel = new DrawLine();
frame.add(panel);
frame.setVisible(true);
}
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
System.out.println("mouse clicked.");
LinePoint lp = new LinePoint();
lp.x = arg0.getX();
lp.y = arg0.getY();
lineB[0] = lp; // 0 should replace with some variable so it does not override first element
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
System.out.println("mouse entered.");
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
System.out.println("mouse pressed.");
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseDragged(MouseEvent arg0) {
// TODO Auto-generated method stub
System.out.println("mouse drawged.");
}
@Override
public void mouseMoved(MouseEvent arg0) {
// TODO Auto-generated method stub
System.out.println("mouse moved.");
}
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("action performed.");
}
}
class LinePoint
{
double x;
double y;
}
Ну, у меня есть проблема с mouseListener, который не фиксирует щелчок мышью или перетаскивание или что-то еще.
Кто-нибудь может помочь мне выполнить эту задачу?
его Java. вы должны пометить только то, с чем он связан.
@Fildor на самом деле не имеет значения язык, так как это чистое ООП. но да, я могу удалить C#
Что ж, это не имеет значения для ты, но это не очень полезно, если вопрос, который, по-видимому, касается Java, получает ответы на C#. Видите ли, SO хочет предоставить качественные ответы на конкретные вопросы, которые не только помогут OP, но и будут полезны людям, имеющим ту же проблему. Перенос ответа Java на вопрос Java на другой язык может быть возможен, но тот, кто ищет ответ Java, вероятно, испугается, найдя ответы на C#. Это все равно, что искать в Google фотографии немецких машин и представлять Хонды.
@Fildor, ты прав, сэр, я не обратил на это слишком много внимания, но, думаю, мне следовало!
Не о чем сожалеть. Просто хотел объяснить, почему всем полезно придерживаться одного языка. Не хотел разглагольствовать.
Вы никогда не регистрируете слушателя. Недостаточно реализовать прослушиватель, вам также необходимо вызвать связанный метод add…Listener на компоненте, от которого вы хотите получать события. Тем не менее, позволять самому компоненту реализовывать интерфейс слушателя - это плохой стиль кодирования. И не изобретайте велосипед. Вместо создания класса LinePoint вы можете использовать Point2D.Double.




Почему это помечено как C#? Который из них? Java или C# - выберите один.