пятница, 23 сентября 2011 г.

Создание из объекта клонов в виде сферы


//*******************************
//Делает клоны в виде шара
//Выбрать объект и выделить его
var vDoc;
var ClonOb;
var NewNull;
var NewClonOb;
var i,j;//Индексы цикла
//********************
      var x,y,z;
      var f;//Увеличитель
      var Nu;// (итерации) по u
      var Nv;// (итерации) по v
      var du;        
      var dv;        
      var u,v;
      var zz;  
      var R;
 //**********************
FormClone(vDoc)//Функция отрисовки
{
//***************
     ClonOb=vDoc->GetActiveObject(); if (!ClonOb) println("Select object"); //Получить выделенный объект, если не выделен, прервать выполнение скрипта
     if (!ClonOb) return FALSE;//если не выделен, прервать выполнение скрипта
     NewNull = new(NullObject); // Создать новый Null объект
     NewNull->SetName("Clones");// Имя клонов
     vDoc->InsertObject( NewNull, NULL, NULL );//Ввести в Объект Менеджер

//**************
      var uMin = 0.0;
      var uMax = 6.283185307;
      var vMin = 0.0;
      var vMax = 6.283185307;
      f = 30;//Увеличитель
      Nu = 20;//Количество клонов по u
      Nv = 20;//Количество клонов по v
      R = 10.0;//Радиус (Увеличитель)
du=(uMax-uMin)/Nu;//ширина
dv=(vMax-vMin)/Nv;//длина
           zz=0;
              for (i=0;i<Nu;i++)//Колонны по u
             {
             for (j=0;j<Nv;j++)//Ряды по v
             {
                    u=uMin+i*du;//Ширина шага
                    v=vMin+j*dv;//Длина шага
x = R * sin(u) * cos(v); //Формула по x
y = R * cos(u);            //Формула по y
z = R * sin(u) * sin(v);  //Формула по z
                  zz=zz+1;
//*************************
NewClonOb = ClonOb->GetClone(0);// Сделать клон выделенного объекта
var sc = NewClonOb->GetContainer();//Получить контейнер для клонов
NewClonOb->SetContainer(sc);//Установить контейнер для клонов
NewClonOb->SetName("Object." + tostring(i));//Дать порядковое имя клонам
NewClonOb->SetPosition(vector(x*f,y*f,z*f));//Установить клон в новую позицию x, y, z
vDoc->InsertObject(NewClonOb,NewNull,NULL);//Добавить детку клона  к родителю NULL
            }
                 GeEventAdd(DOCUMENT_CHANGED);//Зафиксировать изменения в документе
            }
                 GeEventAdd(DOCUMENT_CHANGED);//Зафиксировать изменения в документе
}//конец FormClone(vDoc)
//*********************
main(doc,op)//Главная функция, начало работы скрипта
{
vDoc = GetActiveDocument();//Получить активный документ
FormClone(vDoc);//Нарисовать
}
//**************************

Создание клонов из объекта


//*****************************************
//Делает клоны в виде аттрактора
//Выбрать объект и выделить его
var vDoc;
var ClonOb;
var NewNull;
var NewClonOb;
var i,j;//Индексы цикла
//********************
         var x,y,z;
         var a=0.85;////Переменные аттрактора
         var b=0.90;////Переменные аттрактора
         var c=0.40;////Переменные аттрактора
         var d=9.00;////Переменные аттрактора
         var t,s,co;//Переменные формулы аттрактора
         var N=100;//Количество клонов
         var x0=0.0;//Старт x
         var y0=0.2;//Старт y (на радиус сферы=0.2)
         var xa;// x-АЛЬФА
         var ya;// y-АЛЬФА
         var Faktor=300;//Увеличитель
 //**********************
