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

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

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

блогер
Регистрация: Apr 2009
Адрес: НиНо
Сообщений: 185
Записей в блоге: 12
Question Бесконечная полуплоскость

Задача:
Задана полуплоскость через точку, лежащую на граничной прямой и нормаль к прямой.
Нужно отрисовать это дело на Shape(т.е. тупо на Graphics). Моё решение такое:
Код AS3:
//levelx, levely - точка на прямой
//nx, ny - нормаль
//рисую просто большой прямоугольник, который в конечном итоге не виден за границами окна
public function draw():void
{
 
	canvas.graphics.beginFill(0x0000FF,0.2);
	var x1:Number;
	var y1:Number;
	var x2:Number;
	var y2:Number;
	x1=levelx-1000*ny;
	y1=levely+1000*nx;
	x2=levelx+1000*ny;
	y2=levely-1000*nx;
	canvas.graphics.moveTo(x1,y1);
	canvas.graphics.lineTo(x2,y2);
	canvas.graphics.lineTo(x2+1000*nx,y2+1000*ny);
	canvas.graphics.lineTo(x1+1000*nx,y1+1000*ny);
	canvas.graphics.lineTo(x1,y1);
	canvas.graphics.endFill();
}
Вопрос прост: можно ли это лучше сделать? в смысле есть ли у flash'а какие-то возможности по рисованию незамкнутых областей?

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

блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
Во флеш нет такой возможности. Вы выбрали правильное направление, но думаю лучше рисовать трапецию ограниченную по экрану — так флеш плееру не придется пытаться рисовать заведомоневидимые участки фигуры.
__________________
TankiOnline
Я разработчик Alternativa3D

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

блогер
Регистрация: Apr 2009
Адрес: НиНо
Сообщений: 185
Записей в блоге: 12
Флэш по сути сам должен clipping делать.. но лучше и вправду сделаю трапецию.
В принципе параметры этой плоскости изменяются редко, так что можно 1 раз посчитать координаты трапеции, сделать из него Path и потом тупо drawPath с заливкой делать..
спасибо за ответ

Добавлено через 4 часа 5 минут
Сделал, но получилось довольно громоздко. Если кому вдруг пригодится:

Код AS3:
		var command:Vector.<int>;
		var coord:Vector.<Number>;
 
                //...
 
		//Рисуем полуплоскость
		public function draw():void
		{
			if (visible)
			{
				canvas.graphics.beginFill(Color);
				canvas.graphics.drawPath(command,coord);
				canvas.graphics.endFill();
			}
		}
		//Пересчёт области, изображающей полуплоскость
		private function recalcPath():void
		{
			var w:Number;
			var h:Number;
			var b1:Boolean;
			var b2:Boolean;
			var b3:Boolean;
			var b4:Boolean;
			w=canvas.stage.width;
			h=canvas.stage.height;
			b1=(_levelx*_nx     +_levely*_ny>0);
			b2=((_levelx-w)*_nx +_levely*_ny>0);
			b3=((_levelx-w)*_nx +(_levely-h)*_ny>0);
			b4=(_levelx*_nx     +(_levely-h)*_ny>0);
 
			command=new Vector.<int>;
			coord=new Vector.<Number>;
 
			if(!(b1 || b2 || b3 || b4))
				return;
 
			command.push(GraphicsPathCommand.MOVE_TO);
			if(b1 && b2 && b3 && b4)
			{
				coord.push(0,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,0);
				return;
			}
 
			if(b4 && !b1 && b2)
			{
				coord.push(w,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,_levely+_levelx*_ny/_nx);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(_levelx+_levely*_nx/_ny,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,0);
				return;
			}
 
			if(b1 && !b2 && b3)
			{
				trace(4);
				coord.push(w,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(_levelx+_levely*_ny/_nx,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,_levely+(_levelx-w)*_nx/_ny);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,h);
				return;
			}
 
			if(b2 && !b3 && b4)
			{
				coord.push(0,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,_levely+(_levelx-w)*_nx/_ny);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(_levelx+(_levely-h)*_ny/_nx,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,h);
				return;
			}
 
			if(b3 && !b4 && b1)
			{
				coord.push(0,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(_levelx+(_levely-h)*_ny/_nx,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,_levely+_levelx*_nx/_ny);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,h);
				return;
			}
 
			if(!b4 && b1 && !b2)
			{
				coord.push(0,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(_levelx+_levely*_ny/_nx,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,_levely+_levelx*_nx/_ny);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,0);
				return;
			}
 
			if(!b1 && b2 && !b3)
			{
				coord.push(w,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,_levely+(_levelx-w)*_nx/_ny);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(_levelx+_levely*_ny/_nx,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,0);
				return;
			}
 
			if(!b2 && b3 && !b4)
			{
				coord.push(w,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(_levelx+(_levely-h)*_ny/_nx,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,_levely+(_levelx-w)*_nx/_ny);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,h);
				return;
			}
 
			if(b1 && b2)
			{
				coord.push(0,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,_levely+(_levelx-w)*_nx/_ny);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,_levely+_levelx*_nx/_ny);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,0);
				return;
			}
 
			if(b2 && b3)
			{
				coord.push(w,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(_levelx+(_levely-h)*_ny/_nx,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(_levelx+_levely*_ny/_nx,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,0);
				return;
			}
 
			if(b3 && b4)
			{
				coord.push(w,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,_levely+_levelx*_nx/_ny);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,_levely+(_levelx-w)*_nx/_ny);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(w,h);
				return;
			}
 
			if(b4 && b1)
			{
				coord.push(0,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(_levelx+_levely*_ny/_nx,0);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(_levelx+(_levely-h)*_ny/_nx,h);
				command.push(GraphicsPathCommand.LINE_TO);
				coord.push(0,h);
				return;
			}
		}
Я тут рассмотрел все возможные случаи, когда получаем трапецию, треугольник, 5-угольник, весь прямоугольник и ничего

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

Теги
геометрия , незамкнутая область , полуплоскость

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

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


 


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


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