Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 08.08.2014, 16:55
MrFOX вне форума Посмотреть профиль Отправить личное сообщение для MrFOX Найти все сообщения от MrFOX
  № 3  
Ответить с цитированием
MrFOX

Регистрация: Aug 2014
Сообщений: 6
Я не совсем понял, что за координаты возвращает переменная 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.

Создать новую тему   Часовой пояс GMT +4, время: 05:10.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 05:10.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.