среда, 19 декабря 2012 г.

Функция формулы объекта

Функция формулы объекта:
Немного теории.
Чтобы построить трёхмерный объект, надо вычислить его точки в пространстве и по этим точкам установить полигоны (плоскости).
Проще всего представить себе простыню, которой мы обернём объект. Так, как мы оборачиваем объект по кругу, мы должны применить число ПИ (3,14), оно наиболее точно сводит концы с концами. Итак у нас имеется простына шириной =U и длиной равной V.
Протяженность по U будет равна от uMin до uMax, в данном случае от 0 до 4ПИ.
Протяженность по V будет равна от vMin до vMax, в данном случае от 0 до 2ПИ.
Ещё одна важная вещь. Количество полигонов. Чем меньше полигонов (плоскостей, построенных по точкам), тем грубее форма объекта, чем больше полигонов, тем глаже форма, но время на расчёты увеличивается. То есть полигоны на нашей простыне будут выглядеть, как квадраты. По стороне V это будут ряды Nv=300, по стороне U это будут колонны Nu=300. Ширина и длина каждого полигона будет равна:

du=(uMax-uMin)/Nu;//-ширина полигона
dv=(vMax-vMin)/Nv;//-длина полигона
В данной функции мы начинаем вычислять положения точек объекта в 3D пространстве. То есть каждая точка должна получить значения по оси X, Y и Z. Эти значения будут вычисляться по следующей формуле:

                x= r*cos(v)*cos(u)+R*cos(u)*(1+a*cos(n*u));
                 y= 2.5*(r*sin(v)+a*sin(n*u));
                 z= r*cos(v)*sin(u)+R*sin(u)*(1+a*cos(n*u));
Чтобы вычислить все точки объекта, мы делаем так называемый "цикл", то есть по очереди вычисляем точки рядов полигонов и двигаемся по  их колоннам.
Все три координаты будут запоминаться в виде вектора в конце каждого цикла в переменной SetPoint:
para->SetPoint(zz,vector(x*f,y*f,z*f));
var f = Увеличение-Scale


var zz = номер каждой точки по порядку.
//*************************

 Form1(vDoc)//Функция формулы №1-Endless
{
      var uMin = 0.0;
      var uMax = 25.13274122;
      var vMin = 0.0;
      var vMax = 6.283185307;
du=(uMax-uMin)/Nu;//-ширина полигона
dv=(vMax-vMin)/Nv;//-длина полигона
             zz=0;
             for (i=0;i<Nu;i++)//300 колонн
{
             for (j=0;j<Nv;j++)//300 рядов
{
              u=uMin+i*du;//Идём по колоннам через ширину полигона
              v=vMin+j*dv;//Идём по рядам через длину полигона
var f = 75;//Увеличение-Scale
      var a = .5;//Общий диаметр .5
      var n = 2.25;//Количество 2.25
      var R = 2.0;//Увеличение 7,8,9,
      var r = 0.3;//Удлинение 0.3-шар
                 x= r*cos(v)*cos(u)+R*cos(u)*(1+a*cos(n*u));
                 y= 2.5*(r*sin(v)+a*sin(n*u));
                 z= r*cos(v)*sin(u)+R*sin(u)*(1+a*cos(n*u));
                para->SetPoint(zz,vector(x*f,y*f,z*f));
                zz=zz+1;
}
}
}//конец функции формулы №1
//**************************************

Комментариев нет:

Отправить комментарий