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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 16.02.2010, 09:33
Партизан вне форума Посмотреть профиль Отправить личное сообщение для Партизан Найти все сообщения от Партизан
  № 11  
Ответить с цитированием
Партизан
 
Аватар для Партизан

блогер
Регистрация: Nov 2007
Адрес: Almaty, Moscow
Сообщений: 396
Записей в блоге: 5
Отправить сообщение для Партизан с помощью Skype™
Цитата:
Сообщение от greegreeman Посмотреть сообщение
... а пока что попробую вариант, который предложил silin. буду шагать
Думаю быстрее и эффектвнее будет отрисовать битмап с мувика и пробежаться по нему.

Старый 16.02.2010, 10:31
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 12  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
аналоговый хак:
отрисовываем мувик в битмапдату1.
отрисовываем красную линию в битмапдату2.
мержим (или copyChanell) битмапдату1 по альфаканалу битмапдаты2 в битмапдату3(размер общий, зависит от заимного расположения).
или так: создаем битмапдату3 ( альфа=0) - размер которой зависит от размеров битмапа1 и битмапа2 и их расположения. копируем красный канал из битмапы2, копируем альфа канал из битмап1.
берём результирующую выборку по красному цвету не 0 альфы (getColorBoundsRect)
размер rect соответствует "степени пересечения"
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 16.02.2010 в 10:35.
Старый 16.02.2010, 10:52
greegreeman вне форума Посмотреть профиль Отправить личное сообщение для greegreeman Найти все сообщения от greegreeman
  № 13  
Ответить с цитированием
greegreeman
 
Аватар для greegreeman

Регистрация: Jan 2010
Сообщений: 147
Котяра, а не могли бы вы привести пример кодом, плиз. Я там в начале сразу указал, что у меня опыта не оч много моя первая игруха... буду весьма благодарен

Старый 16.02.2010, 11:02
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 14  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Однако же, если шаг будет больше, чем линия пересечения - можно тупо перескочить её.
Ну если тупо то можно. А если рисовать прямую, увеличивая ее на шаг - то перескочить не получится. Кроме того, надо использовать сужение поиска - начинать с середины линии и вести поиск границы, ориентируясь на "точка попала" и "точка не попала".
__________________
Reality.getBounds(this);

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

Регистрация: Jan 2010
Сообщений: 147
на самом деле, Wolsh, конечно прав. у этого алгоритма даже название есть... Wolsh, подскажи, плиз, как рисовать прямую, увеличивая ее шаг, если я пока рисую ее так
Код AS3:
var child:Shape = new Shape();
child.graphics.lineStyle(1, 0x990000);
child.graphics.moveTo(this.x, this.y);
child.graphics.lineTo(dirX, dirY);// dirX, dirY - координаты клика мышкой

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

блогер
Регистрация: Nov 2007
Адрес: Almaty, Moscow
Сообщений: 396
Записей в блоге: 5
Отправить сообщение для Партизан с помощью Skype™
Код AS3:
package {
	import flash.display.BitmapData;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Point;
 
	/**
	 * ...
	 * @author Mikhail Klabukov
	 */
	public class Main extends Sprite {
 
		private var shape:Shape = new Shape();
 
		public function Main():void {
			if (stage)
				init();
			else
				addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void {
 
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			shape.graphics.beginFill(0xFFCC00);
			shape.graphics.drawEllipse(200, 200, 100, 250);
			shape.graphics.endFill()
			addChild(shape);
 
			var startLine:Point = new Point(100, 100);
			var endLine:Point = new Point(500, 550);
 
			drawLine(startLine, endLine, 0x0000FF);
 
			checkIntersection(startLine, endLine);
		}
 
		private function checkIntersection(start:Point, end:Point):void {
 
			var bd:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0);
			bd.draw(shape)
			var distance:uint = Point.distance(start, end);
			end.offset(-start.x, -start.y);
			var angle:Number = Math.atan2(end.y, end.x);
			var arr:Array = [];
			while (distance--){
				var pnt:Point = Point.polar(distance, angle);
				pnt.offset(start.x, start.y);
				var col:uint = bd.getPixel(pnt.x, pnt.y);
				if (col){
					//trace("ПересечениеXY:",uint(pnt.x),uint(pnt.y))
					arr.push(pnt);
				}
			}
			if (arr.length){
				drawLine(arr[0], arr[arr.length - 1]);
 
				trace("Пересечение:", arr[arr.length - 1], arr[0])
				trace("Длина пересечения:", uint(Point.distance(arr[0], arr[arr.length - 1])) + "px")
			}
		}
 
		private function drawLine(start:Point, end:Point, color:Number = 0xff0000):void {
			var line:Shape = new Shape()
			line.graphics.lineStyle(2, color);
			line.graphics.moveTo(start.x, start.y);
			line.graphics.lineTo(end.x, end.y);
			line.graphics.endFill();
			addChild(line);
		}
	}
}

