Java-Gaming.org Hi !
 Featured games (84) games approved by the League of Dukes Games in Showcase (595) Games in Android Showcase (168) games submitted by our members Games in WIP (646) games currently in development
 News: Read the Java Gaming Resources, or peek at the official Java tutorials
Pages: [1]
 ignore  |  Print
 Adding a capability to Line2D  (Read 1085 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

You cannot reply to this message, because it is very, very old.

 deepthought (49 views) 2015-06-30 15:39:44 deepthought (56 views) 2015-06-30 15:39:09 deepthought (65 views) 2015-06-30 15:36:52 Za\'Anzabar (42 views) 2015-06-29 05:44:54 TritonDreyja (49 views) 2015-06-24 17:10:40 CopyableCougar4 (49 views) 2015-06-23 00:34:45 BurntPizza (58 views) 2015-06-21 20:36:46 cookiecompiler (98 views) 2015-06-11 15:42:53 cookiecompiler (57 views) 2015-06-11 15:41:14 NegativeZero (81 views) 2015-06-11 09:49:18
 princec 31x wessles 23x orangepascal 19x CopyableCougar4 19x BurntPizza 18x EgonOlsen 17x opiop65 17x ags1 15x nsigma 15x Riven 13x KaiHH 12x Jesse 11x SauronWatchesYou 11x theagentd 11x KevinWorkman 11x sunburn 11x
 How Do I Expand My Game?by bashfrog2015-06-14 11:34:43List of Learning Resources2015-05-31 05:37:30Intersection Methodsby Roquen2015-05-29 08:19:33List of Learning Resources2015-05-05 10:20:32How to: JGO Wikiby Mac702015-02-17 20:56:162D Dynamic Lighting2015-01-01 20:25:42How do I start Java Game Development?by gouessej2014-12-27 19:41:21Resources for WIP gamesby kpars2014-12-18 10:26:14
 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