View Javadoc

1   /**********************************************
2    * Copyright (C) 2010 Lukas Laag
3    * This file is part of lib-gwt-svg.
4    * 
5    * libgwtsvg is free software: you can redistribute it and/or modify
6    * it under the terms of the GNU Lesser General Public License as published by
7    * the Free Software Foundation, either version 3 of the License, or
8    * (at your option) any later version.
9    * 
10   * libgwtsvg is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   * GNU Lesser General Public License for more details.
14   * 
15   * You should have received a copy of the GNU Lesser General Public License
16   * along with libgwtsvg.  If not, see http://www.gnu.org/licenses/
17   **********************************************/
18  /*
19   * Copyright (c) 2004 World Wide Web Consortium,
20   *
21   * (Massachusetts Institute of Technology, European Research Consortium for
22   * Informatics and Mathematics, Keio University). All Rights Reserved. This
23   * work is distributed under the W3C(r) Software License [1] in the hope that
24   * it will be useful, but WITHOUT ANY WARRANTY; without even the implied
25   * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
26   *
27   * [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
28   */
29  
30  package org.vectomatic.dom.svg;
31  
32  import com.google.gwt.core.client.JavaScriptException;
33  import com.google.gwt.core.client.JavaScriptObject;
34  
35  /**
36   * <p>Many of the SVG DOM interfaces refer to objects of class {@link org.vectomatic.dom.svg.OMSVGPoint}.
37   * An {@link org.vectomatic.dom.svg.OMSVGPoint} is an (x, y) coordinate pair.
38   * When used in matrix operations, an {@link org.vectomatic.dom.svg.OMSVGPoint}
39   * is treated as a vector of the form:</p> <pre>
40   * [x]
41   * [y]
42   * [1]</pre> <p>If an {@link org.vectomatic.dom.svg.OMSVGRect} object is designated
43   * as <em>read only</em>, then attempting to assign to one of its attributes
44   * will result in an exception being thrown.</p>
45   */
46  public class OMSVGPoint extends JavaScriptObject {
47    protected OMSVGPoint() {
48    }
49  
50    // Implementation of the svg::SVGPoint W3C IDL interface
51    /**
52     * The x coordinate.
53     */
54    public final native float getX() /*-{
55      return this.x;
56    }-*/;
57    /**
58     * The x coordinate.
59     * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised if the   {@link
60     * org.vectomatic.dom.svg.OMSVGPoint} object is read only, or corresponds
61     * to a DOM   attribute that is read only.
62     */
63    public final native void setX(float value) throws JavaScriptException /*-{
64      this.x = value;
65    }-*/;
66    /**
67     * The y coordinate.
68     */
69    public final native float getY() /*-{
70      return this.y;
71    }-*/;
72    /**
73     * The y coordinate.
74     * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised if the   {@link
75     * org.vectomatic.dom.svg.OMSVGPoint} object is read only, or corresponds
76     * to a DOM   attribute that is read only.
77     */
78    public final native void setY(float value) throws JavaScriptException /*-{
79      this.y = value;
80    }-*/;
81    /**
82     * <p>Applies a 2x3 matrix transformation on this {@link org.vectomatic.dom.svg.OMSVGPoint}
83     * object and returns a new, transformed {@link org.vectomatic.dom.svg.OMSVGPoint}
84     * object:</p> <pre>newpoint = matrix thispoint</pre>
85     * @param matrix The matrix which is to be applied to this {@link org.vectomatic.dom.svg.OMSVGPoint}
86     * object.
87     * @return A new {@link org.vectomatic.dom.svg.OMSVGPoint} object.
88     */
89    public final native OMSVGPoint matrixTransform(OMSVGMatrix matrix) /*-{
90      return this.matrixTransform(matrix);
91    }-*/;
92  
93    // Helper methods
94    /**
95     * Returns a textual description of the point for debugging purposes.
96     * @return a textual description of the point.
97     */
98    public final String getDescription() {
99  	  StringBuilder builder = new StringBuilder("[");
100 	  builder.append(getX());
101 	  builder.append(" ");
102 	  builder.append(getY());
103 	  builder.append("]");
104 	  return builder.toString();
105   }
106 
107   /**
108    * Adds the specified point to this point. The points
109    * are treated by this method as 2D vectors.
110    * @param p the point to add. 
111    * @return this point.
112    */
113   public final OMSVGPoint add(OMSVGPoint p) {
114 	return add(p, this);
115   }
116   /**
117    * Adds the specified point to this point and puts the
118    * result in the specified destination point. The points
119    * are treated by this method as 2D vectors.
120    * @param p the point to add. 
121    * @param destination the destination point.
122    * @return the destination point.
123    */
124   public final native OMSVGPoint add(OMSVGPoint p, OMSVGPoint destination) /*-{
125     destination.x = this.x + p.x;
126     destination.y = this.y + p.y;
127 	return destination;
128   }-*/;
129   /**
130    * Substracts the specified point from this point. The points
131    * are treated by this method as 2D vectors.
132    * @param p the point to substract. 
133    * @return this point.
134    */
135   public final OMSVGPoint substract(OMSVGPoint p) {
136 	return substract(p, this);
137   }
138   /**
139    * Substracts the specified point to this point and puts the
140    * result in the specified destination point. The points
141    * are treated by this method as 2D vectors.
142    * @param p the point to substract. 
143    * @param destination the destination point.
144    * @return the destination point.
145    */
146   public final native OMSVGPoint substract(OMSVGPoint p, OMSVGPoint destination) /*-{
147     destination.x = this.x - p.x;
148     destination.y = this.y - p.y;
149 	return destination;
150   }-*/;
151   /**
152    * Scales this point by the specified factor. The point
153    * is treated by this method as a 2D vector.
154    * @param f scale factor. 
155    * @return this point.
156    */
157   public final OMSVGPoint scale(float f) {
158 	return scale(f, this);
159   }
160   /**
161    * Scales this point by the specified factor and puts the
162    * result in the specified destination point. The points
163    * are treated by this method as 2D vectors.
164    * @param f scale factor. 
165    * @param destination the destination point.
166    * @return the destination point.
167    */
168   public final native OMSVGPoint scale(float f, OMSVGPoint destination) /*-{
169     destination.x = this.x * f;
170     destination.y = this.y * f;
171 	return destination;
172   }-*/;
173   /**
174    * Copies this point to the specified destination point.
175    * @param destination the destination point.
176    * @return the destination point.
177    */
178   public final native OMSVGPoint assignTo(OMSVGPoint destination) /*-{
179     destination.x = this.x;
180     destination.y = this.y;
181 	return destination;
182   }-*/;
183   
184   /**
185    * Multiplies this point by the specified point. The points
186    * are treated by this method as 2D vectors.
187    * @param p the point to multiply by. 
188    * @return this point.
189    */
190   public final OMSVGPoint product(OMSVGPoint p) {
191 	return product(p, this);
192   }
193   /**
194    * Multiplies this point by the specified point and puts the
195    * result in the specified destination point. The points
196    * are treated by this method as 2D vectors.
197    * @param p the point to multiply by. 
198    * @param destination the destination point.
199    * @return the destination point.
200    */
201   public final native OMSVGPoint product(OMSVGPoint p, OMSVGPoint destination) /*-{
202     destination.x = this.x * p.x;
203     destination.y = this.y * p.y;
204 	return destination;
205   }-*/;
206   /**
207    * Returns the dot product of this point and the specified point. The points
208    * are treated by this method as 2D vectors.
209    * @param p the second factor of the dot product.
210    * @return the dot product of this point and the specified point
211    */
212   public final native float dotProduct(OMSVGPoint p) /*-{
213     return this.x * p.x + this.y * p.y;
214   }-*/;
215   /**
216    * Returns the cross product of this point and the specified point. The points
217    * are treated by this method as 2D vectors.
218    * @param p the second factor of the cross product.
219    * @return the cross product of this point and the specified point
220    */
221   public final native float crossProduct(OMSVGPoint p) /*-{
222     return this.x * p.y - this.y * p.x;
223   }-*/;
224   /**
225    * Applies the <code>Math.round()</code> to the coordinated of this point.
226    * @return this point.
227    */
228   public final OMSVGPoint round() {
229 	return round(this);
230   }
231   /**
232    * Applies the <code>Math.round()</code> to the coordinated of this 
233    * point and puts the result in the specified destination point.
234    * @param destination the destination point.
235    * @return the destination point.
236    */
237   public final OMSVGPoint round(OMSVGPoint destination) {
238     destination.setX(Math.round(getX()));
239     destination.setY(Math.round(getY()));
240 	return destination;
241   }
242   /**
243    * Applies the <code>Math.floor()</code> to the coordinated of this point.
244    * @return this point.
245    */
246   public final OMSVGPoint floor() {
247 	return floor(this);
248   }
249   /**
250    * Applies the <code>Math.floor()</code> to the coordinated of this 
251    * point and puts the result in the specified destination point.
252    * @param destination the destination point.
253    * @return the destination point.
254    */
255   public final OMSVGPoint floor(OMSVGPoint destination) {
256     destination.setX((float) Math.floor(getX()));
257     destination.setY((float) Math.floor(getY()));
258 	return destination;
259   }
260   /**
261    * Returns the length of this point, treating the point as a 2D vector.
262    * @return the length of this point
263    */
264   public final native float length() /*-{
265     return Math.sqrt(this.x * this.x + this.y * this.y);
266   }-*/;
267   /**
268    * Returns the squared length of this point, treating the point as a 2D vector.
269    * @return the squared length of this point
270    */
271   public final native float length2() /*-{
272     return this.x * this.x + this.y * this.y;
273   }-*/;
274   /**
275    * Returns the euclidian distance from this point to specified point.
276    * @param p the point used to measure the distance
277    * @return the euclidian distance from this point to specified point
278    */
279   public final native float distance(OMSVGPoint p) /*-{
280     return Math.sqrt((this.x - p.x) * (this.x - p.x) + (this.y - p.y) * (this.y - p.y));
281   }-*/;
282   /**
283    * Returns the squared euclidian distance from this point to specified point.
284    * @param p the point used to measure the distance
285    * @return the squared euclidian distance from this point to specified point
286    */
287   public final native float distance2(OMSVGPoint p) /*-{
288     return (this.x - p.x) * (this.x - p.x) + (this.y - p.y) * (this.y - p.y);
289   }-*/;
290 }