![]() |
|
||||||||||
|
|||||
|
Регистрация: Oct 2001
Адрес: в Петербурге
Сообщений: 2,430
|
Вот функция:
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();
//
}
//
}
Судя по всему, кривые реализованы как-то неправильно, поэтому я ввел поправочный коэффициент для координат углов квадрата (в него вписана окружность), так, что эти углы "убираются" внутрь него и поправляют контур круга:
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();
//
}
//
}
Но при изменении k заметны углы на стыках кривых. Так как же быть? |
|
|||||
|
хех, ты глянь в мокромедийный исходник в хелпе, у них тоже скругленный квалрат рисуется
)))).... имхо я рисовал пикселями через синусы и косинусы... правда с заливкой траблы (((....зы: наверное программеры из мокрой писали эту фичу в пьяном угаре(там среди них два русских ))) ))))... |
|
|||||
|
"редиска"
|
способ 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);
__________________
cleoag.ru |
|
|||||
|
beep, Дениска, а можно поподробнее, плз...
|
|
|||||
|
Регистрация: Oct 2001
Адрес: в Петербурге
Сообщений: 2,430
|
2 Дениска:
Способ №1 - все гениальное воистину просто! только прозрачную дырку не нарисуешь ;-) |
|
|||||
|
Если честно, то не понял как двумя ПРЯМЫМИ можно нарисовать окружность????!!!!....
как оно вообще работает(строки прокомментируй просто ) |
|
|||||
|
Регистрация: Oct 2001
Адрес: Россия, Казань
Сообщений: 270
|
Из параболы окружность не сделаешь, только приблизительно.
Ловите метод, риует эллипс (или его часть) под заданным углом. Точность - 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;
__________________
The war does not determine who is right. Only who is left. |
|
|||||
|
Регистрация: Oct 2001
Адрес: Россия, Казань
Сообщений: 270
|
Да, про аргументы:
CenterX - координата X центра пересечения радиусов CenterY - координата Y центра пересечения радиусов ARadius - радиус А BRadius - радиус B ARadAngle - угол наклона радиуса А StartAngle - начальный угол сегмента EndAngle - конечный угол сегмента. Последние два параметра можно не задавать. Тогда нарисуется эллипс целиком. 2Хрюндик. Никакого пьяного угара. Обычный NURBS
__________________
The war does not determine who is right. Only who is left. |
|
|||||
|
beep, офигеть! Жаль что мы еще эту чушь не проходили в школе
![]() |
![]() |
Часовой пояс GMT +4, время: 17:47. |
|
|
« Предыдущая тема | Следующая тема » |
|
|