Plug rubberbox function :
[scilab.git] / scilab / modules / renderer / src / java / org / scilab / modules / renderer / JoGLView / interaction / util / PointBComputer.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009-2012 - DIGITEO - Pierre Lando
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  */
11
12 package org.scilab.modules.renderer.JoGLView.interaction.util;
13
14 import org.scilab.forge.scirenderer.tranformations.Vector3d;
15 import org.scilab.modules.graphic_objects.axes.Axes;
16
17 import java.awt.Point;
18
19 /**
20  * @author Pierre Lando
21  */
22 public class PointBComputer extends AbstractPointComputer implements PointComputer {
23
24     /** First axis index */
25     private final int firstAxisIndex;
26
27     private final boolean is2D;
28
29     private Vector3d firstPosition;
30     private Vector3d secondPosition;
31
32     /**
33      * Constructor.
34      *
35      * @param axes current Axes.
36      * @param pointAComputer the first point computer.
37      * @param point the clicked point in AWT coordinate.
38      */
39     public PointBComputer(Axes axes, PointComputer pointAComputer, Point point) {
40         super(axes, point);
41
42         firstAxisIndex = pointAComputer.getFirstAxisIndex();
43         if (firstAxisIndex != -1) {
44             double value = pointAComputer.getFirstPosition().getData()[firstAxisIndex];
45             double lambda = computeLambda(value, firstAxisIndex);
46             Vector3d coordinate = computeCoordinate(lambda, value, firstAxisIndex);
47
48             firstPosition = pointAComputer.getFirstPosition();
49             secondPosition = clamp(coordinate);
50
51             if (check2D()) {
52                 double[] data = firstPosition.getData();
53                 data[firstAxisIndex] = -Double.MAX_VALUE;
54                 firstPosition = clamp(new Vector3d(data));
55
56                 data = secondPosition.getData();
57                 data[firstAxisIndex] = Double.MAX_VALUE;
58                 secondPosition = clamp(new Vector3d(data));
59
60                 is2D = true;
61             } else {
62                 is2D = false;
63             }
64
65         } else {
66             is2D = false;
67             firstPosition = null;
68             secondPosition = null;
69         }
70     }
71
72     /**
73      * Check if the current axes disposition lead to a 2D zoom.
74      * @return true if the current axes disposition lead to a 2D zoom.
75      */
76     private boolean check2D() {
77         boolean r = true;
78         Double[] bounds = getAxes().getDataBounds();
79         float[] middle = new float[] {
80                 (float) (bounds[0] + bounds[1]) / 2f,
81                 (float) (bounds[2] + bounds[3]) / 2f,
82                 (float) (bounds[4] + bounds[5]) / 2f
83         };
84
85         for (int i = 0; i < AXIS_NUMBER; i++) {
86             if (i != firstAxisIndex) {
87                 double lambda = computeLambda(middle[i], i);
88                 r &= !((lambda >= 0) && (lambda <= 1));
89             }
90         }
91
92         return r;
93     }
94
95     @Override
96     public final boolean isValid() {
97         return secondPosition != null;
98     }
99
100     /**
101      * 2D status getter.
102      * @return true if the zoom is in 2D mode.
103      */
104     public final boolean is2D() {
105         return is2D;
106     }
107
108     @Override
109     public final int getFirstAxisIndex() {
110         return firstAxisIndex;
111     }
112
113     @Override
114     public final Vector3d getFirstPosition() {
115         return firstPosition;
116     }
117
118     @Override
119     public final Vector3d getSecondPosition() {
120         return secondPosition;
121     }
122 }