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

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

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

Регистрация: Jan 2014
Сообщений: 57
Question Алгоритм рисования пунктирной линии

Требуется алгоритм рисования пунктирной линии ( горизонтальной или вертикальной, диагональная без надобности ). Сам накидывал что-то простенькое, но достаточно странный результат получал - линия рисуется не до конца, причем чем она длиннее, тем больше недорисованная часть. Код приведен ниже. Ваши мысли, подсказки ?)
Код AS3:
 
function dashedLine(X1,Y1,X2,Y2:Number)
		{
			var prevX,prevY: Number;
			var dash: Number = 20;
			var gap: Number = 10;
			var distance: Number = (Math.sqrt(Math.pow((X2-X1),2)+Math.pow((Y2-Y1),2)));
			var steps: Number = Math.round(distance/(dash+gap));
			var i:int;
 
			trace('Distance: '+distance);
			trace('Steps: '+steps);
			trace('Estimated length: '+steps*30);
 
			for (i=0;i<steps;i++)
			{
				prevX=i*dash;
				prevY=0;
				trace('Prev X = '+prevX);
				trace('Prev Y = '+prevY);
				this.graphics.lineTo(prevX,prevY);
				this.graphics.moveTo(prevX+gap,prevY);
			}
 
		}

Старый 27.05.2014, 00:42
LifeIsRhythm вне форума Посмотреть профиль Отправить личное сообщение для LifeIsRhythm Найти все сообщения от LifeIsRhythm
  № 2  
Ответить с цитированием
LifeIsRhythm
[+1 22.07.14]
[+4 12.08.14]
[+1 09.02.15]

Регистрация: May 2014
Сообщений: 182
Можно немного покороче -
Код AS3:
public static function drawDottedLine(graphics:Graphics, start:Point, finish:Point, doteLineSize:Number = 5, gap:Number = 5):Graphics
{
	var vector:Point = new Point(finish.x - start.x, finish.y - start.y);
	var length:Number = Math.sqrt(vector.x * vector.x + vector.y * vector.y);
	var unitVector:Point = new Point(vector.x / length,  vector.y / length);
 
	var fullStep:Number = doteLineSize + gap;
 
	var iterations:int = length / fullStep;
 
	var roulette:Number = 0
 
	for (var i:int = 0; i < iterations; i++) 
	{
		graphics.moveTo(start.x + roulette * unitVector.x, start.y + roulette * unitVector.y);
		roulette += doteLineSize;
		graphics.lineTo(start.x + unitVector.x * roulette, start.y + unitVector.y * roulette);
		roulette += gap;
	}
 
	return graphics;
}

Старый 27.05.2014, 11:40
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 3  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Вот и предложили вариант посимпатичнее.
Разве что, для вычисления длины вектора я бы использовал Point:length.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

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

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,921
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
А оптимальней было бы вообще не создавать экземпляр Point'а, а сделать все вычисления без него.
__________________
There is no thing in this world that is not simple.

Старый 27.05.2014, 13:03
LifeIsRhythm вне форума Посмотреть профиль Отправить личное сообщение для LifeIsRhythm Найти все сообщения от LifeIsRhythm
  № 5  
Ответить с цитированием
LifeIsRhythm
[+1 22.07.14]
[+4 12.08.14]
[+1 09.02.15]

Регистрация: May 2014
Сообщений: 182
Цитата:
Разве что, для вычисления длины вектора я бы использовал Point:length.
А можно поинтересоваться, почему?

Старый 27.05.2014, 13:39
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 6  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Потому что у нас уже есть vector.
К чему плодить лишний код.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Можно через битмапу пунктирную линию организовать
Код AS3:
package  {
 
	import flash.display.BitmapData;
	import flash.display.Sprite;
 
	public class TestClass extends Sprite {
 
		private var _gap:int = 3;
		private var _lineWidth:int = 1;
 
		public function TestClass() {
			drawLine();
		}
 
		private function drawLine():void {
			var white:BitmapData = new BitmapData(_gap * 2, _lineWidth, false, 0xFFFFFF);
			var black:BitmapData = new BitmapData(_gap, _lineWidth, false, 0x000000);
			white.draw(black);
			black.dispose();
			graphics.lineStyle(_lineWidth);
			graphics.lineBitmapStyle(white, null, true, true);
			graphics.moveTo(100, 100);
			graphics.lineTo(450, 300);
			graphics.lineTo(600, 300);
		}
	}
}
__________________
Ко мне можно и нужно обращаться на ты)

Старый 27.05.2014, 13:58
LifeIsRhythm вне форума Посмотреть профиль Отправить личное сообщение для LifeIsRhythm Найти все сообщения от LifeIsRhythm
  № 8  
Ответить с цитированием
LifeIsRhythm
[+1 22.07.14]
[+4 12.08.14]
[+1 09.02.15]

Регистрация: May 2014
Сообщений: 182
Цитата:
Потому что у нас уже есть vector.
К чему плодить лишний код.
Вы наверное об этом? Да, так на строчку короче! Но эта разница достойна того, кто вообще не пользуется фраймворками, которые содержат чересчур много излишеств А ещё и нативный метод на 40% медленнее, а Point я использовал только для того, чтобы ТС было понятней.
Код AS3:
public static function drawDottedLine(graphics:Graphics, start:Point, finish:Point, doteLineSize:Number = 5, gap:Number = 5):Graphics
{
	var vector:Point = new Point(finish.x - start.x, finish.y - start.y);
	var unitVector:Point = new Point(vector.x / length,  vector.y / length);
 
	var fullStep:Number = doteLineSize + gap;
 
	var iterations:int = vector.length / fullStep;
 
	var roulette:Number = 0
 
	for (var i:int = 0; i < iterations; i++) 
	{
		graphics.moveTo(start.x + roulette * unitVector.x, start.y + roulette * unitVector.y);
		roulette += doteLineSize;
		graphics.lineTo(start.x + unitVector.x * roulette, start.y + unitVector.y * roulette);
		roulette += gap;
	}
 
	return graphics;
}

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Но эта разница достойна того, кто вообще не пользуется фраймворками
То есть мазохиста
__________________
Ко мне можно и нужно обращаться на ты)

Старый 27.05.2014, 14:23
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 10  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
А вообще, если не хочется придумывать велосипед, есть совершенно замечательно решение.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

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

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

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


 


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


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