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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 23.12.2014, 14:12
australian incognito вне форума Посмотреть профиль Отправить личное сообщение для australian incognito Найти все сообщения от australian incognito
  № 1  
Ответить с цитированием
australian incognito
 
Аватар для australian incognito

Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
Thumbs up Пересечение кривой безье и прямой линии, как проверить?

Похоже, задачка для 10 класса алгебры, но все же:
Есть кривая безье, отрисованная с помощью
Код AS1/AS2:
curveTo
(т.е. 2 точки и точка кривизны) и прямая линия, заданная 2 точками. Подскажите составить условие их пересечения (если это упростит задачу, то прямая линия параллельна оси Х)?
__________________
Игра "Пушкин"

Старый 23.12.2014, 15:46
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 2  
Ответить с цитированием
nubideus

Регистрация: Jan 2013
Сообщений: 322
Цитата:
(если это упростит задачу, то прямая линия параллельна оси Х)
да. сначала находишь t, потом находишь y


если прямая не параллельна осям то
http://www.flasher.ru/forum/showpost...11&postcount=4

Добавлено через 6 часов 40 минут
квадратичное уравнение безье(для трех точек):
Код AS3:
p4 = t*(t*(p3 - p2*2 + p1) + 2*(p2 - p1)) + p1
мутируешь его в квадратное уравнение:
Код AS3:
t*t*(p3 - p2*2 + p1) + t*2*(p2 - p1) + p1 - p4 = 0
http://www.flasher.ru/forum/showpost...72&postcount=2

Код AS3:
var a = (p3 - p2*2 + p1);
var b = 2*(p2 - p1);
var c = p1 - p4;
 
var t1 = (-b + Math.sqrt(b*b - 4*a*c)) / (2*a);
var t2 = (-b - Math.sqrt(b*b - 4*a*c)) / (2*a);
 
if(t1 >= 0 && t1 <= 1){
  // t1 лежит на кривой
}
 
if(t2 >= 0 && t2 <= 1){
  // t2 лежит на кривой
}
Код AS3:
package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Point;
 
	public class Main extends Sprite
	{
		private var p1:Point = new Point(10, 10);
		private var p2:Point = new Point(100, 300);
		private var p3:Point = new Point(200, 40);
 
		var liney:Number = 0;
 
		public function Main() {
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
 
		function quadraticBezier(p1, p2, p3, t){
			return t*(t*(p3 - p2*2 + p1) + 2*(p2 - p1)) + p1;
		}
		private function onEnterFrame(event:Event = null):void {
			this.graphics.clear()
 
			liney++;
			if (liney > 200) liney = 0;
 
			var a = p3.y - p2.y*2 + p1.y;
			var b = 2*(p2.y - p1.y);
			var c = p1.y - liney;
 
			var t1 = (-b + Math.sqrt(b*b - 4*a*c)) / (2*a);
			var t2 = (-b - Math.sqrt(b*b - 4*a*c)) / (2*a);
 
			this.graphics.lineStyle(1, 0x000000);
			this.graphics.moveTo(0, liney);
			this.graphics.lineTo(300, liney);
 
			this.graphics.lineStyle(1, 0x000000);
			this.graphics.moveTo(p1.x, p1.y);
			this.graphics.curveTo(p2.x, p2.y, p3.x, p3.y);
			this.graphics.lineStyle(2, 0xFF0000);
			if(t1 * (t1 - 1) < 0){
				// t1 лежит на кривой
				var newPoint:Point = new Point();
				newPoint.x = quadraticBezier(p1.x, p2.x, p3.x, t1);
				newPoint.y = quadraticBezier(p1.y, p2.y, p3.y, t1);
				this.graphics.drawCircle(newPoint.x, newPoint.y, 2);
			}
 
			if(t2 * (t2 - 1) < 0){
				// t2 лежит на кривой
				var newPoint:Point = new Point();
				newPoint.x = quadraticBezier(p1.x, p2.x, p3.x, t2);
				newPoint.y = quadraticBezier(p1.y, p2.y, p3.y, t2);
				this.graphics.drawCircle(newPoint.x, newPoint.y, 2);
			}
		}
	}
}


Последний раз редактировалось nubideus; 02.01.2015 в 03:04. Причина: t2 <= 2 омг
Старый 24.12.2014, 14:37
australian incognito вне форума Посмотреть профиль Отправить личное сообщение для australian incognito Найти все сообщения от australian incognito
  № 3  
Ответить с цитированием
australian incognito
 
Аватар для australian incognito

Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
Спасибо большое. Ушел "переваривать"...
__________________
Игра "Пушкин"

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

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

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


 


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


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