@@ -68,14 +68,15 @@ public LineSegment(SimplePoint fromPoint, SimplePoint toPoint,
6868
6969 /**
7070 * Constructs a line segment with default width and default height.
71+ *
7172 * @param fromPoint
7273 * @param toPoint
7374 */
7475 public LineSegment (SimplePoint fromPoint , SimplePoint toPoint ) {
75- this (fromPoint , toPoint ,
76- Defaults . sharedDefaults (). defaultColorForLineSegment (),
77- Defaults . sharedDefaults (). defaultColorForSelectedLineSegment (),
78- Defaults .sharedDefaults ().defaultStrokeWidthForLineSegment ());
76+ this (fromPoint , toPoint , Defaults . sharedDefaults ()
77+ . defaultColorForLineSegment (), Defaults . sharedDefaults ()
78+ . defaultColorForSelectedLineSegment (), Defaults
79+ .sharedDefaults ().defaultStrokeWidthForLineSegment ());
7980
8081 }
8182
@@ -102,22 +103,20 @@ public boolean contains(int x, int y) {
102103 if (fromPoint .contains (x , y ) || toPoint .contains (x , y )) {
103104 return false ;
104105 }
105- // else return the D(curPoint , fromPoint) + D(curPoint, toPoint) ==
106- // D(fromPoint, toPoint)
107- double distanceBetweenXYandFrom = Math
108- .sqrt (Math .pow (fromPoint .getX () - x , 2 )
109- + Math .pow (fromPoint .getY () - y , 2 ));
110- double distanceBetweenXYandTo = Math
111- .sqrt (Math .pow (toPoint .getX () - x , 2 )
112- + Math .pow (toPoint .getY () - y , 2 ));
113- double distanceBetweenFromAndTo = Math
114- .sqrt (Math .pow (toPoint .getX () - fromPoint .getX (), 2 )
115- + Math .pow (toPoint .getY () - fromPoint .getY (), 2 ));
116-
117- // checking delta distance
118- // Note: this calculation is only an approximation
119- if (Math .abs (distanceBetweenFromAndTo - distanceBetweenXYandFrom
120- - distanceBetweenXYandTo ) < Math .sqrt (strokeWidth )) {
106+
107+ double lineXDis = fromPoint .getX () - toPoint .getX ();
108+ double lineYDis = toPoint .getY () - fromPoint .getY ();
109+ double constantTerm = fromPoint .getY () * toPoint .getX ()
110+ - toPoint .getY () * fromPoint .getX ();
111+
112+ // Calculate point to line distance with formula.
113+ double pointToLineDis = Math
114+ .abs ((lineYDis * x + lineXDis * y + constantTerm )
115+ / Math .sqrt (Math .pow (lineYDis , 2 )
116+ + Math .pow (lineXDis , 2 )));
117+
118+ // If the point is within 3 pixels of the line, return true.
119+ if (pointToLineDis <= 3 + strokeWidth / 2 ) {
121120 return true ;
122121
123122 }
@@ -128,86 +127,98 @@ public boolean contains(int x, int y) {
128127 public void translate (int i , int j ) {
129128 super .translate (i , j );
130129 // if from and to points are not selected, translate them as well
131- if (this .fromPoint .isSelected () == false ){
130+ if (this .fromPoint .isSelected () == false ) {
132131 this .fromPoint .translate (i , j );
133132 }
134- if (this .toPoint .isSelected () == false ){
133+ if (this .toPoint .isSelected () == false ) {
135134 this .toPoint .translate (i , j );
136135 }
137136
138137 }
139-
138+
140139 @ Override
141140 public void saveToElement (Element rootElement , Document doc ) {
142141 super .saveToElement (rootElement , doc );
143-
144- //build elements
142+
143+ // build elements
145144 Element main = doc .createElement ("linesegment" );
146145
147146 Element fromPointElem = doc .createElement ("frompoint" );
148147 Element toPointElem = doc .createElement ("topoint" );
149148 Element defaultColorElem = doc .createElement ("defaultcolor" );
150149 Element selectColorElem = doc .createElement ("selectcolor" );
151150 Element strokeWidthElem = doc .createElement ("strokewidth" );
152-
153- //append relationship
151+
152+ // append relationship
154153 main .appendChild (fromPointElem );
155154 main .appendChild (toPointElem );
156155 main .appendChild (defaultColorElem );
157156 main .appendChild (selectColorElem );
158157 main .appendChild (strokeWidthElem );
159158 rootElement .appendChild (main );
160-
161- //fill data
162- fromPointElem .setAttribute ("id" , Long .toString (fromPoint .getComponentID ()));
159+
160+ // fill data
161+ fromPointElem .setAttribute ("id" ,
162+ Long .toString (fromPoint .getComponentID ()));
163163 toPointElem .setAttribute ("id" , Long .toString (toPoint .getComponentID ()));
164- XMLEncodingUtilForPaintComponents .attachRGB (defaultColor , defaultColorElem , doc );
165- XMLEncodingUtilForPaintComponents .attachRGB (selectColor , selectColorElem , doc );
166- strokeWidthElem .appendChild (doc .createTextNode (Double .toString (strokeWidth )));
167-
164+ XMLEncodingUtilForPaintComponents .attachRGB (defaultColor ,
165+ defaultColorElem , doc );
166+ XMLEncodingUtilForPaintComponents .attachRGB (selectColor ,
167+ selectColorElem , doc );
168+ strokeWidthElem .appendChild (doc .createTextNode (Double
169+ .toString (strokeWidth )));
170+
168171 }
169172
170173 /**
171174 *
172- * Recover the line segment from a element that should be operated by saveToElement
175+ * Recover the line segment from a element that should be operated by
176+ * saveToElement
173177 *
174- * The implementation searches all panel's paintcomponents to find the matching ids using PanelIO.idMapping
178+ * The implementation searches all panel's paintcomponents to find the
179+ * matching ids using PanelIO.idMapping
175180 *
176181 * @param rootElement
177182 * @param panel
178183 */
179184 public LineSegment (Element rootElement , PaintPanel panel ) {
180185 super (rootElement , panel );
181- Element main = (Element ) rootElement .getElementsByTagName ("linesegment" ).item (0 );
182- Element fromPointElement = (Element ) main .getElementsByTagName ("frompoint" ).item (0 );
183- Element toPointElem = (Element ) main .getElementsByTagName ("topoint" ).item (0 );
184- Element defaultColorElem = (Element ) main .getElementsByTagName ("defaultcolor" ).item (0 );
185- Element selectColorElem = (Element ) main .getElementsByTagName ("selectcolor" ).item (0 );
186- Element strokeWidthElem = (Element ) main .getElementsByTagName ("strokewidth" ).item (0 );
187-
188-
189- defaultColor = XMLEncodingUtilForPaintComponents .getRGB (defaultColorElem );
186+ Element main = (Element ) rootElement
187+ .getElementsByTagName ("linesegment" ).item (0 );
188+ Element fromPointElement = (Element ) main .getElementsByTagName (
189+ "frompoint" ).item (0 );
190+ Element toPointElem = (Element ) main .getElementsByTagName ("topoint" )
191+ .item (0 );
192+ Element defaultColorElem = (Element ) main .getElementsByTagName (
193+ "defaultcolor" ).item (0 );
194+ Element selectColorElem = (Element ) main .getElementsByTagName (
195+ "selectcolor" ).item (0 );
196+ Element strokeWidthElem = (Element ) main .getElementsByTagName (
197+ "strokewidth" ).item (0 );
198+
199+ defaultColor = XMLEncodingUtilForPaintComponents
200+ .getRGB (defaultColorElem );
190201 selectColor = XMLEncodingUtilForPaintComponents .getRGB (selectColorElem );
191202 strokeWidth = Double .parseDouble (strokeWidthElem .getTextContent ());
192203 stroke = new BasicStroke ((float ) strokeWidth );
193-
194- //append from and to points
195-
204+
205+ // append from and to points
206+
196207 ArrayList <PaintComponent > paintComponents = panel .getPaintComponents ();
197-
198-
199- //select only the paint components to check ID
200- long fromPointID = PanelIO .idMapping .get (Long .parseLong (fromPointElement .getAttribute ("id" )));
201- long toPointID = PanelIO .idMapping .get (Long .parseLong (toPointElem .getAttribute ("id" )));
202-
208+
209+ // select only the paint components to check ID
210+ long fromPointID = PanelIO .idMapping .get (Long
211+ .parseLong (fromPointElement .getAttribute ("id" )));
212+ long toPointID = PanelIO .idMapping .get (Long .parseLong (toPointElem
213+ .getAttribute ("id" )));
214+
203215 for (PaintComponent paintComponent : paintComponents ) {
204- if (paintComponent .getComponentID () == fromPointID ){
216+ if (paintComponent .getComponentID () == fromPointID ) {
205217 fromPoint = (SimplePoint ) paintComponent ;
206- } else if (paintComponent .getComponentID () == toPointID ){
207- toPoint = (SimplePoint ) paintComponent ;
218+ } else if (paintComponent .getComponentID () == toPointID ) {
219+ toPoint = (SimplePoint ) paintComponent ;
208220 }
209221 }
210222 }
211-
212223
213224}
0 commit comments