Skip to content

Commit 08602ca

Browse files
authored
Merge pull request #119 from UCSDOalads/improveLineSelectionbyTanSu
Improved line selectionby tan su Line Selection is more accurate. Line could be selected within 3 pixels
2 parents 8fc6d47 + a61a8b6 commit 08602ca

1 file changed

Lines changed: 69 additions & 58 deletions

File tree

src/paintcomponents/LineSegment.java

Lines changed: 69 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)