Solved

Line Thing

Posted on 2004-09-26
43
168 Views
Last Modified: 2010-03-31
How can I make sure if a user clicked point is on a line? I have two points and successfully drawn a line using drawLine(x1,y1,x2,y2) between p1 and p2. But I need to accept a point clicked by a user and it has to be on the line, thus any click out of the line will do nth. Any suggestion?


0
Comment
Question by:jtcy
  • 21
  • 19
43 Comments
 
LVL 86

Expert Comment

by:CEHJ
ID: 12154499
If the line perfectly horizontal?
0
 

Author Comment

by:jtcy
ID: 12154508
no, the line can be at any slope.
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12154515
No matter. When you draw the line

Line2DDouble line = Line2DDouble(x1, y1, x2, y2);
g2d.draw(line);

....

Then in the event handler of your MouseListener

boolan onLine = line.contains(event.getX(), event.getY());
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12154519
Or simpler

boolan onLine = line.contains(event.getPoint());
0
 

Author Comment

by:jtcy
ID: 12154525
um...oh...what is g2d by the way?
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12154538
java.awt.geom.Graphics2D. Cast a normal java.awt.Graphics to it
0
 

Author Comment

by:jtcy
ID: 12154548
I already done: import java.awt.geom.Line2D.*; but it keeps saying package Line2D doesnt exist.
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12154573
It should be

Line2D.Double
0
 

Author Comment

by:jtcy
ID: 12154584
yeah, thats what i did and it complains that.
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12154593
import java.awt.geom.Line2D.Double;
0
 

Author Comment

by:jtcy
ID: 12154604
Still....hm~~~ wats wrong?

----------------------------------------------------------------------
 Point A = new Point(A_x, A_y);
                              Point B = new Point(B_x, B_y);
                   
                              if (A != null && B != null)
                               {
                                      g.setColor(Color.black);
                                      Line2D.Double line = Line2D.Double(A.x, A.y, B.x, B.y);
                                g2d.draw(line);

                              }
-----------------------------------------------------------------------

and this is in a static class.

0
 

Author Comment

by:jtcy
ID: 12154638
okay, needs to import java.awt.geom.*;
0
 

Author Comment

by:jtcy
ID: 12154645
How do I covert an integer to a double? Becuz the four params that I used are int, I tried int.DoubleValue() but it says deference error.
0
 
LVL 3

Expert Comment

by:CI-Ia0s
ID: 12155697
As in the other thread:
int someInt = 5;
double someDouble = someInt;

You only need to ask once, you know... ;)
0
 

Author Comment

by:jtcy
ID: 12157729
Why isnt the following constructor working>?? It keeps saying identifier expected.

Vector 2DLines = new Vector();
0
 

Author Comment

by:jtcy
ID: 12157743
oh....cant start with a number as an Identifier, forgot that.
0
 

Author Comment

by:jtcy
ID: 12158103
How can I make the border of the line thicker?
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12158157
g2d.setStroke(...) before you draw it
0
 

Author Comment

by:jtcy
ID: 12158164
um...which class is the method from?
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12158208
0
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 

Author Comment

by:jtcy
ID: 12158223
Yup, got it. However, I still cant ge the contains thing to work.

---------------------------------------------------------------------------------------
public void mouseClicked(MouseEvent e)
        {
            System.out.println("Clicked on " + e.getX() + " and " + e.getY());
            for (int f=0; f<Lines2D.size(); f++)
              {
                   Line2D.Double tempLine = (Line2D.Double) Lines2D.get(f);
                   if (tempLine.contains(e.getX(), e.getY()))
                    {
                           System.out.println("CLICKED ON POINT!!!");
                           .............
                    }
              }
        }

-----------------------------------------------------------------------------

It never succeed printing the CLICKED ON POINT out when I click on the line. It;s weird. Is it too sensitive that I have not clicked that close on the line or what. hm...

0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12158248
>>Is it too sensitive that I have not clicked that close on the line or what

