Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [java - Line2D] intersectsLine

    Salve, ho un problema che purtroppo non riesco a risolvere.
    Io ho due linee su due variabili di tipo Line2D.Double e vorrei ottenere il punto di intersezione delle due linee(se esiste).
    Ho visto nelle API Java ma sono riuscito a trovare solo il metodo
    boolean intersectsLine(Line2D l) , che mi restituisce vero se c'è l'intersezione.
    Ma per avere restituito il punto di intersezione come devo fare?
    Dato che esistono gli oggetti Line2D e Point2D, credevo di trovare un metodo appartenente a Line2D che mi trova un intersezione tra due linee e mi restituiva il punto nel formato Point2D.
    L'importante non è partecipare.. ma
    vincere!
    Errare Humanum EST, perseverare.. a OVEST!

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Non c'è un metodo prefabbricato, però visto che è un problema comune, bastava fare una piccola ricerca in internet... ad esempio:

    codice:
      public Point2D.Float getIntersectionPoint(Line2D.Float line1, Line2D.Float line2) {
        if (! line1.intersectsLine(line2) ) return null;
          double px = line.getX1(),
                py = line1.getY1(),
                rx = line1.getX2()-px,
                ry = line1.getY2()-py;
          double qx = line2.getX1(),
                qy = line2.getY1(),
                sx = line2.getX2()-qx,
                sy = line2.getY2()-qy;
     
          double det = sx*ry - sy*rx;
          if (det == 0) {
            return null;
          } else {
            double z = (sx*(qy-py)+sy*(px-qx))/det;
            if (z==0 ||  z==1) return null;  // intersection at end point!
            return new Point2D.Float(
              (float)(px+z*rx), (float)(py+z*ry));
          }
     } // end intersection line-line
    tratto da:
    http://72.5.124.102/thread.jspa?messageID=10760328

    4° risultato (su google) cercando: line2d intersection point
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    ciao Andrea, grazie tante per il link. Questo metodo è fa proprio al caso mio, perchè mi restituisce il punto di intersezione solo se:
    è presente (escluso i vertici delle due linee).

    Io avevo bisogno di restituirmi il Point2D per poi fare un controllo sugli estremi delle linee, così mi evito questi controlli.

    Grazie ancora.
    L'importante non è partecipare.. ma
    vincere!
    Errare Humanum EST, perseverare.. a OVEST!

  4. #4
    Ciao Andrea, mi sono reso conto a distanza di giorni che questo metodo non risolve a pieno il mio problema. Se le due linee sono una dentro l'altra mi restituisce sempre null. Ho provato ad utilizzare il metodo contains ma non capisco perchè non mi funziona. Sono sicuro che i metodi delle API java non possono non funzionare, quindi sicuramente sbaglio qualcosa io, o forse ho tradotto male la descrizione del metodo.
    codice:
    Point2D.Double a=new Point2D.Double(10,140); 
    Point2D.Double b=new Point2D.Double(40,140); 
    Point2D.Double c=new Point2D.Double(20,140); 
    Line2D.Double line=new Line2D.Double(a,b); 
    boolean test=line.contains(l); 
    System.out.println(test);
    Mi restituisce false... perchè?
    L'importante non è partecipare.. ma
    vincere!
    Errare Humanum EST, perseverare.. a OVEST!

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Originariamente inviato da offlieman
    Ciao Andrea, mi sono reso conto a distanza di giorni che questo metodo non risolve a pieno il mio problema. Se le due linee sono una dentro l'altra mi restituisce sempre null. Ho provato ad utilizzare il metodo contains ma non capisco perchè non mi funziona. Sono sicuro che i metodi delle API java non possono non funzionare, quindi sicuramente sbaglio qualcosa io, o forse ho tradotto male la descrizione del metodo.
    codice:
    Point2D.Double a=new Point2D.Double(10,140); 
    Point2D.Double b=new Point2D.Double(40,140); 
    Point2D.Double c=new Point2D.Double(20,140); 
    Line2D.Double line=new Line2D.Double(a,b); 
    boolean test=line.contains(l); 
    System.out.println(test);
    Mi restituisce false... perchè?
    Direttamente dalla javadoc
    contains

    public boolean contains(Point2D p)

    Tests if a given Point2D 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.

    Specified by:
    contains in interface Shape

    Parameters:
    p - the specified Point2D to be tested
    Returns:
    false because a Line2D contains no area.
    ne capisco che in caso di Line2D restituisce sempre false...
    al volante son nervoso

  6. #6
    ok Rubox grazie per avermi chiarito il dubbio.
    Ma per sapere se due rette sono una coincidente all'altra come devo fare? il metodo getIntersectionPoint (citato in precedenza) mi restituisce null.
    L'importante non è partecipare.. ma
    vincere!
    Errare Humanum EST, perseverare.. a OVEST!

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Originariamente inviato da offlieman
    ok Rubox grazie per avermi chiarito il dubbio.
    Ma per sapere se due rette sono una coincidente all'altra come devo fare? il metodo getIntersectionPoint (citato in precedenza) mi restituisce null.
    Credo che tu debba farti un tuo metodo partendo dalla definizione di rette coincidenti.
    Il metodo prima temo (non ho verificato i passaggi) che restituisca null nel caso le due rette siano coincidenti.
    al volante son nervoso

  8. #8
    Ok, ho risolto. Tutti i metodi delle Api java di Line2D si riferiscono a Line2D come retta e non come segmento. Mentre a me serviva un metodo che mi restituiva l'intersezione tra due segmenti (non rette), in più dovevo escludere l'intersezione dei segmenti se i due segmenti hanno come punto in comune uno dei vertici.

    Esiste un metodo di Line2D che si riferisce ai segmenti ed è:

    static boolean linesIntersect(double X1, double Y1, double X2, double Y2, double X3, double Y3, double X4, double Y4)

    Ho utilizzato questo e fino a questo momento funziona a meraviglia.
    Grazie cmq per le risposte di tutti...
    L'importante non è partecipare.. ma
    vincere!
    Errare Humanum EST, perseverare.. a OVEST!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.