Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript (http://www.flasher.ru/forum/forumdisplay.php?f=5)
-   -   [MX] Западло curveTo() (http://www.flasher.ru/forum/showthread.php?t=29384)

[subway]design 29.03.2002 17:52

[MX] Западло curveTo()
 
Вложений: 1
Вот функция:
Код:

 
function circle(obj, x, y, r) {
        //
        with (obj) {
                //
                moveTo(x-r, y);
                beginFill(0x003366);
                curveTo(x-r, y-r, x, y-r);
                curveTo(x+r, y-r, x+r, y);
                curveTo(x+r, y+r, x, y+r);
                curveTo(x-r, y+r, x-r, y);
                endFill();
                //       
        }
        //
}

Рисует синий кружочек в нужном муве (obj) с заданными координатами и радиусом. Что из этого получается - смотрите на скриншот.

Судя по всему, кривые реализованы как-то неправильно, поэтому я ввел поправочный коэффициент для координат углов квадрата (в него вписана окружность), так, что эти углы "убираются" внутрь него и поправляют контур круга:

Код:

 
function circle(obj, x, y, r,k) {
        //
        with (obj) {
                //
                moveTo(x-r, y);
                beginFill(0x003366);
                curveTo(x-r*k, y-r*k, x, y-r);
                curveTo(x+r*k, y-r*k, x+r, y);
                curveTo(x+r*k, y+r*k, x, y+r);
                curveTo(x-r*k, y+r*k, x-r, y);
                endFill();
                //       
        }
        //
}

Вот таблица для экспериментальных радиусов:
Код:


радиус (px)  |  k
______________|_______
              |             
    10        |  0.9   
    50        |  0.96
  100        |  0.97
              |

Но при изменении k заметны углы на стыках кривых. Так как же быть?

Хрюндик 29.03.2002 19:04

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

зы: наверное программеры из мокрой писали эту фичу в пьяном угаре(там среди них два русских :)))) ))))...

Дениска 29.03.2002 19:10

способ 1:
рисование окружностей 2-мя ПРЯМЫМИ линиями :)

function drawCircle(x, y, radius, cWidth) {
mc = _root.createEmptyMovieClip("circle"+cnt, ++cnt);
mc.lineStyle(radius, 0x000000, 100);
mc.moveTo(x, y);
mc.lineTo(x, y+.15);
mc.lineStyle(radius-cWidth, 0xffffff, 100);
mc.moveTo(x, y);
mc.lineTo(x, y+.15);
}
function redraw() {
cnt = 0;
for (i=0; i<100; i++) {
drawCircle(random(750), random(430), 10+random(150), 1+random(10));
}
}
redraw();
stop();


способ2:

function drawCircle(x, y, radius, startAngle, endAngle) {
segm = (endAngle-startAngle)/5;
this.moveTo(x+radius*Math.cos(startAngle*Math.rad), y+radius*Math.sin(startAngle*Math.rad));
for (var s = startAngle+segm; s<=endAngle+1; s += segm) {
var c_x = radius*Math.cos(s*Math.rad);
var c_y = radius*Math.sin(s*Math.rad);
var a_x = c_x+radius*Math.tan(segm/2*Math.rad)*Math.cos((s-90)*Math.rad);
var a_y = c_y+radius*Math.tan(segm/2*Math.rad)*Math.sin((s-90)*Math.rad);
this.curveTo(a_x+x, a_y+y, c_x+x, c_y+y);
}
}

_root.drawCircle(100, 100, 50, 0, 360);

Хрюндик 29.03.2002 19:19

beep, Дениска, а можно поподробнее, плз...

[subway]design 29.03.2002 21:40

2 Дениска:

Способ №1 - все гениальное воистину просто!

только прозрачную дырку не нарисуешь ;-)

Дениска 30.03.2002 10:03

Цитата:

Оригинал написал(а) Хрюндик
beep, Дениска, а можно поподробнее, плз...
в каком месте непонятно?

Хрюндик 30.03.2002 10:13

Если честно, то не понял как двумя ПРЯМЫМИ можно нарисовать окружность????!!!!....
как оно вообще работает(строки прокомментируй просто )

Aib 30.03.2002 12:13

Из параболы окружность не сделаешь, только приблизительно.
Ловите метод, риует эллипс (или его часть) под заданным углом. Точность - 927/1000.
Код:

