public void addAngle(int id, int axis, double degrees) { AffineTransform3D t = new AffineTransform3D(); t.rotate( axis, Math.toRadians( degrees ) ); angleTransforms.put( id, t.copy() ); }
@Override public void drag( final int x, final int y ) { synchronized ( affine ) { final double dX = oX - x; final double dY = oY - y; affine.set( affineDragStart ); // center shift affine.set( affine.get( 0, 3 ) - oX, 0, 3 ); affine.set( affine.get( 1, 3 ) - oY, 1, 3 ); final double v = step * speed; affine.rotate( 0, -dY * v ); affine.rotate( 1, dX * v ); // center un-shift affine.set( affine.get( 0, 3 ) + oX, 0, 3 ); affine.set( affine.get( 1, 3 ) + oY, 1, 3 ); notifyListener(); } }
/** * Rotate by d radians around axis. Keep screen coordinates ( * {@link #centerX}, {@link #centerY}) fixed. */ private void rotate( final int axisNo, final double d ) { // center shift affine.set( affine.get( 0, 3 ) - centerX, 0, 3 ); affine.set( affine.get( 1, 3 ) - centerY, 1, 3 ); // rotate affine.rotate( axisNo, d ); // center un-shift affine.set( affine.get( 0, 3 ) + centerX, 0, 3 ); affine.set( affine.get( 1, 3 ) + centerY, 1, 3 ); }
/** * Rotate by d radians around axis. Keep screen coordinates ( * {@link #centerX}, {@link #centerY}) fixed. */ private void rotate( final int axis, final double d ) { // center shift affine.set( affine.get( 0, 3 ) - centerX, 0, 3 ); affine.set( affine.get( 1, 3 ) - centerY, 1, 3 ); // rotate affine.rotate( axis, d ); // center un-shift affine.set( affine.get( 0, 3 ) + centerX, 0, 3 ); affine.set( affine.get( 1, 3 ) + centerY, 1, 3 ); }
/** * Rotate by d radians around axis. Keep screen coordinates ( * {@link #centerX}, {@link #centerY}) fixed. */ private void rotate( final int axis, final double d ) { // center shift affine.set( affine.get( 0, 3 ) - centerX, 0, 3 ); affine.set( affine.get( 1, 3 ) - centerY, 1, 3 ); // rotate affine.rotate( axis, d ); // center un-shift affine.set( affine.get( 0, 3 ) + centerX, 0, 3 ); affine.set( affine.get( 1, 3 ) + centerY, 1, 3 ); }
@Override public void scroll( final double wheelRotation, final boolean isHorizontal, final int x, final int y ) { synchronized ( affine ) { final double theta = speed * wheelRotation * Math.PI / 180.0; // center shift affine.set( affine.get( 0, 3 ) - x, 0, 3 ); affine.set( affine.get( 1, 3 ) - y, 1, 3 ); affine.rotate( 2, theta ); // center un-shift affine.set( affine.get( 0, 3 ) + x, 0, 3 ); affine.set( affine.get( 1, 3 ) + y, 1, 3 ); notifyListener(); } } }
if (rotAngleAndAxis != null) rotation.rotate( rotAngleAndAxis.getB(), rotAngleAndAxis.getA() ); vr.preconcatenateTransform( new ViewTransformAffine( "Rotation from Metadata", rotation.copy() ));