Старый 16.02.2010, 12:43
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 17  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,600
Записей в блоге: 17
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Ну если тупо то можно. А если рисовать прямую, увеличивая ее на шаг - то перескочить не получится. Кроме того, надо использовать сужение поиска - начинать с середины линии и вести поиск границы, ориентируясь на "точка попала" и "точка не попала".
Ну, конечно, если задать шаг в пиксель - то не проскочим - только вот цена такого алгоритма слишком дорога. Я бы так никогда не делал.

Старый 16.02.2010, 13:07
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 18  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
оптимизировать.
1) берем промежуток ограниченный баундсом мувика ( формулу сами посчитаете)
2) делаем шаг в delta = len/2 (посередине)
3) хиттестим.
если false уменьшаем шаг ( дихотомией, фибоначчи, золотым сечением итп) и в 3) так до 1 пикселя, чтоб быть уверенным что проверили всё. чтоб не хиттестить уже проверенные точки, можно их помечать - записывать в массив или еще как, хотя проверка наличия метки может быть дороже хиттеста)
нет здесь никакого экстремума)
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 16.02.2010 в 13:11.
Старый 16.02.2010, 13:21
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 19  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Цитата:
Сообщение от greegreeman Посмотреть сообщение
всем спасибо. похоже придется достать конспект по матану и сдуть пыль почитать про аппроксимацию. любую (практически любую) сложную фигуру можно свести к простой с определенной степенью точности... а пока что попробую вариант, который предложил silin. буду шагать
Ну так если точность не особо важна, так проще всего посчитать пересекаются ли окружность и прямая - нужно найти перпендикуляр к прямой проходящий через центр окружности и сравнить его с радиусом (если такой перпендикуляр не пересекается с данным отрезком, или радиус меньше длины перпендикуляра - не пересекаются, в противном случае - пересекаются). Аналогично просто посчитать пересекаются ли отрезок и прямоугольник - если крайняя правая точка отрезка левее прямоугольника, или нижняя точка выше, или крайняя левая - правее, или верхняя - ниже, то не пересекаются, в противном случае - пересекаются. Если вы можете описать многоугольник как массив отрезков - так мой первый вариант - будет самым простым решением т.как он как раз проверяет пересечение двух отрезков, просто переберите все отрезки из которых состоит многоугольник и проверьте пересечение.
__________________
Hell is the possibility of sanity

Старый 16.02.2010, 14:49
VovkaMorkovka1 вне форума Посмотреть профиль Отправить личное сообщение для VovkaMorkovka1 Посетить домашнюю страницу VovkaMorkovka1 Найти все сообщения от VovkaMorkovka1
  № 20  
Ответить с цитированием
VovkaMorkovka1

Регистрация: Nov 2008
Сообщений: 205
По теме: у меня где - то завалялась геометрическая либа. Определяет пересечение графисеских примитивов с прямыми. Кому надо напомните и вечером вставлю

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

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

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


 


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


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