function Ellipse(CenterX, CenterY, ARadius, BRadius, ARadAngle){
        if (arguments.length == 7){
                if (arguments[6] >= arguments[5]){
                        var StartAngle = arguments[5];
                        var EndAngle = arguments[6];
                } else {
                        var StartAngle = arguments[6];
                        var EndAngle = arguments[5];

                };
                var div = Math.ceil((EndAngle-StartAngle)/30)
                var delta = (EndAngle-StartAngle)/div;
        } else {
                var StartAngle = 0;
                var div = 12;
                var delta = 30;
        };
        with (Math){
                var ABRadius = ARadius/cos(PI*delta/360);
                var BBRadius = BRadius/cos(PI*delta/360);
                var te = round(ARadius*cos(PI*StartAngle/180)*10)/10;
                var Y1 = round(BRadius*sin(PI*StartAngle/180)*10)/10;
                var X1 = CenterX+te*cos(PI*ARadAngle/180)-Y1*sin(PI*ARadAngle/180);
                Y1 = CenterY-te*sin(PI*ARadAngle/180)-Y1*cos(PI*ARadAngle/180);
                var X2;
                var Y2;
                this.moveTo (X1, Y1);
                for (var i = 1; i<=div; i++){
                        te = round(ABRadius*cos(PI*(StartAngle+delta*(i-0.5))/180)*10)/10;
                        Y1 = round(BBRadius*sin(PI*(StartAngle+delta*(i-0.5))/180)*10)/10;
                        X1 = CenterX+te*cos(PI*ARadAngle/180)-Y1*sin(PI*ARadAngle/180);
                        Y1 = CenterY-te*sin(PI*ARadAngle/180)-Y1*cos(PI*ARadAngle/180);
                        te = round(ARadius*cos(PI*(StartAngle+delta*i)/180)*10)/10;
                        Y2 = round(BRadius*sin(PI*(StartAngle+delta*i)/180)*10)/10;
                        X2 = CenterX+te*cos(PI*ARadAngle/180)-Y2*sin(PI*ARadAngle/180);
                        Y2 = CenterY-te*sin(PI*ARadAngle/180)-Y2*cos(PI*ARadAngle/180);
                        this.curveTo (X1, Y1, X2, Y2);
                };
        };
        return this;
}
Object.prototype.ellipseTo = Ellipse;


Aib 30.03.2002 12:19

Да, про аргументы:
CenterX - координата X центра пересечения радиусов
CenterY - координата Y центра пересечения радиусов
ARadius - радиус А
BRadius - радиус B
ARadAngle - угол наклона радиуса А
StartAngle - начальный угол сегмента
EndAngle - конечный угол сегмента.

Последние два параметра можно не задавать. Тогда нарисуется эллипс целиком.

2Хрюндик. Никакого пьяного угара. Обычный NURBS

Хрюндик 30.03.2002 15:29

beep, офигеть! Жаль что мы еще эту чушь не проходили в школе :)

Aib 30.03.2002 16:38

:D Четыре года занятия 3D-MAX'ом не прошли даром :D
Если админы опубликуют мой урок по этой теме, то проходить что-то в "школе" и не потребуется.

[subway]design 30.03.2002 21:33

2 Хрюндик:

Ты обращал внимание, что линии рисуются с округлыми окончаниями?

Nox Noctis 30.03.2002 21:53

2Дениска
сам придумал ?
пять баллов :D :D :D

жалко только таким способом можно нарисовать круг, но никак не нарисовать окружность.....

[subway]design 30.03.2002 23:29

Только еще один минус есть:

mc.onPress()=function (){...}

не будет срабатывать при нажатии на линию.
А идея сама - суперская!

Nox Noctis 31.03.2002 01:20

2[subway]design
либо я тебя не понял, либо онПресс работает :)
делаю клип, внем рисую этим способом кружок, вешаю онПресс - и все в порядке.....

[subway]design 31.03.2002 01:32

Упс, у меня взаимодействия с линиями не работали раньше (может это в пятерке только), только с заливками. Поэтому неглядя послал. Простите.

А, вообще, это к лучшему :)

Aib 31.03.2002 11:44

2Дениска. И ещё эффект прозрачности в первом методе не проходит, а вообще, если нужно много маленьких цветных кружков, то лучше не придумаешь :D

Дениска 31.03.2002 11:57

и еще радиус больше 270 не работает :)
но если очень надо то можно маленькие скалить :)

вообще я это так, просто идею проверял. :) но вдруг кому пригодиться :)

Aib 31.03.2002 12:10

Но всё равно, классно!!!

Endryk 01.04.2002 11:19

Мужики вот вы такие умные выложили бы примерчик какой - нибудь, где это все используется.
Заранее спасибо. :)

Хрюндик 01.04.2002 17:06

2subway. Замечал :)... но все равно, плиз прокомментируйте строчки поочередно :)... особенно lineStyle() я думаю что в нем и есть вся суть...

[subway]design 01.04.2002 18:59

2 Хрюндик:

help (F1) -> lineStyle() :-)))