FormClone(vDoc)//Функция отрисовки
{
//***************
     ClonOb=vDoc->GetActiveObject(); if (!ClonOb) println("Select object"); //Получить выделенный объект, если не выделен, прервать выполнение скрипта
     if (!ClonOb) return FALSE;//если не выделен, прервать выполнение скрипта
     NewNull = new(NullObject); // Создать новый Null объект
     NewNull->SetName("Clones");// Имя клонов
     vDoc->InsertObject( NewNull, NULL, NULL );//Ввести в Объект Менеджер

//**************
xa=x0;//Это x-АЛЬФА-начальная - var x0=0.0;-Старт x
y=y0;// var y0=0.2;-Старт y (на радиус сферы=0.2)
ya=y0;
         for (j=0;j<N-1;j++)// от 0 до 999 (var N=1000;)
             {
                 t=c-d/(1+xa*xa+y*y);//Переменная t для аттрактора
                 s=sin(t);//Переменная s для аттрактора
                 co=cos(t);//Переменная co для аттрактора
            x=a+b*(xa*co-y*s);//Формула по x
            y=b*(xa*s+y*co);//Формула по y
            z = ya;//Формула по z
//*************************
NewClonOb = ClonOb->GetClone(0);// Сделать клон выделенного объекта
var sc = NewClonOb->GetContainer();//Получить контейнер для клонов
NewClonOb->SetContainer(sc);//Установить контейнер для клонов
NewClonOb->SetName("Object." + tostring(i));//Дать порядковое имя клонам
NewClonOb->SetPosition(vector(x*Faktor,y*Faktor,z*Faktor));//Установить клон в новую позицию x, y, z
vDoc->InsertObject(NewClonOb,NewNull,NULL);//Добавить детку клона  к родителю NULL
                 GeEventAdd(DOCUMENT_CHANGED);//Зафиксировать изменения в документе
                 xa=x;// x-АЛЬФА теперь с новой позиции
                 ya=y;// y-АЛЬФА теперь с новой позиции
             }
}//конец FormClone(vDoc)
//*********************
main(doc,op)//Главная функция, начало работы скрипта
{
vDoc = GetActiveDocument();//Получить активный документ
FormClone(vDoc);//Нарисовать
}
//**************************************

воскресенье, 18 сентября 2011 г.

Некоторые работы...

Все изображения сделаны при помощи K.O.F.F.E.E.

Око
Автопортрет
Ангел зла
Шлем ужаса
Боромеанские кольца
Кувшинки
Небесный волчок
Плетёный УНИ
Сквозь

суббота, 10 сентября 2011 г.

Считает расстояние между всеми соседними точками объекта + определяет чётные-нечётные точки объекта


//Взять любой объект, задивайдить (C) и выделить
//Считает расстояние между всеми соседними точками объекта
//Определяет чётные-нечётные точки объекта
var vDoc;//Активный документ
var vOp;//Активный операнд
var ponts;//количество точек в выделенном объекте(проверка дивайда), если "Member not found", то (С)
var P1,P2,P3,P4,P5;
var arr;//Массив для точек объекта
var tuda;//Пересчёт для обратного счёта
var gpcount;//Количество точек в объекте
var i;//индекс лупа
//*******************
distance(P1,P2)//Функция определения дистанции между двумя соседними точками // Calculates the length of the vector that goes from p1 to p2.
{
  return vlen(P2-P1);
}
//*******************
UstPol(vDoc)//Функция определения расстояния между соседними точками объекта+чёт-нечёт
{
vOp = vDoc->GetActiveObject(); //Gets the selected object
if(!vOp)return; //Ends the script if nothing is selected
arr = vOp->GetPoints(); if (!arr) return FALSE; // Массив с точками объекта
gpcount=vOp->GetPointCount();//Количество точек
for(i=0; i<gpcount-2; i++)
{
tuda=(gpcount-i);//Обратный счёт
//Посчитаем расстояние между точками:
  P1 = arr[tuda-2]; // Счёт в обратную сторону, от общего количества точек к точке №2
  P2 = arr[tuda-1]; // Счёт в обратную сторону
println("distance P",tuda-1," -","P",tuda," = ",distance(P1,P2)); // Вызов функции distance - Calculates the length of the vector that goes from p1 to p2.
//Чётное-нечётное
P3=2;
P5=abs(tuda-1);
P4= Modulo(P5, P3);//Модуль числа P5 по 2 (двойке)
if (P4==0) println(tuda-1," =chetnoe");//Если модуль = 0, то чётное, если =1 - нечётное
}
}
//*************************
main(doc,op)
{
vDoc = GetActiveDocument();
vOp=vDoc->GetActiveObject(); if (!vOp) println("Select object"); //Получить выделенный объект, если не выделен - то текст
if (!vOp) return FALSE;//если не выделен, прервать выполнение скрипта
ponts=vOp->GetPointCount(); if (!ponts) println("Devide object!");//Получить количество точек в выделенном объекте, если нет, то объект задивайдить! (C)
if (!ponts) return FALSE;//Прервать, если объект не дивайденный (C)
UstPol(vDoc);
}