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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.11.2008, 20:15
flazher вне форума Посмотреть профиль Найти все сообщения от flazher
  № 1  
Ответить с цитированием
flazher
Banned
[+1 16.01.09]
[+1 21.07.08]
[+3 08.09.08]

Регистрация: Apr 2008
Адрес: Hm...will it blend?
Сообщений: 303
По умолчанию hitTest линии и квадрата

Понимаю, что тема не раз уже обсуждалась, но поиск не дал ни одного толкового ответа.
Как определить "правильное" пересечение пунктирной линии с кавдратом? (hitTest, естественно, не подходит). Можно ли это сделать как-то геометрически?
Изображения
 

Старый 06.11.2008, 20:24
Division вне форума Посмотреть профиль Отправить личное сообщение для Division Найти все сообщения от Division
  № 2  
Ответить с цитированием
Division
 
Аватар для Division

Регистрация: Jul 2008
Адрес: Украина, Херсон
Сообщений: 635
Отправить сообщение для Division с помощью ICQ
Например, проверить пересечении линии со всеми сторонами прямоугольника по очереди. Вообще ИМХО лучше самостоятельно вывести формулу проверки пересечения, но если будет тяжко, вот: http://algolist.ru/maths/geom/intersect/lineline2d.php
__________________
while(1) {}

Старый 06.11.2008, 20:54
джонатан вне форума Посмотреть профиль Отправить личное сообщение для джонатан Найти все сообщения от джонатан
  № 3  
Ответить с цитированием
джонатан
 
Аватар для джонатан

Регистрация: Jan 2007
Адрес: Минск
Сообщений: 781
Отправить сообщение для джонатан с помощью Skype™
Намек:

if(линия._x >= квадрат._x and линия._x <= линия._x + линия._width)
__________________
Убейте меня!

Старый 06.11.2008, 20:56
Division вне форума Посмотреть профиль Отправить личное сообщение для Division Найти все сообщения от Division
  № 4  
Ответить с цитированием
Division
 
Аватар для Division

Регистрация: Jul 2008
Адрес: Украина, Херсон
Сообщений: 635
Отправить сообщение для Division с помощью ICQ
Цитата:
if(линия._x >= квадрат._x and линия._x <= линия._x + линия._width);
джонатан, неверный намёк.
__________________
while(1) {}

Старый 06.11.2008, 20:58
flazher вне форума Посмотреть профиль Найти все сообщения от flazher
  № 5  
Ответить с цитированием
flazher
Banned
[+1 16.01.09]
[+1 21.07.08]
[+3 08.09.08]

Регистрация: Apr 2008
Адрес: Hm...will it blend?
Сообщений: 303
Цитата:
Вообще ИМХО лучше самостоятельно вывести формулу проверки пересечения
Если я мог бы это сделать, я бы давно это уже сделал
На вашу ссылку зашел, но там для меня , увы, все как-то непонятно
Можете написать пример на флеше?

Старый 06.11.2008, 21:38
Division вне форума Посмотреть профиль Отправить личное сообщение для Division Найти все сообщения от Division
  № 6  
Ответить с цитированием
Division
 
Аватар для Division

Регистрация: Jul 2008
Адрес: Украина, Херсон
Сообщений: 635
Отправить сообщение для Division с помощью ICQ
flazher, сейчас у меня нет времени, может быть завтра смогу набросать что-то. Но лучше ты сам попытайся разобраться с материалом по ссылке.
Там пишут:
Цитата:
Если нужно найти пересечение отрезков, то нужно лишь проверить, лежат ли ua и ub на промежутке [0,1]. Если какая-нибудь из этих двух переменных 0 <= ui <= 1, то соответствующий отрезок содержит точку пересечения. Если обе переменные приняли значения из [0,1], то точка пересечения прямых лежит внутри обоих отрезков.
Это значит, что надо найти ua и ub. Это делается по формуле

После того как найдём ua и ub, если они обе от 0 до 1, то отрезки пересекаются.
С этим понятно?

Да, там же есть пример кода на C. Можешь оттуда перевести.
__________________
while(1) {}


Последний раз редактировалось Division; 06.11.2008 в 21:49.
Старый 21.11.2008, 08:18
bootaka вне форума Посмотреть профиль Отправить личное сообщение для bootaka Найти все сообщения от bootaka
  № 7  
Ответить с цитированием
bootaka
[+3 05.08.09]
 
Аватар для bootaka

Регистрация: Sep 2008
Адрес: Ё∙м∙с∙к
Сообщений: 147
и все-таки, как так сделать? теперь это понадобилось мне.

