Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash-арт (http://www.flasher.ru/forum/forumdisplay.php?f=29)
-   -   Посмотрите, если интересен факт создания круга из четырёх кривых Безьё (http://www.flasher.ru/forum/showthread.php?t=57235)

nuran 20.04.2004 07:55

Посмотрите, если интересен факт создания круга из четырёх кривых Безьё
 
Смотреть здесь:
http://www.flash.plux.ru/lab/flash/preview/2dspline/
Если понравится, качать здесь:
http://www.flash.plux.ru/board/viewtopic.php?t=158

Ріxеl 20.04.2004 15:53

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

Techmaker 20.04.2004 16:22

Цитата:

Оригинал написал(а) Ріxеl
а вот ElasticCircle довольно прикольно и мне понравился.
дык это тоже самое, только + 2 минуты импровизации. :)

bunker6 20.04.2004 17:24

это не круг. хотя и похоже.
http://www.bunker6.com/round.gif

Ріxеl 20.04.2004 19:31

Цитата:

Оригинал написал(а) Techmaker

дык это тоже самое, только + 2 минуты импровизации. :)

а что это не может быть прикольно и понравится?? ;)

Ріxеl 20.04.2004 19:44

Цитата:

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

Phagot 20.04.2004 20:21

Цитата:

во флэше нельзя програмно нарисовать круг. используя кривые безье радиусы будут не одинаковы
Вполне возможно! И даже восмью кривыми... Нет ну, если брать большие радиусы, то смещение в пару пикселов, конечно, возможно... но кого это интересует!? ;)

А вот и кодик из одного мануала:

function radians(degrees) {
return (Math.PI/180)*degrees;
}
theta = 45;
r = 100;
d = r/Math.cos(radians(0.5*theta));
this.lineStyle(1, 0x000000, 100);
this.moveTo(r, 0);
for (k=(theta/2); k<361; k=k+theta) {
xControl = d*Math.cos(radians(k));
yControl = d*Math.sin(radians(k));
xAnchor = r*Math.cos(radians(k+(theta/2)));
yAnchor = r*Math.sin(radians(k+(theta/2)));
this.curveTo(xControl, yControl, xAnchor, yAnchor);
}

Вполне ровненький круг выдает.

Ріxеl 20.04.2004 21:34

я говорил о геометрически правильном круге. тоесть без смещения на несколько пикселей.
кого это интересует?
бункера. чуть-чуть ;)

nuran 21.04.2004 07:31

Цитата:

Оригинал написал(а) bunker6
это не круг. хотя и похоже.
http://www.bunker6.com/round.gif

:D
Так это, там в коде есть такой коэфициент = 0.4. Если его точно подобрать,то круг получится, ну конечно не с точностью в 1 пиксель, но в два то точно. Самое главное - его нужно правильно подобрать. Я выставил 0.4, но нужно было видимо ещё повозится.

bunker6 21.04.2004 11:53

Цитата:

Оригинал написал(а) Ріxеl
во флэше нельзя програмно нарисовать круг
Цитата:

Оригинал написал(а) Ріxеl
кого это интересует?
бункера. чуть-чуть
ага. не то, чтобы очень. =)
я просто за название вещей своими именами.
этот "круг нурана" очевидно (невооруженными очами видно) — не круглый. можно было бы взять побольше точек(или сделать поменьше размер) — и это было бы кругом.
Цитата:

Оригинал написал(а) Ріxеl
я говорил о геометрически правильном круге
вряд ли имеет смысл говорить о геометрически правильных фигурах в дискретном пространстве. имеет смысл задуматься об абсолютном приближении к идеальному (настолько, насколько это возможно, см. выше) кругу, увеличивая количество точек.
если, конечно, это кому-нибудь надо =)

nuran, а вообще, прикольно.

Ріxеl 21.04.2004 20:13

Цитата:

Оригинал написал(а) bunker6

если, конечно, это кому-нибудь надо =)

ключевая фраза !!!

greyshaman 01.05.2004 00:21

Цитата:

Оригинал написал(а) Ріxеl

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

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

Ріxеl 01.05.2004 02:20

ну так может нарисуеш...

greyshaman 01.05.2004 03:40

да в общем то, тут есть, в том числе в моем исполнении, пошукай. :)

nuran 05.05.2004 07:10

Цитата:

Оригинал написал(а) Ріxеl
ну так может нарисуеш...
Так ведь кайф не в том, что это круг, а в том, что он из сплайна состоит :)

А если простой круг нужно нарисовать, то вот к примеру прототип мой (здесь кривые безьё совершенно не при чём и никакого тебе кайфа :):


MovieClip.prototype.circle = function(x, y, r) {

// Функция: circle
//
// Описание: Рисует окружность.
// x, y - координаты центра
// r - радиус окружности

var mas = new Array();
var step = 16;
var angle = 360/step;
var rad = Math.PI/180;
for (var i = 0; i<=step; i++) {
mas[i] = new Object();
mas[i].x = Math.cos(angle*rad*i)*r+x;
mas[i].y = Math.sin(angle*rad*i)*r+y;
}
this.moveTo(mas[0].x, mas[0].y);
for (var i = 0; i<step; i += 2) {
// curveThreeTo
var cx = 2*mas[i+1].x-0.5*(mas[i].x+mas[i+2].x);
var cy = 2*mas[i+1].y-0.5*(mas[i].y+mas[i+2].y);
this.curveTo(cx, cy, mas[i+2].x, mas[i+2].y);
}
};

Ріxеl 05.05.2004 17:28

так вся фишка и идёт про кривые безье.

2greyshaman
не нашёл. подтолкни на нужный след. уж очень интерестно

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

greyshaman 09.05.2004 00:04

дядька Брезенхейм нам казал что окружность на матрице можно нарисовать с точностью около 0.7
запусти ниже следующее и посмотри на радиус который
возвращают точки полученные по Безье.

r=100;
num=8;
ang=0;
dang=Math.PI/num;

while(ang<2*Math.PI){
x1=r*Math.cos(ang);
y1=r*Math.sin(ang);
x2=2*r*Math.cos(ang+dang)-0.5*r*(Math.cos(ang)+Math.cos(ang+2*dang));
y2=2*r*Math.sin(ang+dang)-0.5*r*(Math.sin(ang)+Math.sin(ang+2*dang));
x3=r*Math.cos(ang+2*dang);
y3=r*Math.sin(ang+2*dang);
calc (x1,x2,x3,y1,y2,y3);
ang+=2*dang;
}

function B1 (t) {
return (t*t);
}
function B2 (t) {
return (2*t*(1-t));
}
function B3 (t) {
return ((1-t)*(1-t));
}

function calc (x1,x2,x3,y1,y2,y3) {
count = 0;
detailBias = 1/59;
level = 1;
do {
x = x1*B1(count)+x2*B2(count)+x3*B3(count);
y = y1*B1(count)+y2*B2(count)+y3*B3(count);
r=Math.sqrt(x*x+y*y);

trace(r);
count += detailBias;
} while (count<=1);
}


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

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