В данном разделе мы создадим модель огранки, которая называется триллиант. В качестве рундиста этой огранки используется рассмотренный в прошлой главе рундист треугольной "подушки".
По ссылке CushionTrilliant A - Light Dispersion можно увидеть эту огранку отображенную при помощи кубических карт. Нажав на приведенной по ссылке странице кнопку Inverse можно увидеть огранку на черном фоне.
Схематичные изображения короны и павильона огранки, а также нумерация вершин показаны на рисунках 1 и 2. Рисунок 1 отображает вид огранки когда наблюдатель находится снаружи модели и смотрит на корону сверху. На рисунке 2 наблюдатель смотрит на павильон сверху как если бы он находился внутри модели.
var lw = 1.0; // отношение длины огранки к ее ширине // Рундист var r = 0.06; // толщина рундиста var rs = 0.2; // радиус сопрягающих дуг var angle = 60*DEGREE; // угол задающий положение границ сегментов на линии рундиста // Корона var beta = 35*DEGREE; // угол короны var t = 0.6; // размер площадки var dSquare = 0.0001; // задает положение вершин короны в горизонтальной плоскости // Павильон var angle_pav = 50*DEGREE; // угол павильона var hPavFacet = 0.50; // глубина нижних вершин фасет павильона // Калетта var culetX = 0.00001; // смещение калетты по оси OX var culetY = 0.00001; // смещение калетты по оси OY
Расчет координат вершин рундиста рассматривался в предыдущей главе. Построение короны и павильона в основном подобно этим построениям в огранке бриллиант. Основные части исходного текста расчета координат вершин короны и павильона приведено ниже:
........................................................................... ........................................................................... // Конструируем корону var r_tan_beta = 0.5 * Math.tan(beta); // beta - угол наклона граней короны var H1 = r/2; // уровень верхней части рундиста var H2 = -r/2; // уровень нижней части рундиста // точки короны пропорциональны точкам рундиста относительно upPoint (это следует // из предположения, что все грани пересекаются в одной точке) var upPoint = new Point3D(0.0, 0.0, H1 + r_tan_beta); for ( i = 0; i < 6; i++ ) { var dir = new Vector3D(girdle[i*8+4][0] - upPoint[0], girdle[i*8+4][1] - upPoint[1], girdle[i*8+4][2] - upPoint[2]); // Вектор dir нельзя нормировать ! crown[i] = new Point3D(upPoint[0] + t * dir[0], upPoint[1] + t * dir[1], upPoint[2] + t * dir[2]); } // Находим точки пересечения основных граней // короны между собой на уровне рундиста. // Сначала создание шести прямых касательных к рундисту var lines = []; for ( i = 0; i < 6; i++ ) { var dir = new Vector2D(girdle2[4+i*8+1][0] - girdle2[4+i*8-1][0], girdle2[4+i*8+1][1] - girdle2[4+i*8-1][1]); dir.Normer(); var ln = new Line2D(); ln.CreateLineVectorPoint(dir, new Point2D(girdle2[4+i*8][0], girdle2[4+i*8][1])); lines[i] = ln; } // Точки пересечения касательных к рундисту прямых между собой var g2 = []; for ( i = 0; i < 5; i++ ) { g2[i+1] = lines[i].IntersectionTwoLines(lines[i+1]); } g2[0] = lines[0].IntersectionTwoLines(lines[5]); // Точки звезды (вершины короны) пропорциональны точкам g2 относительно upPoint // Коэффициент пропорциональности m находим по следующей формуле var m = (1 + SQRT2) / 2 * t; if ( dSquare <= 0 ) m = m + dSquare * (m - 1 + t); else m = m + dSquare * (1 - m); // Координаты вершин звезды for ( i = 0; i < 6; i++ ) { var dir = new Vector3D( g2[i][0] - upPoint[0], g2[i][1] - upPoint[1], H1 - upPoint[2] ); var pt = new Point3D( upPoint[0] + m * dir[0], upPoint[1] + m * dir[1], upPoint[2] + m * dir[2] ); crown[i+6] = pt; } ...................................................................................... ...................................................................................... // Конструируем павильон pavil[6] = new Point3D(); pavil[6][0] = culetX; pavil[6][1] = culetY; pavil[6][2] = - 0.5 * Math.tan(angle_pav)- r/2; // Находим точки пересечения основных граней // павильона между собой на уровне рундиста. // На самом деле это те же самые точки из массива g2, // которые мы определили при построении короны. // Поэтому при построении короны воспользуемся значениями // из этого массива. for (i = 0; i < 6; i++) { var dir = new Vector3D(pavil[6][0] - g2[i][0], pavil[6][1] - g2[i][1], pavil[6][2] + r/2); // dir.normer(); pavil[i] = new Point3D(); pavil[i][0] = pavil[6][0] - (1 - hPavFacet) * dir[0]; pavil[i][1] = pavil[6][1] - (1 - hPavFacet) * dir[1]; pavil[i][2] = pavil[6][2] - (1 - hPavFacet) * dir[2]; } ...........................................................
По ссылке Cushion Trilliant B - Light Dispersion можно увидеть еще один подобный триллиант но с павильоном более сложной формы. На рисунке 3 показано изображение этой огранки.
Кроме огранок триллиант построенных на основе рундиста подушка существуют триллианты с более простым рундистом. Некоторые из них показаны на рисунке 4 и по ссылкам триллиант и щит