Добавлено через 35 секунд
и все-таки, как так сделать? теперь это понадобилось мне.
__________________
не прелюбодействуй с мозгом ближнего своего!

Старый 21.11.2008, 12:07
Division вне форума Посмотреть профиль Отправить личное сообщение для Division Найти все сообщения от Division
  № 8  
Ответить с цитированием
Division
 
Аватар для Division

Регистрация: Jul 2008
Адрес: Украина, Херсон
Сообщений: 635
Отправить сообщение для Division с помощью ICQ
Вот, нашёл:
Код AS1/AS2:
public static function LineVsLine(v1 : Vector2, v2 : Vector2, v3 : Vector2, v4: Vector2) {
	var zn = (v4.y-v3.y)*(v2.x-v1.x)-(v4.x-v3.x)*(v2.y-v1.y);
	var ua = ((v4.x-v3.x)*(v1.y-v3.y)-(v4.y-v3.y)*(v1.x-v3.x))/zn;
	var ub = ((v2.x-v1.x)*(v1.y-v3.y)-(v2.y-v1.y)*(v1.x-v3.x))/zn;
	if ((ua>=0 && ua <=1) && (ub>=0 && ub <=1)) return true;
	return false;
}
Функция из моей игрушки отсюда: http://flasher.ru/forum/showthread.php?t=115821 (:
Проверяет пересечение отрезков v1v2 и v3v4.
Смысл в том чтоб представить квадрат в виде отрезков. Для квадрата их будет четыре (: И по очереди проверить пересечение твоего отрезка и отрезков квадрата.
Vector2 - может быть любой класс, имеющий свойства x и y. Могу свой класс скинуть, там уже почти вся нужная математика описана
PS можно было спокойно написать эту функцию самостоятельно, всё что нужно для этого написано в посте 6
__________________
while(1) {}


Последний раз редактировалось Division; 21.11.2008 в 12:10.
Старый 21.11.2008, 14:59
goarcade вне форума Посмотреть профиль Отправить личное сообщение для goarcade Найти все сообщения от goarcade
  № 9  
Ответить с цитированием
goarcade

Регистрация: Sep 2006
Сообщений: 32
вот, быстро накидал кода
лови:
Код AS1/AS2:
var p0:MovieClip = createPoint(170,270);
var p1:MovieClip = createPoint(300,100);
 
var a:MovieClip = createPoint(200,200);
var b:MovieClip = createPoint(300,200);
var c:MovieClip = createPoint(300,300);
var d:MovieClip = createPoint(200,300);
 
onEnterFrame = function()
{
	_root.clear();
 
	var hit:Boolean = true;
 
	var dx:Number = p1._y-p0._y;
	var dy:Number = p0._x-p1._x;	
	var s0:Number = (a._x-p0._x)*dx+(a._y-p0._y)*dy;
	var s1:Number = (b._x-p0._x)*dx+(b._y-p0._y)*dy;
	var s2:Number = (c._x-p0._x)*dx+(c._y-p0._y)*dy;
	var s3:Number = (d._x-p0._x)*dx+(d._y-p0._y)*dy;	
	if(	(s0> 0&&s1> 0&&s2> 0&&s3> 0)||
		(s0<=0&&s1<=0&&s2<=0&&s3<=0))hit=false;
 
	beginFill((hit)?0xff0000:0x00ff00);
	moveTo(a._x,a._y);
	lineTo(b._x,b._y);	
	lineTo(c._x,c._y);	
	lineTo(d._x,d._y);	
	endFill();
 
 
	lineStyle(1);
	moveTo(p0._x,p0._y);
	lineTo(p1._x,p1._y);	
}
function createPoint(x:Number,y:Number):MovieClip
{
	var i:Number = getNextHighestDepth();
	var p:MovieClip = createEmptyMovieClip("point"+i.toString(),i);
	p.beginFill(0);
	p.lineTo(7,0);
	p.lineTo(0,7);
	p.endFill();
	p._x = x;
	p._y = y;
	p.onPress = function(){this.startDrag();}
	p.onMouseUp = function(){this.stopDrag();}
	return p;
}

Старый 21.11.2008, 15:37
Zik. вне форума Посмотреть профиль Отправить личное сообщение для Zik. Найти все сообщения от Zik.
  № 10  
Ответить с цитированием
Zik.
 
Аватар для Zik.

Регистрация: Nov 2007
Сообщений: 1,724
Вот
это вы намутили!!!

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

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

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


 


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


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