2016-03-12 2 views
0

Я использую встроенную функцию MATLAB getpts, чтобы пользователь мог нанести очки на фигуру, затем примените кривую Безье в этих точках. Проблема в том, что когда пользователь щелкает в первый раз, то место, где сначала щелкнули мышь, не совпадает с точкой, отображаемой getpts. В чем проблема?Захват местоположений щелчка мыши в matlab

На этом изображении вы можете увидеть красную звезду для реального места нажатой мыши, а на втором изображении вы можете увидеть точку результата после нажатия!

enter image description here enter image description here

+1

Покажите нам код, который вы написали. Мы не знаем, в чем проблема, если мы не увидим, что вы написали. – rayryeng

+0

Я обновил сообщение с двумя картинами, которые вы можете видеть, что –

+0

Эти изображения не показывают, какие getpts дают вам ...... –

ответ

2

Вопрос, который вы описываете, потому что у вас есть automatic resizing of the axes включен (axis auto, который по умолчанию). Когда вы сначала показываете axes, xrange равен [0, 1], а yrange - [0, 1]. Как только вы создадите что-то, оси уменьшают размер, чтобы автоматически соответствовать новым данным.

Так что если мы посмотрим, откуда вы на первый взгляд, это нижний левый угол ваших осей.

Теперь посмотрите на координаты x, y, которые вы рисуете, и которые были возвращены getpts. Если вы считаете, что ограничения по осям равны [0,1] для x и [0,1] для y, тогда вы поймете, что возвращенные координаты x, y были в нижнем левом углу точно, где находится ваша звезда.

Вопрос заключается в том, что как только вы построить эту точку plot(x,y), пределы осей сдвиг поместить эту новую точку в центре осей (обратите внимание на оси х и у границы на рисунке вы публикуемый) , В результате, появляется, как будто это не в том месте, когда на самом деле это правильное место, и вид изменился. Вы можете наблюдать, как это изменение в осях ограничивает себя, наблюдая за xticklabels и yticklabels, когда вы строите новую точку.

Самый простой способ исправить это (и убедиться, что это на самом деле происходит) заключается в использовании команды axis для отключения автоматического изменения размеров осей до вызова getpts.

axis manual 

После этого x и y limits осей будут изменены только если вручную изменить их, и вы не должны иметь никаких больше проблем, как тот, который вы описали.

Весь код, который должен работать.

fig = figure(); 
hax = axes('Parent', fig); 
axis(hax, 'manual') 
[x,y] = getpts(); 
+0

Я попытался сделать это >> провести на >> ось ([0 10 0 10]) >> ось руководство >> [x, y] = getpts (axes) , но это та же проблема, хорошо, диапазон осей изменен, но проблема с первоначальным щелчком одинакова! –

+0

@AlaaKhaled, пожалуйста, запустите последнюю часть моего сообщения, которую я только что обновил. У вас не должно быть проблем с этим. – Suever

+0

Спасибо, он работает очень хорошо :) –

1

вы можете использовать CurrentPoint свойство фигуры или оси делать то, что вы хотите. в осях объект: Местоположение последнего щелчка мыши, указанного как массив 2 на 3 в системе координат осей. Свойство содержит координаты двух точек, определяемых местоположением указателя при последнем щелчке мыши, относительно запрошенных осей.

Если щелчок находится внутри осей в ортогональной проекции, то две точки лежат на линии, перпендикулярной плоскости экрана и которая проходит через указатель. Это верно как для двухмерных, так и для трехмерных представлений.

3-D координаты - это точки в системе координат осей, где эта линия пересекает переднюю и заднюю поверхности объема осей (которая определяется осями x, y и z пределов).

Возвращенный матрица имеет вид:

[xfront yfront zfront 
xback yback zback] 

Первая строка определяет точку ближайшей к позиции камеры. Вторая строка указала точку, наиболее удаленную от положения камеры.

Если щелчок находится за пределами осей в ортогональной проекции, но в пределах фигуры, возвращенные значения:

Back point - точка в плоскости мишени камеры (которая является перпендикулярной к оси просмотра).

Front point - Точка в плоскости положения камеры (которая перпендикулярна оси обзора).

Эти точки лежат на линии, проходящей через указатель и перпендикулярной объектам камеры и камерам.

Значения текущей точки при использовании перспективной проекции могут отличаться от одной и той же точки в орфографической проекции, поскольку форма объема осей может быть разной.

Щелчок вне объема осей в перспективной проекции всегда возвращает переднюю точку в качестве текущего положения камеры. Только задняя точка обновляется с координатами точки, лежащей на линии, проходящей от положения камеры через указатель и пересекающей цель камеры в этой точке.

и для фигурного объекта: Расположение последней кнопки на этой фигуре, возвращенной в виде двухэлементного вектора. Значение свойства измеряется из нижнего левого угла окна рисунка, в единицах, определяемых свойством единиц. MATLAB обновляет это свойство всякий раз, когда пользователь нажимает кнопку мыши, пока указатель находится в окне рисунка.

Если пользователь выбирает точку на рисунке, и вы используете значения, возвращаемые свойством CurrentPoint, чтобы построить эту точку, могут быть различия в позиции из-за ошибок округления.

, например

a=figure 
plot(1:100) 
location=a.CurrentPoint 
+0

Это не касается вопроса пользователя вообще.Он не спрашивает *, как * получить текущий момент, а скорее, почему встроенные 'getpts' ставят точку в кажущемся некорректном месте. – Suever

+0

@ M.NozariPak Спасибо за ваш ответ. Я попробую этот вариант, чтобы увидеть все функции об этом –

Смежные вопросы