Morgen
Eigentlich ist es ein Matheproblem aber es ist eine Funktion für Javascript - deswegen hier hin.
Nicht erschlagen.
Ich habe folgende Funktion die ausspuckt wo sich zwei Geraden schneiden.
Jetzt interessiert mich nicht ob / wo die unendlichen Geraden
sondern nur ob und wo die Linien sich schneiden (angegeben durch die Punkte).
Ich steh auf dem Schlauch.
Ein Mathe-Ass bin ich leider nicht.
Ich suche auch schon ewigkeiten bei Google finde aber auch nur sehr komplizierte Beispiele
mit Rechenzeichen die ich noch nie gesehen habe.
Das muss auch einfacher gehen.
Ich hoffe jemand kann und will mir helfen.
Für jeden Tipp dankbar
Edit: Der einfachste Weg war für mich wie so oft nicht gleich ersichtlich. Habs gelöst. Damit andere mit einem ähnlichen Problem
eine Lösung haben teile ich diese natürlich mit.
Ich habe einfach die Länge der Strecke vom schnittpunkt zu punkt lineAx1 , lineAy1 und zu Punkt lineAx2, lineAy2
addiert und verglichen mit der länge von Punkt lineAx1, lineAy1 zu lineAx2, lineAy2.
(das selbe nochmal mit lineBx1 ...)
Ist das Ergebnis beider Rechnungen gleich dann schneidet die Linie die andere Linie.
So sehen meine Funktionen aus ( lineLength errechnet die länge von punkt1 und punkt2)
Schönen Abend
Eigentlich ist es ein Matheproblem aber es ist eine Funktion für Javascript - deswegen hier hin.
Nicht erschlagen.
Ich habe folgende Funktion die ausspuckt wo sich zwei Geraden schneiden.
Code:
function checkIntersection(lineAx1, lineAy1, lineAx2, lineAy2, lineBx1, lineBy1, lineBx2, lineBy2)
{
var aM,bM, aB, bB , isX = 0, isY = 0;
if((lineAx2-lineAx1)==0){
isX=lineAx1;
bM=(lineBy2-lineBy1)/(lineBx2-lineBx1);
bB=lineBy2-bM*lineBx2;
isY=bM*isX+bB;
}
else if((lineBx2-lineBx1)==0){
isX=lineBx1;
aM=(lineAy2-lineAy1)/(lineAx2-lineAx1);
aB=lineAy2-aM*lineAx2;
isY=aM*isX+aB;
}
else {
aM=(lineAy2-lineAy1)/(lineAx2-lineAx1);
bM=(lineBy2-lineBy1)/(lineBx2-lineBx1);
aB=lineAy2-aM*lineAx2;
bB=lineBy2-bM*lineBx2;
isX= Math.max(((bB-aB)/(aM-bM)),0);
isY=aM*isX+aB;
}
var r = [Math.round(isX), Math.round(isY)];
return r;
}
Jetzt interessiert mich nicht ob / wo die unendlichen Geraden
sondern nur ob und wo die Linien sich schneiden (angegeben durch die Punkte).
Ich steh auf dem Schlauch.
Ein Mathe-Ass bin ich leider nicht.
Ich suche auch schon ewigkeiten bei Google finde aber auch nur sehr komplizierte Beispiele
mit Rechenzeichen die ich noch nie gesehen habe.
Das muss auch einfacher gehen.
Ich hoffe jemand kann und will mir helfen.
Für jeden Tipp dankbar
Edit: Der einfachste Weg war für mich wie so oft nicht gleich ersichtlich. Habs gelöst. Damit andere mit einem ähnlichen Problem
eine Lösung haben teile ich diese natürlich mit.
Ich habe einfach die Länge der Strecke vom schnittpunkt zu punkt lineAx1 , lineAy1 und zu Punkt lineAx2, lineAy2
addiert und verglichen mit der länge von Punkt lineAx1, lineAy1 zu lineAx2, lineAy2.
(das selbe nochmal mit lineBx1 ...)
Ist das Ergebnis beider Rechnungen gleich dann schneidet die Linie die andere Linie.
So sehen meine Funktionen aus ( lineLength errechnet die länge von punkt1 und punkt2)
Code:
function lineLength( x, y, x0, y0 ){
return Math.sqrt( ( x -= x0 ) * x + ( y -= y0 ) * y );
}
function checkIntersection(lineAx1, lineAy1, lineAx2, lineAy2, lineBx1, lineBy1, lineBx2, lineBy2)
{
var aM,bM, aB, bB , isX = 0, isY = 0;
if((lineAx2-lineAx1)==0){
isX=lineAx1;
bM=(lineBy2-lineBy1)/(lineBx2-lineBx1);
bB=lineBy2-bM*lineBx2;
isY=bM*isX+bB;
}
else if((lineBx2-lineBx1)==0){
isX=lineBx1;
aM=(lineAy2-lineAy1)/(lineAx2-lineAx1);
aB=lineAy2-aM*lineAx2;
isY=aM*isX+aB;
}
else {
aM=(lineAy2-lineAy1)/(lineAx2-lineAx1);
bM=(lineBy2-lineBy1)/(lineBx2-lineBx1);
aB=lineAy2-aM*lineAx2;
bB=lineBy2-bM*lineBx2;
isX= Math.max(((bB-aB)/(aM-bM)),0);
isY=aM*isX+aB;
}
var r = [Math.round(isX), Math.round(isY)];
if(Math.floor(lineLength(lineAx1, lineAy1, lineAx2, lineAy2)) == Math.floor(lineLength(lineAx1,lineAy1,r[0], r[1]) + lineLength(lineAx2,lineAy2,r[0],r[1])) && Math.floor(lineLength(lineBx1, lineBy1, lineBx2, lineBy2)) == Math.floor(lineLength(lineBx1,lineBy1,r[0], r[1]) + lineLength(lineBx2,lineBy2,r[0],r[1])))
return r;
else
return false;
}
Schönen Abend
Zuletzt bearbeitet: