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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.05.2008, 02:31
LinuxVideo вне форума Посмотреть профиль Найти все сообщения от LinuxVideo
  № 1  
Ответить с цитированием
LinuxVideo
Banned

Регистрация: Oct 2007
Сообщений: 269
По умолчанию Ручное рисование сглаженных линий. Как?

Ловлю события мышки, дальше через Sprite.graphics рисую, результат отправляется на сервер.
Но если рисовать только lineTo, то получается не слишком красиво, да и узлов много.
Нужен какой-то быстрый алгоритм, который бы сглаживал линии, да удалял лишние узлы, дабы на выходе были кривые безье.
Как в самом FlashIDE - нарисовал кривульку, отпустил кнопку - оно сгладилось. А вот как это сделать - пока не нашел способа. Буду рад любому намеку на нужное направление, а то в гугле пока ничего толкового не выудил.

Старый 13.05.2008, 02:49
badun вне форума Посмотреть профиль Отправить личное сообщение для badun Найти все сообщения от badun
  № 2  
Ответить с цитированием
badun

Регистрация: Dec 2007
Сообщений: 269
не совсем то что тебе надо, тут точки не сглаживаются, просто слишком частые игнорируются ))
а по сглаживанию тут поищи
Код:
package  
{
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	
	/**
	* ...
	* @author Oleg Kucherenko
	*/
	public class DrawCurve extends Sprite
	{
		private var newPoint:Point;
		private var anchorPoint:Point;
		private var controlPoint:Point;
		private var dots:Sprite;
		
		
		/**
		 * Constructor
		 */
		public function DrawCurve() 
		{
			graphics.lineStyle(4);
			
			dots = new Sprite();
			addChild(dots);
			
			stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
			stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
			
			stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
		}
		
		
		/**
		 * Show/hide dots
		 */
		private function onKeyDown(e:KeyboardEvent):void 
		{
			dots.visible = !dots.visible;
		}
		
		
		/**
		 * MOUSE_DOWN event handler
		 */
		private function onMouseDown(e:MouseEvent):void 
		{
			stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
			anchorPoint = new Point(e.localX, e.localY);
			controlPoint = anchorPoint.clone();
			graphics.moveTo(anchorPoint.x, anchorPoint.y);
			
			// start curve
			drawCurve(new Point(e.localX, e.localY));
		}
		
		
		/**
		 * MOUSE_UP event handler
		 */
		private function onMouseUp(e:MouseEvent):void 
		{
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
			
			// finish curve
			drawCurve(new Point(e.localX, e.localY));
			drawCurve(new Point(e.localX, e.localY));
		}
		
		
		/**
		 * MOUSE_MOVE event handler
		 */
		private function onMouseMove(e:MouseEvent):void 
		{
			newPoint = new Point(e.localX, e.localY);
			if (newPoint.subtract(anchorPoint).length > 32) 
				drawCurve(newPoint);
		}
		
		
		/**
		 * Draw curve
		 */
		private function drawCurve(newPoint:Point):void 
		{
			drawDot(newPoint);
			
			anchorPoint = controlPoint.add(newPoint);
			anchorPoint.x /= 2;
			anchorPoint.y /= 2;
			
			graphics.curveTo(controlPoint.x, controlPoint.y, anchorPoint.x, anchorPoint.y);
			
			controlPoint = newPoint;
		}
		
		
		/**
		 * Draw dot
		 */
		private function drawDot(position:Point):void 
		{
			var shape:Shape = new Shape();
			shape.graphics.lineStyle(0);
			shape.graphics.beginFill(0xFFFFFF);
			shape.graphics.drawCircle(0, 0, 2.5);
			shape.graphics.endFill();
			shape.graphics.lineStyle();
			dots.addChild(shape);
			shape.x = position.x;
			shape.y = position.y;
		}
		
	}
	
}


Последний раз редактировалось badun; 13.05.2008 в 02:56.
Старый 13.05.2008, 03:40
LinuxVideo вне форума Посмотреть профиль Найти все сообщения от LinuxVideo
  № 3  
Ответить с цитированием
LinuxVideo
Banned

Регистрация: Oct 2007
Сообщений: 269
Цитата:
Сообщение от badun Посмотреть сообщение
не совсем то что тебе надо, тут точки не сглаживаются, просто слишком частые игнорируются ))
Мне скорее наоборот, слишком редкие надо править
Вот тут стрелочкой показан такой фрагмент. Явно виден угол, а его как бы не должно быть, линия должна быть плавной.
Изображения
 

Старый 13.05.2008, 04:05
badun вне форума Посмотреть профиль Отправить личное сообщение для badun Найти все сообщения от badun
  № 4  
Ответить с цитированием
badun

Регистрация: Dec 2007
Сообщений: 269
Надо использовать curveTo вместо lineTo. А чтобы не было изломов на стыках кривых, смежные контрольные точки должны лежать на одной прямой с якорной точкой.

Старый 13.05.2008, 09:19
LinuxVideo вне форума Посмотреть профиль Найти все сообщения от LinuxVideo
  № 5  
Ответить с цитированием
LinuxVideo
Banned

Регистрация: Oct 2007
Сообщений: 269
> должны лежать на одной прямой с якорной точкой

Что есть якорная точка?

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

Регистрация: Apr 2001
Адрес: Berlin
Сообщений: 1,862
Отправить сообщение для derhab с помощью ICQ Отправить сообщение для derhab с помощью Skype™
F1 - > anchor points - > search
__________________
freelance | Раздор

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

Регистрация: Nov 2005
Сообщений: 1,155
Ваша проблема не нова, вот тут уже обсуждалось, там и ссылку найдете http://flasher.ru/forum/showthread.php?t=111457

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

Теги
рисование

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

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


 


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


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