Просмотр полной версии : Нарисовать круг при помощи As?
Как при помощи AS нарисовать круг и по мере необходимости в дальнейшем менять его радиус?
Nox Noctis
24.11.2003, 19:10
пользоваться поиском :)
и читать внимательно.
http://www.flasher.ru/forum/showthread.php?s=&threadid=29384&highlight=%EE%EA%F0%F3%E6%ED%EE%F1%F2%FC
юзай код
Object.prototype.circleTo = circle;
function circle(radius, NumberOfSteps, Xcenter, Ycenter, thickness, rgb, alpha) {
Arr = [50, 10, 0, 0, 2, 0, 100];
for (var i = 0; i<7; i++) {
if (arguments[i] != undefined) {
Arr[i] = arguments[i];
}
}
var R = Arr[0];
var X0 = Arr[2];
var Y0 = Arr[3];
var step = 2*Math.PI/Arr[1];
var R1 = R/Math.cos(step/2);
this.lineStyle(Arr[4], Arr[5], Arr[6]);
this.moveTo(X0+R, Y0);
for (var phi = step; phi<=2*Math.PI; phi += step) {
var ControlX = X0+R1*Math.cos(phi-step/2);
var ControlY = Y0-R1*Math.sin(phi-step/2);
var AnchorX = X0+R*Math.cos(phi);
var AnchorY = Y0-R*Math.sin(phi);
this.curveTo(ControlX, ControlY, AnchorX, AnchorY);
}
}
_root.circleTo(100, 15, 200, 200, 4, 0x00BB00, 100);
а еще так
r = 30;
_root.createEmptyMovieClip("okr", 1);
okr.beginFill(0x000000, 0);
okr.lineStyle(1, 0x000000, 100);
okr.moveTo(-1*_root.r, 0);
for (x=_root.r*-1; x<=_root.r; x++) {
y = Math.sqrt(Math.pow(_root.r, 2)-Math.pow(x, 2));
okr.lineTo(x, y);
}
for (x=_root.r; x>=-1*_root.r; x--) {
y = -1*Math.sqrt(Math.pow(_root.r, 2)-Math.pow(x, 2));
okr.lineTo(x, y);
}
или так
_root.createEmptyMovieClip("cir", 1);
with (_root.cir) {
lineStyle(1, 0x000000, 100);
beginFill(0x000000, 50);
moveTo(200, 200);
curveTo(200, 180, 215, 165);
curveTo(230, 150, 250, 150);
curveTo(270, 150, 285, 165);
curveTo(300, 180, 300, 200);
curveTo(300, 220, 285, 235);
curveTo(270, 250, 250, 250);
curveTo(230, 250, 215, 235);
curveTo(200, 220, 200, 200);
endFill();
}
а можно и так
var R = 100;
// радиус окружности
var X0 = 200;
// координата X центра окружности
var Y0 = 200;
// координата Y центра окружности
var N = 100;
// количество отрезков, из которых должна быть построена окружность
_root.createEmptyMovieClip("roun", 0);
// создаем холст
with (roun) {
// используем предложение with для упрощения набора кода
lineStyle(2, 0xFF0000, 100);
// окружность будет рисоваться красной непрозрачной линией толщиной в 2 px
moveTo(X0+R*Math.cos(0), Y0+R*Math.sin(0));
// опускаем перо в начальной точке рисования (a =0)
// последовательно соединяем все N точек, соответствующих изменению (от 0 до 2p
for (var alpha = 0; alpha<=2*Math.PI; alpha += 2*Math.PI/N) {
lineTo(X0+R*Math.cos(alpha), Y0-R*Math.sin(alpha));
}
}
да и забыл самый сложны способ
lineStyle(100, 0x000000, 100);
moveTo(100, 100);
lineTo(100.5, 100);
Осталься вопрос, если несложно:
Можно ли после того как круг нарисован плавно менять его радиус, т.е. эффект увеличения и уменьшения круга, а не резкий скачёк скажем с 10 до 120.
я бы попробывал через scale, но может есть лучший вариант?
да какже забыл самый оптимальный способ
_root.createEmptyMovieClip("circl", -1);
circl.lineStyle(2, 0x000000, 100);
circl.moveTo(0, 0);
circl.lineTo(0, 100);
for (i=0; i<361; i++) {
_root.circl.duplicateMovieClip("cir"+i, i);
setProperty("cir"+i, _rotation, i);
}
_x = 150;
_y = 150;
ну что SanD ты догодался кокой твой мозг быстрый и догадливый из стольки способов в твою голову не пришол не один
зы кушай морковку помогает
2 Орех
Сенкс за варианты, теперь осталось дело за малым выбрать любой...
ultraflasher
25.11.2003, 09:57
Оригинал написал(а) opex
юзай код
Object.prototype.circleTo = circle;
function circle(radius, NumberOfSteps, Xcenter, Ycenter, thickness, rgb, alpha) {
Arr = [50, 10, 0, 0, 2, 0, 100];
for (var i = 0; i<7; i++) {
if (arguments[i] != undefined) {
Arr[i] = arguments[i];
}
}
var R = Arr[0];
var X0 = Arr[2];
var Y0 = Arr[3];
var step = 2*Math.PI/Arr[1];
var R1 = R/Math.cos(step/2);
this.lineStyle(Arr[4], Arr[5], Arr[6]);
this.moveTo(X0+R, Y0);
for (var phi = step; phi<=2*Math.PI; phi += step) {
var ControlX = X0+R1*Math.cos(phi-step/2);
var ControlY = Y0-R1*Math.sin(phi-step/2);
var AnchorX = X0+R*Math.cos(phi);
var AnchorY = Y0-R*Math.sin(phi);
this.curveTo(ControlX, ControlY, AnchorX, AnchorY);
}
}
_root.circleTo(100, 15, 200, 200, 4, 0x00BB00, 100);
У кого украл эту функцию?
какраз это я сам писал ну конешно идея не моя через радиус вычислять точки а портатип мой
Наглое вранье. Это код из книги "Flash MX и ActionScript: обучение на примерах". Книжка конечно не очень - но факт остается фактом. См. главу 9.
ultraflasher
26.11.2003, 09:05
:-<
а вот ещё
var PositionCentreX = 250;
var PositionCentreY = 250;
var Radius = 150;
var Radius2 = 140;
var AmountSegments = 32;
var Thickness = 50;
var s = 200;
var pX;
var pY;
var P2 = 2*Math.PI;
var Rad = Math.PI/180;
TopsX1 = new Array();
TopsY1 = new Array();
TopsZ1 = new Array();
TopsX2 = new Array();
TopsY2 = new Array();
TopsZ2 = new Array();
for (Znak=1; Znak>-2; Znak -= 2) {
for (i=0; i<P2; i += 2*Math.PI/AmountSegments) {
TopsX1.push(0+Radius*Math.cos(i));
TopsY1.push(0-Radius*Math.sin(i));
TopsZ1.push(Znak*Thickness/2);
}
}
for (Znak=1; Znak>-2; Znak -= 2) {
for (i=0; i<P2; i += 2*Math.PI/AmountSegments) {
TopsX2.push(0+Radius2*Math.cos(i));
TopsY2.push(0-Radius2*Math.sin(i));
TopsZ2.push(Znak*Thickness/2);
}
}
_root.onEnterFrame = function() {
pX = -(PositionCentreX-_ymouse)*0.005;
pY = (PositionCentreY-_xmouse)*0.005;
_root.clear();
for (i=0; i<=AmountSegments*2; i++) {
cosX = Math.cos(pX*Rad);
sinX = Math.sin(pX*Rad);
cosY = Math.cos(pY*Rad);
sinY = Math.sin(pY*Rad);
PowY = TopsY1[i]*cosX-TopsZ1[i]*sinX;
PowX = TopsX1[i]*cosY+(TopsY1[i]*sinX+TopsZ1[i]*cosX)*sinY;
PowZ = -TopsX1[i]*sinY+(TopsY1[i]*sinX+TopsZ1[i]*cosX)*cosY;
TopsX1[i] = PowX;
TopsY1[i] = PowY;
TopsZ1[i] = PowZ;
PowY = TopsY2[i]*cosX-TopsZ2[i]*sinX;
PowX = TopsX2[i]*cosY+(TopsY2[i]*sinX+TopsZ2[i]*cosX)*sinY;
PowZ = -TopsX2[i]*sinY+(TopsY2[i]*sinX+TopsZ2[i]*cosX)*cosY;
TopsX2[i] = PowX;
TopsY2[i] = PowY;
TopsZ2[i] = PowZ;
}
this.lineStyle(0, 0xffffff, 100);
this.moveTo(PositionCentreX+TopsX1[0]*(s/(s+TopsZ1[0])), PositionCentreY+TopsY1[0]*(s/(s+TopsZ1[0])));
for (i=1; i<AmountSegments; i++) {
this.lineTo(PositionCentreX+TopsX1[i]*(s/(s+TopsZ1[i])), PositionCentreY+TopsY1[i]*(s/(s+TopsZ1[i])));
}
this.lineTo(PositionCentreX+TopsX1[0]*(s/(s+TopsZ1[0])), PositionCentreY+TopsY1[0]*(s/(s+TopsZ1[0])));
this.moveTo(PositionCentreX+TopsX1[AmountSegments]*(s/(s+TopsZ1[AmountSegments])), PositionCentreY+TopsY1[AmountSegments]*(s/(s+TopsZ1[AmountSegments])));
for (i=1; i<AmountSegments; i++) {
this.lineTo(PositionCentreX+TopsX1[i+AmountSegments]*(s/(s+TopsZ1[i+AmountSegments])), PositionCentreY+TopsY1[i+AmountSegments]*(s/(s+TopsZ1[i+AmountSegments])));
}
this.lineTo(PositionCentreX+TopsX1[AmountSegments]*(s/(s+TopsZ1[AmountSegments])), PositionCentreY+TopsY1[AmountSegments]*(s/(s+TopsZ1[AmountSegments])));
for (i=0; i<AmountSegments; i++) {
this.moveTo(PositionCentreX+TopsX1[i]*(s/(s+TopsZ1[i])), PositionCentreY+TopsY1[i]*(s/(s+TopsZ1[i])));
this.lineTo(PositionCentreX+TopsX1[i+AmountSegments]*(s/(s+TopsZ1[i+AmountSegments])), PositionCentreY+TopsY1[i+AmountSegments]*(s/(s+TopsZ1[i+AmountSegments])));
}
this.moveTo(PositionCentreX+TopsX2[0]*(s/(s+TopsZ2[0])), PositionCentreY+TopsY2[0]*(s/(s+TopsZ2[0])));
for (i=1; i<AmountSegments; i++) {
this.lineTo(PositionCentreX+TopsX2[i]*(s/(s+TopsZ2[i])), PositionCentreY+TopsY2[i]*(s/(s+TopsZ2[i])));
}
this.lineTo(PositionCentreX+TopsX2[0]*(s/(s+TopsZ2[0])), PositionCentreY+TopsY2[0]*(s/(s+TopsZ2[0])));
this.moveTo(PositionCentreX+TopsX2[AmountSegments]*(s/(s+TopsZ2[AmountSegments])), PositionCentreY+TopsY2[AmountSegments]*(s/(s+TopsZ2[AmountSegments])));
for (i=1; i<AmountSegments; i++) {
this.lineTo(PositionCentreX+TopsX2[i+AmountSegments]*(s/(s+TopsZ2[i+AmountSegments])), PositionCentreY+TopsY2[i+AmountSegments]*(s/(s+TopsZ2[i+AmountSegments])));
}
this.lineTo(PositionCentreX+TopsX2[AmountSegments]*(s/(s+TopsZ2[AmountSegments])), PositionCentreY+TopsY2[AmountSegments]*(s/(s+TopsZ2[AmountSegments])));
for (i=0; i<AmountSegments; i++) {
this.moveTo(PositionCentreX+TopsX2[i]*(s/(s+TopsZ2[i])), PositionCentreY+TopsY2[i]*(s/(s+TopsZ2[i])));
this.lineTo(PositionCentreX+TopsX2[i+AmountSegments]*(s/(s+TopsZ2[i+AmountSegments])), PositionCentreY+TopsY2[i+AmountSegments]*(s/(s+TopsZ2[i+AmountSegments])));
}
for (i=0; i<AmountSegments; i++) {
this.moveTo(PositionCentreX+TopsX1[i]*(s/(s+TopsZ1[i])), PositionCentreY+TopsY1[i]*(s/(s+TopsZ1[i])));
this.lineTo(PositionCentreX+TopsX2[i]*(s/(s+TopsZ2[i])), PositionCentreY+TopsY2[i]*(s/(s+TopsZ2[i])));
this.moveTo(PositionCentreX+TopsX1[i+AmountSegments]*(s/(s+TopsZ1[i+AmountSegments])), PositionCentreY+TopsY1[i+AmountSegments]*(s/(s+TopsZ1[i+AmountSegments])));
this.lineTo(PositionCentreX+TopsX2[i+AmountSegments]*(s/(s+TopsZ2[i+AmountSegments])), PositionCentreY+TopsY2[i+AmountSegments]*(s/(s+TopsZ2[i+AmountSegments])));
}
};
ultraflasher
27.11.2003, 10:20
А вот моя функция рисования окружности. Намного проще и лучше всего предложенного.
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);
}
};
Nox Noctis
27.11.2003, 12:21
приятно видеть, что стлько народу учило в школе тригонометрию :))
это все охренеть как круто, но практического применения окружностей рисованных из 16 дуговых сегментов - ноль. слишком сложно. соотношение стоимости овчинки и её выделки явно не в пользу овчинки :)
ultraflasher
27.11.2003, 13:40
А что мешает задать 12 - 10 - 8 - 6 ????
Просто 16 - для супер точности.
ultraflasher
27.11.2003, 13:42
Да и ещё. Тебе этот адресок не знаком?
http://www.astronomy.swin.edu.au/~pbourke
Так вот. Я его сейчас закачиваю. Уже 8000 файлов закачалось. Телепортом.
Nox Noctis
27.11.2003, 13:46
дадада, поль бурк монстер :)
я когда-то во флэше сделал рисование кривой бабочки, у него нашел формулу...
на форуме есть где-то :)
а насчет окружности - проще нарисовать руками, приаттачить и отскейлить. удобно, доступно, недорого. незачем извращаться кодом там где это незачем :) по-моему так...
ultraflasher
27.11.2003, 13:52
Оригинал написал(а) Nox Noctis
дадада, поль бурк монстер :)
я когда-то во флэше сделал рисование кривой бабочки, у него нашел формулу...
на форуме есть где-то :)
а .. ето наверное... Безьюхами :)
ultraflasher
27.11.2003, 13:57
Nox. если не трудно, закинь сюда ссылки подобного уровня, если знаешь. Буду благодарен.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.