Mathematica и MouseListener — разработка интерактивной графики с помощью Mma

#wolfram-mathematica

#wolfram-mathematica

Вопрос:

Я хочу добавить интерактивности в 3D-графику Mathematica, отличную от Manipulate, которая классная, но имеет свои ограничения. Подумайте о четвертом примере демонстрации задачи о четырех кубах в Mathematica, щелчок по одному из кубов приводит к вращению куба.

Вопросы.

  1. Возможно ли перехватить MouseEvents в Mathematica graphics (например, с использованием класса Java или иным образом?)

  2. Или рекомендуется использовать Java, а затем вызывать Mathematica из Java?

  3. Или (я надеюсь, что нет) разработка интерактивных графических программ выходит за рамки того, что нужно делать с Mathematica?

Ответ №1:

EventHandler можно использовать для отслеживания различных событий мыши (движение мыши вверх, мыши вниз, щелчок мыши, перетаскивание мыши). Используйте MousePosition для добавления некоторого интеллекта.

Пример:

 DynamicModule[{col1 = Green, col2 = Blue}, Graphics[
  {
   EventHandler[
    Dynamic[{col1, Disk[]}, 
     ImageSize -> 
      Tiny], {"MouseClicked" :> (col1 = 
        col1 /. {Red -> Green, Green -> Red})}],
   EventHandler[
    Dynamic[{col2, Disk[{1, 1}]}, 
     ImageSize -> 
      Tiny], {"MouseClicked" :> (col2 = 
        col2 /. {Blue -> Yellow, Yellow -> Blue})}]
   }
  ]
 ]
  

введите описание изображения здесь

На кружочки можно нажимать независимо. Действие определяется для каждого объекта отдельно.

Удивительно, но это работает даже для 3D-графики:

 DynamicModule[{col1 = Green, col2 = Blue}, 
 Graphics3D[
  {
   EventHandler[
    Dynamic[{col1, Sphere[]}, 
     ImageSize -> 
      Tiny], {"MouseClicked" :> (col1 = 
        col1 /. {Red -> Green, Green -> Red})}], 
   EventHandler[
    Dynamic[{col2, Sphere[{1, 1, 1}]}, 
     ImageSize -> 
      Tiny], {"MouseClicked" :> (col2 = 
        col2 /. {Blue -> Yellow, Yellow -> Blue})}]
   }
  ]
 ]
  

введите описание изображения здесь

Комментарии:

1. @ndroock1 Спасибо, что приняли мой ответ. В следующий раз вы могли бы подождать немного дольше, чтобы получить больше ответов.

2. Сэр, я уже голосовал за это, но я бы проголосовал еще раз за обновление. Я никогда не видел такого раньше, с возможностью поворота и все такое. 🙂

3. Почему кончик мыши в случае 3D не принимает форму маленькой стрелки, как можно было бы ожидать при нажатии на объекты? в 2D примере, показанном выше, всплывающая подсказка в конце мыши на экране представляет собой маленькую стрелку, но не в 3D случае. Я думаю, это немного сбивает с толку пользователя.

4. @Nasser, я думаю, никто не идеален.

5. @Sjoerd, приятно видеть, что Mathematica все еще временами поражает тебя.