y= m.x+b
m= inclinazione della linea
b= punto di intersezione con l'asse delle y

Due linee si intersecano quando la loro inclinazione non è uguale
Supponendo di avere due linee:
y = m1.x+b1
y = m2.x+b2
... di conseguenza, per sapere in quale punto sull'asse delle x si incrociano le linee
m1.x+b1 = m2.x+b2
x = (b2-b1)/(m1-m2)
Aspetto interessante da sottolineare è la distinzione tra linea e segmento. La linea ha una lunghezza infinita, mentre un segmento corrisponde ad una porzione di linea racchiusa tra due punti.
Se due linee si intersecano, ma non i due segmenti presi in considerazione per la collisione, non avremo collisione. Se invece sia le linee che i segmenti si intersecano, avremo una collisione.
Ecco il codice flash per rilevare la collisione tra due linee
_root.createEmptyMovieClip("clip",1);
clip.lineStyle(0,0x000000,100);
//creiamo due oggetti per le due linee
var line1:Object={};
line1.m=1;
line1.b=100;
//
var line2:Object={};
line2.m=5
line2.b=50;
//
function findY(line:Object, x:Number):Number{
var y:Number=line.m*x+line.b;
return y;
//trace(y);
}
//
function drawLine(line:Object):Void{
//scegliamo una x
var x:Number=300;
//troviamo la y
var y:Number=findY(line, x);
//trace(y);
//iniziamo a disegnare la linea
clip.moveTo(x, y);
//scegliamo un'altra x
var x:Number=0;
// e troviamo la sua y
var y:Number=findY(line, x);
//trace(y);
//adesso possiamo terminare il disegno della linea
clip.lineTo(x, y);
}
//
function findIntersection(line_a:Object, line_b:Object):Void{
//questa sotto è la formula per trovare la x di intersezione
//se abbiamo due linee
//y=m1*x+b1 e y=m2*x+b2
//avremo che m1*x+b1=m2*x+b2 che risolta mi da
//x=(b2-b1)/(m1-m2)
var x:Number=(line_b.b-line_a.b)/(line_a.m-line_b.m);
//per trovare invece la y del punto è sufficiente risolvere l'equazione della linea che abbiamo visto prima y=m1*x+b1
var y:Number=line_a.m*x+line_a.b;
dot_mc._x=x;
dot_mc._y=y;
}
//lanciamo la funzione
drawLine(line1);
drawLine(line2);
findIntersection(line1, line2);
Nell'esempio sottostante andiamo invece a verificare se l'intersezione avvenga fra due linee o fra due segmenti delle due linee. Nel primo caso non avremo collisione,nel secondo si. Per fare questo dobiamo definire le due coppie di x dei due segmenti, ovvero diciamo i "bordi" di essi
_root.createEmptyMovieClip("clip",1);
clip.lineStyle(0,0x000000,100);
//creiamo due oggetti per le due linee
var line1:Object={};
//inclinazione
line1.m=1;
//punto di intersezione con l'asse dell y
line1.b=100;
//le due x dei due punti del segmento 1
line1.x1 = 50;
line1.x2 = 200;
//
var line2:Object={};
//inclinazione
//mettete ad esempio =5 per avere intersezione fra linee ma nn fra segmenti
line2.m=3
//punto di intersezione con l'asse dell y
line2.b=-150;
//le due x dei due punti del segmento 2
line2.x1 = 100;
line2.x2 = 150;
//
function findY(line:Object, x:Number):Number{
var y:Number=line.m*x+line.b;
return y;
//trace(y);
}
//
function drawLine(line:Object):Void{
//scegliamo una x
var x:Number=line.x1;
//troviamo la y
var y:Number=findY(line, x);
//passiamo la y del primo punto all'oggetto
line.y1=y
//trace(y);
//iniziamo a disegnare la linea
clip.moveTo(x, y);
//scegliamo un'altra x del secondo punto
var x:Number=line.x2;
// e troviamo la sua y
var y:Number=findY(line, x);
//vedi sopra per la y
line.y2=y;
//trace(y);
//adesso possiamo terminare il disegno della linea
clip.lineTo(x, y);
}
//
function findIntersection(line_a:Object, line_b:Object):Void{
//questa sotto è la formula per trovare la x di intersezione
//se abbiamo due linee
//y=m1*x+b1 e y=m2*x+b2
//avremo che m1*x+b1=m2*x+b2 che risolta mi da
//x=(b2-b1)/(m1-m2)
var x:Number=(line_b.b-line_a.b)/(line_a.m-line_b.m);
//per trovare invece la y del punto è sufficiente risolvere l'equazione della linea che abbiamo visto prima y=m1*x+b1
var y:Number=line_a.m*x+line_a.b;
dot_mc._x=x;
dot_mc._y=y;
//
if((x>=line_a.x1 && x<=line_a.x2) || (x<=line_a.x1 && x>=line_a.x2) || (y>=line_a.y1 && y<=line_a.y2) || (y<=line_a.y1 && y>=line_a.y2)){
var segment_a:Boolean=true;
}
if ((x>=line_b.x1 && x<=line_b.x2) || (x<=line_b.x1 && x>=line_b.x2) || (y>=line_b.y1 && y<=line_b.y2) || (y<=line_b.y1 && y>=line_b.y2)){
var segment_b:Boolean=true;
}
if(segment_a && segment_b){
trace("c'è collisione");
}else{
trace("si intersecano ma nn c'è collisione");
}
}
//lanciamo la funzione
drawLine(line1);
drawLine(line2);
findIntersection(line1, line2);


0 commenti:
Posta un commento