Could be. I should perhaps have mentioned, in case you're not aware, that increasing the thickness of the line stroke does not affect the geometry, so you'll need to click the exact middle ;-)
0
 

Author Comment

by:jtcy
ID: 12158285
hm,...........is there any other way?.....
0
 

Author Comment

by:jtcy
ID: 12158294
It should print that out, cuz I am sure I have clicked on the line, hm~~~......
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12158317
Can you post full, runnable code? If it's long, please post a link instead
0
 

Author Comment

by:jtcy
ID: 12158346
Hi, I have uploaded the stuff:

www.geocities.com/jonathan_tay_2000
0
 

Author Comment

by:jtcy
ID: 12158361
Here's how you can trace:

Look at the load listener, then drawMap(), then CoordinatesArea.MouseClicked()

0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12158381
That's a bit too much work jtcy (especially for 30 points ;-)). Since you're so near, put it into a runnable (doesn't need to be executable - yet) jar file instead, so it can be run with

java -classpath project.jar SomeClass
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12158389
Also, check that the code you last posted is getting called:

boolean foundLine = false;
// loop (set foundLine if found)

if (!foundLine) {
    // print no lines found
}
0
 

Author Comment

by:jtcy
ID: 12158409
um...you just run it with

javac *.java
java GUI

thats all.....
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12158421
No, since there are classes and source in different directories
0
 

Author Comment

by:jtcy
ID: 12158431
you just extract them to a directory and all files and folders will be put and arranged into sub folders automatically, and all you need to do is run GUI.java. Don't extract by dragging files out youself. Press "Extract" button on winzip and choose a folder and it will place relevant files into sub folders itself and left GUI.java at current directory.
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12158476
I think you can imagine i don't need to be told how to run a Java archive ;-)
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12158489
>>
First node x: 35 :: 153
First node y: 10 :: 8

Clicked on 151 and 136
Clicked on 155 and 51
>>
0
 

Author Comment

by:jtcy
ID: 12158517
Wats wrong?
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12158567
Nothing apparently (wouldn't get that readout otherwise) - that's the point ;-)
0
 

Author Comment

by:jtcy
ID: 12158706
I just found this:

*****
Tests if a specified coordinate is inside the boundary of this Line2D. This method is required to implement the Shape interface, but in the case of Line2D objects it always returns false since a line contains no area.
****

- - ~
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12158760
My apologies: in that case the class conforms to the Euclidean definition of a line, which is good in a way. And i thought that readout was showing your object registering line clicks, but i suppose it's registering just points, i.e. mouse clicks.

There's one way to do it that will definitely work: take the general equation of a line and see if the coordinates fall on it. I assumed that's exactly what the library class would be doing - one could argue that their Euclidean (non-)implementation is unhelpfully pedantic.

I can't help thinking that the package provides a better way though, so before you start wheel reinvention per my suggestion, make sure you investigate thoroughly
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12158776
... such as


if (tempLine.ptLineDistSq(e.getX(), e.getY()) <= 0.0)
0
 

Author Comment

by:jtcy
ID: 12158785
I am still wondering if there is other classes that can accept mouse listener on a line.........
0
 
LVL 86

Accepted Solution

by:
CEHJ earned 30 total points
ID: 12158807
AFAIK no, as they'd have to be some sort of component and hence rectangle-oriented in the normal plane. The way to go is per my last i think, although i haven't tested it. Gotta go ...
0

Featured Post

Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

Join & Write a Comment

Suggested Solutions

Java contains several comparison operators (e.g., <, <=, >, >=, ==, !=) that allow you to compare primitive values. However, these operators cannot be used to compare the contents of objects. Interface Comparable is used to allow objects of a cl…
In this post we will learn how to connect and configure Android Device (Smartphone etc.) with Android Studio. After that we will run a simple Hello World Program.
Viewers will learn about the different types of variables in Java and how to declare them. Decide the type of variable desired: Put the keyword corresponding to the type of variable in front of the variable name: Use the equal sign to assign a v…
The viewer will learn how to implement Singleton Design Pattern in Java.

746 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now