2013-06-18 3 views
3

Итак, у меня есть 3 строки (технические патчи), которые имеют прозрачность. Эти строки были сгенерированы с помощью исправления FEX. Запись FEX отлично работает, делая патчи похожими на строки, добавляя NaN к концу данных, чтобы он не создавал большой черный патч между конечными точками моей линии.В MATLAB невозможны прозрачные прозрачные линии?

Моих строки выглядят так

__  __ 
    \ /
_ \ /_ 
\ \__//
    \______/ 

Патч проходит от левого конца точки к правой конечной точке по прямой линии в верхнем, а затем следует линии на дне. Фактический патч скрыт (не нарисован), хотя все, что видит пользователь, это строки

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

Я подумал о нескольких обходных решениях и надеялся, что вы, ребята, можете указать на недостатки или добавить идеи, которые я, возможно, пропустил с помощью своих обходных решений.

Обход # 1

В идеале я хотел бы создать реальную линию (серия линии OBJ.) По сравнению с прозрачными линиями. Я бы повернул hittest на патчах, и я сделаю фактическую линию невидимой, но поверните hittest дальше. Проблема, на которой я на 99% уверен, что если visibilty выключен, вы не можете щелкнуть объект. Если кто-то имеет дело с этой проблемой (документально или иначе), это было бы здорово.

Обход # 2

Включите patchline Трассировка свойство выключено. Сделайте mock line objs. которые следуют за кусочками лазейки. и имеют ширину линии очень очень маленькую, чтобы сделать линию идеально красивой и невидимой, и вместо этого кликнуть на эти строки попали в эти строки. Кто-нибудь раньше пробовал что-то подобное? (Я на работе и не попробовать его сейчас)

Обход # 3

ВНИМАНИЕ, ЧТО Я ДЕЙСТВИТЕЛЬНО НЕ ХОЧУ СДЕЛАТЬ ЭТО Это, конечно, можно отключить HitTest для патча/линии Objs и используйте осей buttondown, чтобы выяснить, какой патч obj (только часть строки) был ближе всего.

Еще раз, любое понимание будет высоко ценятся как о моей возможной обходной работе, ситуация в целом и т.д.

Спасибо, Shaun

+0

Создайте два пятна, один для верхней линии и один для нижней один? Если у меня что-то не хватает, предоставьте код и ссылку на отправку FEX. – Oleg

+0

Вот запись FEX: http://www.mathworks.com/matlabcentral/fileexchange/36953-patchline/content/patchline.m И проблема в том, что у меня есть несколько патчей, и они частично перекрываются в некоторых случаях. .. Хотя я задаюсь вопросом, могу ли я привести его к вершине больше, чем другие. – Shaun314

ответ

0

Проблема может быть проиллюстрирована с двумя линейными толщиной пластырей, один из которых не параллельны осям:

patch([2 8 8],[5 10 10],'w','EdgeColor','b','EdgeAlpha',0.4,'LineWidth',3) 
patch([2 8 8],[4 4 4],'w','EdgeColor','r','EdgeAlpha',0.4,'LineWidth',3) 
xlim([0 10]) 
ylim([3 11]) 

Вы не можете выбрать, но те линии, которые параллельны одной из осей.

  • Обход №1: невозможно.
  • Обходное решение № 2: вполне понятно, зачем вам нужны прозрачные линии?
  • Обход # 3: единственный путь ...

Обход альтернатива: представить TMW технического запрос на улучшение кликабельности патчей.

+0

В MATLAB нет ни одного способа;) Я выяснил, как это сделать (см. Мой ответ), но я принял ваш спасибо, а также потому, что я не могу принять свои собственные в течение двух дней haha ​​ – Shaun314

+0

@ Shaun314 Я, вероятно, еще не полностью понял вашу проблему, тогда ... – Oleg

+0

Если бы вы посмотрели запись FEX, вы увидите, что она отсутствует означает патч в традиционном смысле, он по внешнему виду точно такой же, как объект линейной серии (с возможностью прозрачности), но за кулисами он по-прежнему является полным объектом патча. Эта последняя часть была проблемой, потому что, хотя она выглядит как линия, buttondown все еще попадает в реальный за кулисами patch – Shaun314

0

Олег, ваш первоначальный пост каким-то образом вдохновил меня придумать мое изящное решение. (Не спрашивайте меня, как, просто примите мое «спасибо» haha)

Элегантное решение моей проблемы потребовало от меня выйти за пределы свойств патча и перейти к порядку дочернего порядка осей. В предположении, что ни одна из линий не будет пересекать друг друга, я смог построить их в порядке, где нижний был первым, затем вторым самым низким и т. Д., Пока я не добрался до вершины (фактически перестраивая порядок детей).

Если кто-то еще наткнулся на это, то, что вы можете сделать (если ваши линии не пересекаются), состоит в том, чтобы отсортировать первый Y (или любые значения), чтобы перейти от самого низкого к самому высокому (в данном случае) и убедитесь, что ваша функция сортировки возвращает указатели.

У меня нет моего компьютера передо мной, но то, что вы в конечном итоге делаете, эффективно делает непрерывный цикл, обводя указатели.

что-то вроде:

for i=[6 2 5 4 1 3] 

    plot(X(:,i),Y(:,i)) 

end 

Где шестой столбец был мой низкий данные, второй столбец был вторым самым низким на участке, и т.д.

+1

Я не полностью понимаю проблему здесь, но вы можете манипулировать Z-порядком, используя функцию 'uistack' – Amro

+0

Я думаю, что это могло бы помочь, спасибо, что указали это! – Shaun314

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