Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Сглаживание линий при программном рисовании (http://www.flasher.ru/forum/showthread.php?t=139760)

Zorro_13 10.05.2010 19:27

Сглаживание линий при программном рисовании
 
Вроде были подобные темы - но поиск не дал результатов.
Проблема: При рисовании мышью, если быстро крутить спирали - то можно увидеть, что спираль - угловатая. Нужно закруглять данные места через
Код AS3:

curveTo()

? Но вот как это сделать - может кто знает алгоритмы, методы.

Подскажите пожалуйста.

p.s. На данный момент - координаты собираются в два массива - xCord, yCord.

Zebestov 10.05.2010 19:43

а как часто кто-то именно по делу будет быстро крутить спирали, чтобы ради этого грузить всю рисовалку процессом вычисления кривых безье, например. и это при каждом, что там у тебя: MOUSE_MOVE/ENTER_FRAME

надо взвесить целесообразность. а если все-таки надо, то можно для начала тут побывать.

Zorro_13 10.05.2010 19:53

Без сглаживания уже сделано - но вот решил модифицировать.
Понимаю, что нагрузка будет больше чем просто так, но просто хочется посмотреть как оно будет - сильно грузить - или терпимо :)

http://bezier.ru/ - тут был. Просто думал может есть какие-то наработки в этом плане(не всё готовое конечно :), а описание алгоритма - что делать с собранными координатами).
Проблема(!) не новая ведь.

silin 10.05.2010 20:44

глянь http://silin.su/#AS3/geom/fit

Zorro_13 10.05.2010 20:56

silin
Спасибо.
Разбираемся.

fljot 10.05.2010 23:15

нееет, глянь лучше сюда http://www.flashandmath.com/advanced...raw/index.html

Zorro_13 10.05.2010 23:42

fljot
Да это находил.
Ну там иногда перекручивает.
Но тоже гляжу.

Obi 11.05.2010 00:58

Да ладно вам ерундой заниматься. Даже в виндовом пейнте такой эффект наблюдается )

HotIceCream 11.05.2010 01:26

Цитата:

Сообщение от Obi (Сообщение 907309)
Да ладно вам ерундой заниматься. Даже в виндовом пейнте такой эффект наблюдается )

мм реально) .. я тоже парился насчет угловатости линий в своем приложении... но теперь забуду)

Zorro_13 11.05.2010 03:10

HotIceCream, Obi
Да меня тоже устраивает - но захотелось улучшить - потому решил спросить.

p.s. Сейчас в контакте посмотрел - там сделали скругление.

silin 11.05.2010 13:16

попробуй еще совсем по-простому
Код AS3:

public class Main extends Sprite 
{
 
        private var _points:Array/*Point*/ = [];
 
        public function Main():void
        {
 
                stage.addEventListener(MouseEvent.MOUSE_DOWN, onPress);
                stage.addEventListener(MouseEvent.MOUSE_UP, onRelease);
        }
 
        private function onRelease(e:MouseEvent):void
        {
                removeEventListener(Event.ENTER_FRAME, render);
        }
 
        private function onPress(e:MouseEvent):void
        {
                addEventListener(Event.ENTER_FRAME, render);
        }
 
        private function render(e:Event):void
        {
                _points.push(new Point(mouseX, mouseY));
 
                graphics.clear();
                graphics.lineStyle(12, 0x0);
                graphics.moveTo(_points[0].x, _points[0].y);
                for (var i:int = 1; i < _points.length; i++)
                {
                        graphics.curveTo(_points[i - 1].x, _points[i - 1].y, (_points[i].x + _points[i - 1].x) / 2, (_points[i].y + _points[i - 1].y) / 2);
                }
        }
 
}


Zorro_13 11.05.2010 23:02

silin
Спасибо за помощь.

Будем пробовать.

HotIceCream 12.05.2010 00:46

Цитата:

Сообщение от silin (Сообщение 907401)
Код AS3:

        graphics.curveTo(_points[i - 1].x, _points[i - 1].y, (_points[i].x + _points[i - 1].x) / 2, (_points[i].y + _points[i - 1].y) / 2);


а разве опорная точка не лежит ровно посередине между i и i-1 ? имхо опорная точка должна вычисляться сиходя из следующих соображений.
1) находим уравнение серединного перпендикуляра между i-1 и i точками
2) между i-2 и i-1 тоже серед перпендикуляр
3) находим точку пересечения (центр окружности)
4) находим расстояния от точки пересечения до i точки (любой из наших точек) = R
5) делим угол между между точками : i-1, центром окружности, i точкой пополам
6) откладываем от центра по найденному в 5 пункте направлению расстояние R - получим точку опорную.

чет мне влом самому это делать))

Либо просто делать опорной i-1 а проводить от i-2 до i


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

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