Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mathematica and MouseListener - developing interactive graphics with Mma

I want to add interactivity to Mathematica 3D graphics, other than with Manipulate which is cool but has its limitations. Think four example of a demo of the four cubes problem in Mathematica, a click on one of the cubes rotates a cube.

Questions.

  1. Is it possible to catch MouseEvents in Mathematica graphics ( for example with using a Java class or otherwise? )

  2. Or is the use Java then call Mathematica from Java the advised route?

  3. Or ( I hope not ) is developing interactive graphics programs beyond of what one should do with Mathematica?

like image 557
nilo de roock Avatar asked May 31 '11 15:05

nilo de roock


1 Answers

EventHandler can be used to catch various mouse events (mouse up, mouse down, mouse clicked, mouse dragged). Use MousePosition to add some intelligence.

Example:

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})}]
   }
  ]
 ]

enter image description here

The circles can be clicked independently. An action is defined for each object separately.

Amazingly, this even works for 3D Graphics:

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})}]
   }
  ]
 ]

enter image description here

like image 138
Sjoerd C. de Vries Avatar answered Oct 03 '22 16:10

Sjoerd C. de Vries