Java trovare il punto di intersezione di due linee

In Java, ho una classe Line che ha due variabili : m e b, in modo tale che la linea segue la formula mx + b. Ho due linee. Come faccio a trovare il x e y coordinate del punto di intersezione delle due linee? (Supponendo che le piste sono diverse)

Qui è class Line:

import java.awt.Graphics;
import java.awt.Point;

public final class Line {
    public final double m, b;

    public Line(double m, double b) {
        this.m = m;
        this.b = b;
    }

    public Point intersect(Line line) {
        double x = (this.b - line.b) / (this.m - line.m);
        double y = this.m * x + this.b;
        return new Point((int) x, (int) y);
    }

    public void paint(Graphics g, int startx, int endx, int width, int height) {
        startx -= width / 2;
        endx -= width / 2;
        int starty = this.get(startx);
        int endy = this.get(endx);
        Point points = Format.format(new Point(startx, starty), width, height);
        Point pointe = Format.format(new Point(endx, endy), width, height);
        g.drawLine(points.x, points.y, pointe.x, pointe.y);
    }

    public int get(int x) {
        return (int) (this.m * x + this.b);
    }

    public double get(double x) {
        return this.m * x + this.b;
    }
}
Youve ha ottenuto di codice c’è già: non lavoro? Inoltre, pensare a quello che si potrebbe fare sulla carta e penna con 2 y=mx+b linee se si sta cercando di risolvere. Equiparare e risolvere per x per definire una soluzione generale per x e quindi utilizzare le linee equazione da risolvere per y. Tradurre le formule di codice
Stai avendo difficoltà a capire la formula? Che Matematica. O avete difficoltà a tradurre la formula conosciuta in codice? Che non dovrebbe essere troppo difficile, ed è già fatto.

OriginaleL’autore HyperNeutrino | 2015-07-19

2 Replies
  1. 9

    Lascia supporre che si hanno queste 2 funzioni:

    y = m1*x + b1    
    y = m2*x + b2

    Per trovare il punto di intersezione tra x-axis noi:

    m1*x+b1 = m2*x+b2    
    m1*x-m2*x = b2 - b2    
    x(m1-m2) = (b2-b1)    
    x = (b2-b1) / (m1-m2)

    Per trovare la y, è possibile utilizzare la funzione di espressioni e sostituire x per il suo valore (b2-b1) /(m1-m2).

    Così:

    y = m1 * [(b2-b1) / (m1-m2)] + b1

    Hai (this.b - line.b), modificare (line.b - this.b).

    public Point intersect(Line line) {
        double x = (line.b - this.b) / (this.m - line.m);
        double y = this.m * x + this.b;
    
        return new Point((int) x, (int) y);
    }
    Perfetto! Ho pensato che era solo un piccolo errore in quanto i miei numeri erano piccoli. Grazie mille!
    Basta essere consapevoli, questa soluzione non funziona verticali e linee parallele. In caso di m-line.m=0 non è definito.

    OriginaleL’autore Lourenco

  2. 0

    Che è quello che ho ottenuto. Non è stato trovato nessun exeptions che non funzionano:

    public static Point calculateInterceptionPoint(Point s1, Point d1, Point s2, Point d2) {
    
        double sNumerator = s1.y * d1.x + s2.x * d1.y - s1.x * d1.y - s2.y * d1.x;
        double sDenominator = d2.y * d1.x - d2.x * d1.y;
    
        //parallel ... 0 or infinite points, or one of the vectors is 0|0
        if (sDenominator == 0) {
            return null;
        }
    
        double s = sNumerator / sDenominator;
    
        double t;
        if (d1.x != 0) {
            t = (s2.x + s * d2.x - s1.x) / d1.x;
        } else {
            t = (s2.y + s * d2.y - s1.y) / d1.y;
        }
    
        Point i1 = new Point(s1.x + t * d1.x, s1.y + t * d1.y);
    
        return i1;
    
    }
    
    public static void main(String[] args) {
        System.out.println(calculateInterceptionPoint(new Point(3, 5), new Point(0, 2), new Point(1, 2), new Point(4, 0)));
        System.out.println(calculateInterceptionPoint(new Point(3, 5), new Point(0, 2), new Point(1, 2), new Point(0, 2)));
        System.out.println(calculateInterceptionPoint(new Point(0, 0), new Point(0, 2), new Point(0, 0), new Point(2, 0)));
        System.out.println(calculateInterceptionPoint(new Point(0, 0), new Point(0, 2), new Point(0, 0), new Point(0, 2)));
        System.out.println(calculateInterceptionPoint(new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0)));
    }
    Non è possibile creare un’istanza di un oggetto Point con un doppio coordinamenti nel costruttore; è necessario creare un oggetto vuoto e quindi popolare. Il costruttore accetta solo valori int.

    OriginaleL’autore wutzebaer

Lascia un commento