Java-Gaming.org    
Featured games (78)
games approved by the League of Dukes
Games in Showcase (429)
Games in Android Showcase (89)
games submitted by our members
Games in WIP (466)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1]
  ignore  |  Print  
  Adding a capability to Line2D  (Read 912 times)
0 Members and 1 Guest are viewing this topic.
Offline jessewclark

Senior Newbie




Heaven means muzak.


« Posted 2003-12-31 23:17:50 »

Hi all.

I found myself several times wishing that Line2D could do this specific thing, so I made it do that thing.  I called the new class Line2DPlus.  The new thing it does is this: it has a method called getClosestPt which returns the point on the line that is closest to any given point.

Here's the code for the getClosestPt method:

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
           
            public Point2D.Float getClosestPt ( Point2D.Float targetPoint ) {
                  
                  // Find the distance from the line to the point:
                 
                  double ptLineDist = ptLineDist ( targetPoint ) ;
                  
                  // Find the distance from the line's beginning to the point:
                 
                  double endPtDist = getP1 ().distance ( targetPoint ) ;
                  
                  // Calculating the length of the line segment that runs from the line's
                 // beginning to the point on the line that is closest to the targetPoint:
                 
                  double segmentLength =
                        Math.sqrt ( ( endPtDist * endPtDist ) - ( ptLineDist * ptLineDist ) ) ;
                        
                  // Finding the change in x and y between the endpoints of the line:
                 
                  double changeX = getP1 ().getX () - getP2 ().getX () ;
                  
                  double changeY = getP1 ().getY () - getP2 ().getY () ;
                  
                  // Finding the length of the line:
                 
                  double length = getP1 ().distance ( getP2 () ) ;
                  
                  // Determining the change in X and Y for the new segment:
                 
                  double newX = segmentLength * changeX / length ;
                  
                  double newY = segmentLength * changeY / length ;
                  
                  // Finding the end point of the new segment:
                 
                  Point2D.Float newEnd =
                        new Point2D.Float ( ( float ) ( getP1 ().getX () + newX ) ,
                                                      ( float ) ( getP1 ().getY () + newY ) ) ;
                                                      
                  // Returning that point:
                 
                  return newEnd ;
                  
            }     



Any comments?  Specifically, I'm curious if anybody can see a better way to do the same thing.
Offline jessewclark

Senior Newbie




Heaven means muzak.


« Reply #1 - Posted 2004-01-12 15:13:16 »

After working with this code for a little while, and having it not work correctly, and staring at it for a long time, I finally realized there's an error in it.  Since no one else caught it, I thought I'd post it myself:

1  
2  
3  
4  
5  
                  // Finding the change in x and y between the endpoints of the line: 
                 
                  double changeX = getP1 ().getX () - getP2 ().getX () ;
                  
                  double changeY = getP1 ().getY () - getP2 ().getY () ;


and

1  
2  
3  
4  
5  
6  
                  // Finding the end point of the new segment: 
                 
                  Point2D.Float newEnd =  
                        new Point2D.Float ( ( float ) ( getP1 ().getX () + newX ) ,  
                                                      ( float ) ( getP1 ().getY () + newY ) ) ;
          


add up to the new line segment heading away from the target point, not towards it.  To correct this, either the first snippet needs to be changed to

1  
2  
3  
4  
5  
                  // Finding the change in x and y between the endpoints of the line: 
                 
                  double changeX = getP2 ().getX () - getP1 ().getX () ;
                  
                  double changeY = getP2 ().getY () - getP1 ().getY () ;


which will result in the positivity/negativity of the changeX and changeY being reversed, or

1  
2  
3  
4  
5  
6  
                  // Finding the end point of the new segment: 
                 
                  Point2D.Float newEnd =  
                        new Point2D.Float ( ( float ) ( getP1 ().getX () - newX ) ,  
                                                      ( float ) ( getP1 ().getY () - newY ) ) ;
          


which does almost the same thing.

Clear as mud?  Well, I tried.
Pages: [1]
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

 

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

xsi3rr4x (80 views)
2014-04-15 18:08:23

BurntPizza (72 views)
2014-04-15 03:46:01

UprightPath (83 views)
2014-04-14 17:39:50

UprightPath (67 views)
2014-04-14 17:35:47

Porlus (83 views)
2014-04-14 15:48:38

tom_mai78101 (107 views)
2014-04-10 04:04:31

BurntPizza (167 views)
2014-04-08 23:06:04

tom_mai78101 (263 views)
2014-04-05 13:34:39

trollwarrior1 (213 views)
2014-04-04 12:06:45

CJLetsGame (222 views)
2014-04-01 02:16:10
List of Learning Resources
by SHC
2014-04-18 03:17:39

List of Learning Resources
by Longarmx
2014-04-08 03:14:44

Good Examples
by matheus23
2014-04-05 13:51:37

Good Examples
by Grunnt
2014-04-03 15:48:46

Good Examples
by Grunnt
2014-04-03 15:48:37

Good Examples
by matheus23
2014-04-01 18:40:51

Good Examples
by matheus23
2014-04-01 18:40:34

Anonymous/Local/Inner class gotchas
by Roquen
2014-03-11 15:22:30
java-gaming.org is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑gaming.org
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!