Код:

 
function drawCircle(x, y, radius, cWidth) {

// создаем пустой клип:
mc = _root.createEmptyMovieClip("circle"+cnt, ++cnt);

// Указываем, что рисовать надо линией толщиной radius, черным цветом и 100% непрозрачностью.
mc.lineStyle(radius, 0x000000, 100);

// Перемещаем "курсор" в указанные точки - центр окружности.
mc.moveTo(x, y);

// Рисуем линию минимально возможной длины, чтобы она нарисовалась и в тоже время была минимальной длины.
mc.lineTo(x, y+.15);

// Рисуем вторую:
// Радиус уменьшаем на указанную толщину линии - cWidth.
mc.lineStyle(radius-cWidth, 0xffffff, 100);

// Опять двигаем в х,у
mc.moveTo(x, y);

// Опять рисуем минимальной длины. Если будет длина=0, то нифига не будет :-)
mc.lineTo(x, y+.15);
}

Теперь понятно?

[subway]design 01.04.2002 19:05

Только, конечно radius влияет на толщину линии, а следовательно является диаметром окружности, а не радиусом :-) Дениска может запутать :-)

Useless 01.04.2002 19:09

2 Aib
 
А ты уверен, что это NURBS? По моим расчётам - это Безье второго порядка. Насколько мне известно - это не одно и то же. Я ошибаюсь?

Обидно, что нету Безье третьего порядка... :(

[subway]design 01.04.2002 19:20

Первый раз про порядки слышу... Если не влом, можно по-подробнее?

Useless 01.04.2002 19:53

Можно. Здесь.

[subway]design 01.04.2002 19:58

Спасибо.

Useless 01.04.2002 20:02

Не за что. Там ещё много полезного. И про NURBS'ы те же, и про RGB->HSB, и т.д., и т.п.

Хрюндик 01.04.2002 21:28

а... ясно :)... thanx огромныЙ! оказалось все таким элементарным...

Хрюндик 01.04.2002 21:31

прив еще раз... раз уж заговорили, кто нить скажет мне, дураку, что такое фракталы? а то помню еще по смольновской книжке... там был фрайтальный папоротник...
заранее большой сэнькс.
зы: сорри, за оффтопик...

//--------------исправления--------------------//
сорри, уже нашел на той ссылке... месагу не стер, потому что говорят неприлично :)...
//--------------конец исправлений----------//

Aib 02.04.2002 19:54

2 Useless
Проверял аппроксимацией. Но дело в том, что парабола получается как из NURBS, так и из Безье. Просто по построению это ближе к NURBS (контрольная точка - пересечение векторов, а не место их начала). Степень и впрямь вторая, и к третьей аппроксимируется ой как долго - лучше даже не трогать.

2Хрюндик
Фракталы - фигуры (тела), полученные многократным преобразованием комплексной плоскости (n-мерного комплексного пространства). Раскраска производиться в соответствии со скоплением точек в той или иной области.

Хрюндик 02.04.2002 21:54

ужас, вы все такие умные тут :).... я даже таких слов то не знаю :(...

znick 03.04.2002 00:32

?????????
 
Что то здесь много текста, нет времени читать.
Но неужели народ пытается программно рисовать во flash.
Разве это возможно. Неужели нарыли недокументированные возможности, может это уже для flash выше 5 версии?. Дайте, пожалуйста посмотреть, хотя бы один примитивный исходник. Заранее благодарен.

Aib 03.04.2002 01:23

2Хрюндик
Слова умные, как-никак фракталы - один из сложнейших разделов соврменной математики. Впрочем, не всё там так уж сложно. Если нужно, могу кое-что рассказать. ТОлько это тема не этого топика ;)

Nox Noctis 03.04.2002 16:01

вот здесь в общих чертах есть сведения на русском о фрактальной геометрии.

вот здесь информации гораздо больше (и с кусками кода :) ), но все на английском

Nox Noctis 04.04.2002 22:29

зацените :)
полный (абсолютный) маразм :D
кривая бабочки
замыкается за 6*2пи
(там счетчик есть, чтобы знать когда период заканчивается)

исходник там же - если вместо html приставить fla

sts 04.04.2002 22:41

крутой маразм!

Aib 05.04.2002 10:18

Весело! А вот у меня нет своего сайта, а здесь исходники на MX пока не берут :( :( :(

Nox Noctis 05.04.2002 12:00

ну, и у меня нет... я просто пользуюсь тем, что мне на народе вместе с почтой досталось для того чтобы всякие фишки выкладывать :)

сегодня ждите новых геометрических извратов :D

(зы: а бабочку я перекрасил =))) так прикольнее)

Nox Noctis 05.04.2002 17:54

поднадоели эти приколы... вот еще парочка, напоследок :)
первый
второй


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

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