Java-Gaming.org Hi !
 Featured games (91) games approved by the League of Dukes Games in Showcase (756) Games in Android Showcase (229) games submitted by our members Games in WIP (842) 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 1818 times) 0 Members and 1 Guest are viewing this topic.
jessewclark

Senior Newbie

Heaven means muzak.

 « Posted 2003-12-31 22: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.
jessewclark

Senior Newbie

Heaven means muzak.

 « Reply #1 - Posted 2004-01-12 14: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

 DesertCoockie (52 views) 2018-05-13 18:23:11 nelsongames (83 views) 2018-04-24 18:15:36 nelsongames (74 views) 2018-04-24 18:14:32 ivj94 (759 views) 2018-03-24 14:47:39 ivj94 (87 views) 2018-03-24 14:46:31 ivj94 (643 views) 2018-03-24 14:43:53 Solater (102 views) 2018-03-17 05:04:08 nelsongames (184 views) 2018-03-05 17:56:34 Gornova (426 views) 2018-03-02 22:15:33 buddyBro (1086 views) 2018-02-28 16:59:18
 Java Gaming Resourcesby philfrei2017-12-05 19:38:37Java Gaming Resourcesby philfrei2017-12-05 19:37:39Java Gaming Resourcesby philfrei2017-12-05 19:36:10Java Gaming Resourcesby philfrei2017-12-05 19:33:10List of Learning Resourcesby elect2017-03-13 14:05:44List of Learning Resourcesby elect2017-03-13 14:04:45SF/X Librariesby philfrei2017-03-02 08:45:19SF/X Librariesby philfrei2017-03-02 08:44:05
 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