Java-Gaming.org Hi !
 Featured games (84) games approved by the League of Dukes Games in Showcase (563) Games in Android Showcase (151) games submitted by our members Games in WIP (605) 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 1045 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.

 wxwsk8er (49 views) 2015-03-20 15:39:46 Fairy Tailz (42 views) 2015-03-15 21:52:20 Olo (26 views) 2015-03-13 17:51:59 Olo (29 views) 2015-03-13 17:50:51 Olo (33 views) 2015-03-13 17:50:16 Olo (40 views) 2015-03-13 17:47:07 ClaasJG (29 views) 2015-03-10 11:36:42 ClaasJG (37 views) 2015-03-10 11:33:01 Pippogeek (45 views) 2015-03-05 14:36:23 Pippogeek (37 views) 2015-03-05 13:56:12
 LiquidNitrogen 23x KevinWorkman 21x basil_ 21x BurntPizza 21x theagentd 18x Riven 18x EgonOlsen 17x Roquen 14x princec 12x Varkas 9x Slyth2727 9x NegativeZero 9x SHC 9x Ecumene 8x ClaasJG 7x teletubo 7x
 How 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:14Understanding relations between setOrigin, setScale and setPosition in libGdx2014-10-09 22:35:00Definite guide to supporting multiple device resolutions on Android (2014)2014-10-02 22:36:02List of Learning Resources2014-08-16 10:40:00List of Learning Resources2014-08-05 19:33:27
 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