Я не совсем понял, что за координаты возвращает переменная result. Если координаты точки пересечения, то они не верные.
Может это я что-то неправильно сделал...Вот код, который я изменил под себя:
Код AS3:
package
{
import flash.display.MovieClip;
import flash.geom.Point;
import flash.display.Shape;
public class DDD extends MovieClip
{
public function DDD()
{
trace("НАЧАЛО");
var Line1:Shape = new Shape ;
addChild(Line1);
var Line1x1 = 160;//Начальная точка по оси Х для первого отрезка
var Line1y1 = 300;//Начальная точка по оси Y для первого отрезка
var Line1x2 = 150;//Конечная точка по оси Х для первого отрезка
var Line1y2 = 100;//Конечная точка по оси Y для первого отрезка
Line1.graphics.clear();
Line1.graphics.lineStyle(0, 0x00FF00, 1);
Line1.graphics.moveTo(Line1x1, Line1y1);
Line1.graphics.lineTo(Line1x2, Line1y2);
var FF:Point = new Point ;
//Создаем второй отрезок...
var Line2:Shape = new Shape ;
addChild(Line2);
var Line2x1 = 195;//Начальная точка по оси Х для второго отрезка
var Line2y1 = 355;//Начальная точка по оси Y для второго отрезка
var Line2x2 = 100;//Конечная точка по оси Х для второго отрезка
var Line2y2 = 100;//Конечная точка по оси Y для второго отрезка
Line2.graphics.clear();
Line2.graphics.lineStyle(0, 0x0000FF, 1);
Line2.graphics.moveTo(Line2x1, Line2y1);
Line2.graphics.lineTo(Line2x2, Line2y2);
var Line1Point1:Point = new Point(Line1x1,Line1y1);
var Line1Point2:Point = new Point(Line1x2,Line1y2);
var Line2Point1:Point = new Point(Line2x1,Line2y1);
var Line2Point2:Point = new Point(Line2x2,Line2y2);
trace(lineIntersect(Line1Point1,Line2Point1,Line1Point2,Line2Point2))
}
private function lineCross(b:Point, e:Point, b1:Point, e1:Point):Boolean
{
//взято с http://progs-maker.narod.ru/algor.html
var x1:Number = b.x;
var y1:Number = b.y;
var x2:Number = e.x;
var y2:Number = e.y;
var x3:Number = b1.x;
var y3:Number = b1.y;
var x4:Number = e1.x;
var y4:Number = e1.y;
trace (x1)
var maxx1:Number = Math.max(x1,x2);
var maxy1:Number = Math.max(y1,y2);
var minx1:Number = Math.min(x1,x2);
var miny1:Number = Math.min(y1,y2);
var maxx2:Number = Math.max(x3,x4);
var maxy2:Number = Math.max(y3,y4);
var minx2:Number = Math.min(x3,x4);
var miny2:Number = Math.min(y3,y4);
var dx21:Number = x2 - x1,dy21:Number = y2 - y1;// Длина проекций первой линии на ось x и y
var dx43:Number = x4 - x3,dy43:Number = y4 - y3;// Длина проекций второй линии на ось x и y
var dx13:Number = x1 - x3,dy13:Number = y1 - y3;
var div:Number,mul:Number;
div = dy43 * dx21 - dx43 * dy21;
if (div == 0)
{
trace ("ПАРАЛЕЛЬНЫ")
return false;
}// Линии параллельны...
if (div > 0)
{
mul = dx43 * dy13 - dy43 * dx13;
if (mul < 0 || mul > div)
{
return false;
}// Первый отрезок пересекается за своими границами...
mul = dx21 * dy13 - dy21 * dx13;
if (mul < 0 || mul > div)
{
return false;
}// Второй отрезок пересекается за своими границами...
}
else
{
mul = - (dx43 * dy13 - dy43 * dx13);
if (mul < 0 || mul > -div)
{
return false;
}// Первый отрезок пересекается за своими границами...
mul = - (dx21 * dy13 - dy21 * dx13);
if (mul < 0 || mul > -div)
{
return false;
}// Второй отрезок пересекается за своими границами...
}
return true;
}
public function lineIntersect(lineAP1:Point, lineAP2:Point, lineBP1:Point, lineBP2:Point):Point
{
// http://forum.vingrad.ru/faq/topic-157574.html
var lDetlineA:Number, lDetlineB:Number, lDetDivInv:Number,
lDiffLA:Point, lDiffLB :Point,
result:Point = new Point;
lDetlineA = lineAP1.x * lineAP2.y - lineAP1.y * lineAP2.x;
lDetlineB = lineBP1.x * lineBP2.y - lineBP1.y * lineBP2.x;
lDiffLA = lineAP1.subtract(lineAP2);
lDiffLB = lineBP1.subtract(lineBP2);
lDetDivInv = 1 / ((lDiffLA.x*lDiffLB.y) - (lDiffLA.y*lDiffLB.x));
result.x = ((lDetlineA*lDiffLB.x) - (lDiffLA.x*lDetlineB)) * lDetDivInv;
result.y = ((lDetlineA*lDiffLB.y) - (lDiffLA.y*lDetlineB)) * lDetDivInv;
return result;
}
}
}
И когда линии параллельны, переменная div не была равна 0.
|