![]() |
|
||||||||||
|
|||||
|
Регистрация: Jan 2014
Сообщений: 57
|
Требуется алгоритм рисования пунктирной линии ( горизонтальной или вертикальной, диагональная без надобности ). Сам накидывал что-то простенькое, но достаточно странный результат получал - линия рисуется не до конца, причем чем она длиннее, тем больше недорисованная часть. Код приведен ниже. Ваши мысли, подсказки ?)
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); } } |
|
|||||
|
[+1 22.07.14]
[+4 12.08.14] [+1 09.02.15] Регистрация: May 2014
Сообщений: 182
|
Можно немного покороче -
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; } |
|
|||||
|
Вот и предложили вариант посимпатичнее.
Разве что, для вычисления длины вектора я бы использовал Point:length.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. |
|
|||||
|
[+1 22.07.14]
[+4 12.08.14] [+1 09.02.15] Регистрация: May 2014
Сообщений: 182
|
Цитата:
|
|
|||||
|
Потому что у нас уже есть vector.
К чему плодить лишний код.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. |
|
|||||
|
Можно через битмапу пунктирную линию организовать
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); } } }
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
|
[+1 22.07.14]
[+4 12.08.14] [+1 09.02.15] Регистрация: May 2014
Сообщений: 182
|
Цитата:
А ещё и нативный метод на 40% медленнее, а Point я использовал только для того, чтобы ТС было понятней.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; } |
![]() |
![]() |
Часовой пояс GMT +4, время: 00:47. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|