Лучший способ сделать это - использовать метод пересечений линии. Как и любой другой упомянутый пользователь, вам нужно иметь буферную область, где они щелкнули. Поэтому создайте прямоугольник, центрированный вокруг вашей координаты мыши, затем проверьте этот прямоугольник для пересечения с вашей линией. Вот некоторый код, который должен работать (у него нет компилятора или чего-то еще, но он должен быть легко модифицируемым)
// Width and height of rectangular region around mouse
// pointer to use for hit detection on lines
private static final int HIT_BOX_SIZE = 2;
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
Line2D clickedLine = getClickedLine(x, y);
}
/**
* Returns the first line in the collection of lines that
* is close enough to where the user clicked, or null if
* no such line exists
*
*/
public Line2D getClickedLine(int x, int y) {
int boxX = x - HIT_BOX_SIZE / 2;
int boxY = y - HIT_BOX_SIZE / 2;
int width = HIT_BOX_SIZE;
int height = HIT_BOX_SIZE;
for (Line2D line : getLines()) {
if (line.intersects(boxX, boxY, width, height) {
return line;
}
}
return null;
}
Если вы хотите построить всю матрицу, подумайте о том, чтобы вручную установить пределы оси Y на [0,1]. Таким образом, сюжет не будет расширен до -1e24
.
В качестве дополнительного бонуса, здесь есть версия в другой библиотеке для черчения, у которой есть точки, закрашенные i
.
Я считаю, что ваш код верен, что происходит, когда время превышает 4, итерации часто нестабильны и собираются в -infinity. Это большое изменение в значении y сжимает масштаб и делает график похожим на плоскую линию.
Отрезание хвостовой части матрицы делает очень интересный сюжет:
plot(binded[-which(binded[,2]<0),], pch=".")