2D векторы.
function Vector2D(x, y)
Функция-конструктор двумерных векторов Vector2D
Примеры:
1. Создание двумерного вектора с координатами (2, 1)
.
var vec = new Vector2D(2, 1); // vec = [2, 1]
2. Создание (объявление) пустого двумерного вектора.
Координаты вектора x
и y
- пока неопределены.
var vec = new Vector2D(); // vec = [undefined, undefined]
Vector2D.prototype.Add = function(vector)
Сложение двумерных векторов. Функция возвращает новый вектор,
получившийся в результат сложения координат одного вектора с координатами другого вектора.
Пример:
var vec = new Vector2D(2, 1);
var vecOut = vec.Add(new Vector2D(3, 2)); // vecOut = [5, 3]
Vector2D.prototype.Subtract = function(vector)
Вычитание из координат одного вектора координат другого вектора.
Функция возвращает новый вектор, получившийся в результат вычитания соответствующих координат.
Пример:
var vec = new Vector2D(2, 1);
var vecOut = vec.Subtract(new Vector2D(3, 2)); // vecOut = [-1, -1]
Vector2D.prototype.Dot = function(vector)
Скалярное произведение векторов.
Функция возвращает результат скалярного произведения векторов.
Пример:
var vec1 = new Vector2D(2, 1);
var vec2 = new Vector2D(4, 3);
var dot = vec1.Dot(vec2); // dot = 11
Vector2D.prototype.Normer = function()
Нормировка данного вектора this
.
Пример:
vec1 = new Vector2D(1, 1);
vec1.Normer(); // vec1 = [0.7071067811865475, 0.7071067811865475]
vec2 = new Vector2D(3, 1);
vec2.Normer(); // vec2 = [0.9486832980505138, 0.31622776601683794]
Vector2D.prototype.Rotate = function(angle)
Вращение на плоскости вектора на угол angle
.
Функция возвращает новый вектор, получившийся в результат поворота.
Пример:
Вращение вектора vec на 90 градусов по часовой стрелке.
var radian = 90 * Math.PI / 180;
vec = new Vector2D(1, 0);
var vecOut = vec.Rotate(radian); // vecOut = [0, -1]
Vector2D.prototype.Translate = function(vector)
Перенос вектора this
на вектор vector
. Фактически
this = this + vector
2D матрицы.
function Matrix2D(m00, m01, m10, m11)
Функция-конструктор двумерных матриц Matrix2D
[m00, m01]
[m10, m11]
Пример:
var mat = new Matrix2D(0, 1, 2, 3);// mat = [0, 1]
// [2, 3]
Matrix2D.prototype.Det = function()
Функция возвращает величину определителя матрицы
Пример:
Вычисление детермината 2D-матрицы.
var mat = new Matrix2D(0, 1, 2, 3);
var det = mat.Det(); // det = -2
Matrix2D.prototype.Inverse = function();
Инверсия матрицы. Функция возвращает матрицу обратную к исходной матрице.
Если детерминат матрицы this
равен 0, то функция возвращает null
.
Примеры:
Вычисление обратной матрицы.
1. var mat1 = new Matrix2D(0, 1, 2, 3);
var inv1 = mat1.Inverse(); // inv1 = [0, 0.5]
// [1, -1.5]
2. var mat2 = new Matrix2D(1, 1, 1, 1); // det = 0
var inv2 = mat2.Inverse(); // inv2 = null
Matrix2D.prototype.Transpose = function();
Транспонирование матрицы. Функция возвращает транспонированную матрицу this
.
Пример:
var mat = new Matrix2D(0, 1, 2, 3); // mat = [0, 1]
// [2, 3]
var tr = mat.transpose(); // tr = [0, 2]
// [1, 3]
Matrix2D.prototype.MultiplyMatrixVector = function(vector);
Умножение матрицы на вектор. Функция возвращает вектор,
получившийся в результате умножения матрицы на исходный вектор vector
.
Пример:
var vec = new Vector2D(1, 3);
var mat = new Matrix2D(1, 2, 3, 4);
var vecOut = mat. MultiplyMatrixVector (vec); // vecOut = [7, 15]
2D точки.
function Point2D(x, y);
Функция-конструктор точек на плоскости Point2D
.
Примеры:
1. Создание точки с координатами (2, 1).
var point = new Point2D(2, 1);
2. Создание(объявление) точки, кординаты которой пока не определены.
Координаты точки, если потребуется, будут определены в программе в дальнейшем.
var point = new Point2D(); // point = [undefined, undefined]
Point2D.prototype.Add = function(point);
Сложение координат двух точек на плоскости.
Функция возвращает точку с координатами равными сумме координт двух исходных точек.
Пример:
var pt1 = new Point2D(1, 2);
var pt2 = new Point2D(3, 4);
var ptOut = pt1.Add(pt2); // ptOut = [4, 6]
Point2D.prototype.Translate = function(vector);
Перенос точки на величину, заданную вектором.
Функция возвращает новую точку с координатами
смещенными на значение вектора vector
.
Пример:
var pt = new Point2D(1, 2);
var vec = new Vector2D(3, 4);
var ptOut = pt.Translate(vec); // ptOut = [4, 6]
Point2D.prototype.Distance = function(point)
Функция возвращает значение расстояния между двумя точками на плоскости.
Пример:
var pt1 = new Point2D(1, 1);
var pt2 = new Point2D(2, 2);
var dist = pt1.Distance(pt2); // dist = 1.4142135623730951
2D прямые.
function Line2D(point1, point2)
Функция-конструктор прямой Line2D
. Прямая задается точками point1
и point2
.
Примеры:
1. var line = new Line2D(); // directCos = [undefined, undefined]
// distOXY = undefined
2. var line1 = new Line2D(new Point2D(-1, 0), new Point2D(0, 1));
// directCos = [0.7071067811865475, -0.7071067811865475]
// distOXY = -0.7071067811865475
3. var line2 = new Line2D(new Point2D(1, 0), new Point2D(0, 1));
// directCos = [0.7071067811865475, 0.7071067811865475]
// distOXY = 0.7071067811865475
Line2D.prototype.NormalLine = function()
Функция создает прямую на плоскости, перпендикулярную к исходной прямой.
Пример:
var line = new Line2D(new Point2D(-1, 0), new Point2D(0, 1));
// directCos = [0.7071067811865475, -0.7071067811865475]
// distOXY = -0.7071067811865475
var lineNormal = line.NormalLine();
// directCos = [0.7071067811865475, 0.7071067811865475]
// distOXY = -0.7071067811865475
Line2D.prototype.CreateNormalLinePoint = function(point)
Функция создает прямую на плоскости перпендикулярную к прямой line
и проходящую через точку point
.
Пример:
var line = new Line2D(new Point2D(-1, 0), new Point2D(0, 1));
// directCos = [0.7071067811865475, -0.7071067811865475]
// distOXY = -0.7071067811865475
var point = new Point2D(0, 1); // point = [0, 1]
var lineNormal = line.CreateNormalLinePoint(point);
// directCos = [0.7071067811865475, 0.7071067811865475]
// distOXY = 0.7071067811865475
Line2D.prototype.IntersectionTwoLines = function(line)
Функция возвращает точку лежащую на пересечении двух прямых на плоскости.
Пример:
var line1 = new Line2D(new Point2D(-1, 0), new Point2D( 1, 2));
var line2 = new Line2D(new Point2D( 1, 0), new Point2D(-1, 2));
var point = line1.IntersectionTwoLines(line2, point);
// point = [0, 1]
Line2D.prototype.Angle = function(line)
Функция возвращает значение угла на плоскости между двумя прямыми.
Пример:
var line1 = new Line2D(new Point2D(0, 0), new Point2D(1, 0));
var line2 = new Line2D(new Point2D(-1, 0), new Point2D(0, 1));
var line3 = new Line2D(new Point2D(1, 0), new Point2D(0, 1));
var degreeAng12 = (180 / Math.PI) * line1.Angle(line2);
// degreeAng12 = 45°
var degreeAng13 = (180 / Math.PI) * line1.Angle(line3);
// degreeAng13 = 135°
Line2D.prototype.CreateLineVectorPoint = function(vector, point)
Прямая line
на плоскости создается по вектору направления vector
и точке point
лежащей на создаваемой прямой.
Пример:
var vector = new Vector2D(2, 1);
var point = new Point2D(3, 0);
var line = new Line2D(); // объявление прямой line
// назначение прямой line требуемых параметров
line.CreateLineVectorPoint(vector, point);
// directCos = [0.4472135954999579, -0.8944271909999159]
// distOXY = 1.3416407864998738
Line2D.prototype.Distance = function(point)
Функция возвращает значение расстояния на плоскости точки point
от прямой line
.
Пример:
var line = new Line2D(new Point2D(0, 0), new Point2D(0, 1));
var point = new Point2D(4, 2);
var dist = line.Distance(point); // dist = 4
2D окружность.
function Circle2D(point, radius)
Функция-конструктор окружности на плоскости Circle2D
.
Окружность задается своим центром point
и величиной радиуса radius
.
Пример:
var cir = new Circle2D(new Point2D(4, 3), 2);
Circle2D.prototype.IntersectionTwoCircles = function(circle, point1, point2)
Функция определяет точки пересечения point1
и point2
двух окружностей.
Первая окружность задается this
, а вторая – параметром circle.
Переменные point1
и point2
определяются предварительно
и вне функции IntersectionTwoCircles
.
Пример:
Пересечение окружности cir1 с окружностью cir2
var cir1 = new Circle2D(new Point2D(0, 0), 1);
var cir2 = new Circle2D(new Point2D(1, 0), 1);
var point1 = new Point2D();
var point2 = new Point2D();
if(!cir1.IntersectionTwoCircles(cir2, point1, point2))
return null;
// point1 = [0.5, 0.8660254037844386]
// point2 = [0.5, -0.8660254037844386]
Circle2D.prototype.Intersection_TwoCircles = function(circle)
Функция возвращает в двумерном массиве точки пересечения двух окружностей.
Первая окружность задается this
, а вторая – параметром circle.
Данная функция делает то же самое, что и функция IntersectionTwoCircles
.
Пример:
Пересечение окружности cir1 с окружностью cir2
var cir1 = new Circle2D(new Point2D(0, 0), 1);
var cir2 = new Circle2D(new Point2D(1, 0), 1);
var points = cir1.Intersection_TwoCircles(cir2);
if (points == null)
return null;
// points[0] = [0.5, 0.8660254037844386]
// points[1] = [0.5, -0.8660254037844386]
Circle2D.prototype.IntersectionLineCircle = function(line, point1, point2)
Функция определяет точки пересечения на плоскости point1
и point2
окружности this
с прямой line
.
Переменные point1
и point2
определяются предварительно
и вне функции IntersectionLineCircle
.
Пример:
var cir = new Circle2D(new Point2D(0, 0), 2);
var line = new Line2D(new Point2D(0,0), new Point2D(1,1));
var point1 = new Point2D();
var point2 = new Point2D();
if(!cir.IntersectionLineCircle(line, point1, point2))
return null;
// point1 = [ 1.4142135623730951, 1.4142135623730951]
// point2 = [-1.4142135623730951, -1.4142135623730951]
Circle2D.prototype.Intersection_LineCircle = function(line, point1, point2)
Функция возвращает в двумерном массиве точки пересечения на плоскости
окружности this
с прямой line
.
Данная функция делает то же самое, что и функция IntersectionLineCircle
.
Пример:
var cir = new Circle2D(new Point2D(0, 0), 2);
var line = new Line2D(new Point2D(0,0), new Point2D(1,1));
var points = cir.Intersection_LineCircle(line);
if (points == null)
return null;
// points[0] = [ 1.4142135623730951, 1.4142135623730951]
// points[1] = [-1.4142135623730951, -1.4142135623730951]
function QuadraticEquation(a, b, c, rez)
Решение квадратного уравнения.
a, b, c
- коэффициенты и свободный член уравнения.
rez
- результат решения (массив из двух значений).
Пример:
var a = 1;
var b = -4;
var c = 3;
var rez = [];
if(!QuadraticEquation(a, b, c, rez))
{
return null;
}
// rez = [3, 1]
function Quadratic_Equation(a, b, c)
Решение квадратного уравнения.
a, b, c
- коэффициенты и свободный член уравнения.
Функция возвращает в двумерном массиве результат решения уравнения.
Пример:
var a = 1;
var b = -4;
var c = 3;
var rez = Quadratic_Equation(a, b, c);
if(rez == null)
{
return null;
}
// rez = [3, 1]
3D векторы.
function Vector3D(x, y, z)
Функция-конструктор векторов Vector3D
в пространстве.
x, y, z
- значения координат создаваемого вектора
Примеры:
var vec1 = new Vector3D(3, 2, 1); // vec1 = [3, 2, 1]
var vec2 = new Vector3D(); // vec2 = [undefined, undefined, undefined]
Vector3D.prototype.Add = function(vector)
Сложение 3D векторов. Функция возвращает новый вектор, получившийся в результате
сложения сложения векторов this
и vector
.
Пример:
var vec = new Vector3D(3, 2, 1);
var vecOut = vec.Add(new Vector3D(0, 1, 2)); // vecOut = [3, 3, 3]
Vector3D.prototype.Subtract = function(vector)
Вычитание из вектора this
вектора vector
.
Функция возвращает новый вектор, получившийся в результат вычитания.
Пример:
var vec = new Vector3D(2, 1, 0);
var vecOut = vec.Subtract(new Vector3D(1, 0, 1));
// vecOut = [1, 1, -1]
Vector3D.prototype.Dot = function(vector)
Скалярное произведение векторов this
и vector
.
Функция возвращает результат скалярного произведения.
Пример:
var vec1 = new Vector3D(2, 1, 1);
var vec2 = new Vector3D(4, 3, 2);
var dot = vec1.Dot(vec2); // dot = 13
Vector3D.prototype.Normer = function()
Нормировка вектора this
.
Примеры:
vec1 = new Vector3D(1, 1, 1);
vec1.Normer(); // vec1 = [0.577.., 0.577.., 0.577..]
vec2 = new Vector3D(3, 1, 1);
vec2.Normer(); // vec2 = [0.0.904.., 0.301.., 0.301..]
Vector3D.prototype.Angle = function(vector)
Возвращает значение угла между векторами this
и vector
.
Пример:
vec1 = new Vector3D(1, 1, 0);
vec2 = new Vector3D(1, 1, 1);
var degreeAng12 = (180 / Math.PI) * vec1.Angle(vec2);
// degreeAng12 = 35.26438968275466°
Vector3D.prototype.Cross = function(vector)
Возвращает вектор, являющийся векторным произведением векторов this
и vector
.
Пример:
vec1 = new Vector3D(1, 0, 0);
vec2 = new Vector3D(0, 1, 0);
vecOut = vec1.Cross(vec2); // vecOut = [0, 0, 1]
Vector3D.prototype.Rotate = function(rot)
Функция возвращает вектор this
повернутый
на величину определяемую матрицей rot
.
Примеры:
Пример 1:
vec = new Vector3D(1, 0, 0);
var teta = Math.PI/2;
var mat = new Matrix3D(Math.cos(teta), -Math.sin(teta), 0,
Math.sin(teta), Math.cos(teta), 0,
0, 0, 1);
var vecOut = vec.Rotate(mat); // vecOut = [0, 1, 0]
Пример 2:
vec = new Vector3D(1, 0, 0);
var teta = Math.PI/2;
var mat = new Matrix3D( Math.cos(teta), Math.sin(teta), 0,
0, 1, 0,
-Math.sin(teta), 0, Math.cos(teta));
var vecOut = vec.Rotate(mat); // vecOut = [0, 0, -1]
Пример 3:
vec = new Vector3D(0, 1, 0);
var teta = Math.PI/2;
var mat = new Matrix3D(1, 0, 0,
0, Math.cos(teta), -Math.sin(teta),
0, Math.sin(teta), Math.cos(teta));
var vecOut = vec.Rotate(mat); // vecOut = [0, 0, 1]
3D матрицы.
function Matrix3D(m0x, m0y, m0z, m1x , m1y, m1z, m2x, m2y, m2z)
Функция-конструктор трехмерных матриц Matrix3D
.
m0x m1x m2x
m0y m1y m2y
m0z m1z m2z
Примеры:
Пример 1:
var mat = new Matrix3D(0,1,2, 3,4,5, 6,7,8);
// mat = [0,1,2]
// [3,4,5]
// [6,7,8]
Пример 2:
var mat = new Matrix3D();
// mat = [undefined, undefined, undefined]
// [undefined, undefined, undefined]
// [undefined, undefined, undefined]
Matrix3D.prototype.Det = function()
Функция возвращает величину определителя матрицы.
Примеры:
Пример 1:
var mat = new Matrix3D(-1, 2, -3,
4, 5, 6,
7, 8, -9);
var det = mat.Det(); // det = 258
Пример 2:
var mat = new Matrix3D();
var det = mat.Det(); // det = null
Matrix3D.prototype.Inverse = function()
Инверсия исходной матрицы this
.
Функция возвращает обратную матрицу к матрице this
.
Примеры:
Пример 1:
var mat1 = new Matrix3D(1, 2, 3,
4, 5, 6,
7, -8, -9);
// обратная матрица
var inv1 = mat1.Inverse();
// умножение обратной матрицы на исходную дает единичную матрицу
var mat = inv1.MultiplyTwoMatrices(mat1);
// mat = [1, 0, 0]
// [0, 1, 0]
// [0, 0, 1]
Пример 2:
// детерминат матрицы mat равен 0
var mat = new Matrix3D(1,1,1, 1,1,1, 1,1,1); // det = 0
var inv = mat.Inverse(); // inv = null
Matrix3D.prototype.MultiplyMatrixVector = function(vector)
Возвращает вектор, полученный путем умножения матрицы this
на вектор vector
.
vecOut = this * vector
Пример:
vec = new Vector3D(1, 0, 0);
var teta = Math.PI/2;
var mat = new Matrix3D(Math.cos(teta), -Math.sin(teta), 0,
Math.sin(teta), Math.cos(teta), 0,
0, 0, 1);
var vecOut = mat.MultiplyMatrixVector(vec); // vecOut = [0, 1, 0]
Matrix3D.prototype.MultiplyTwoMatrices = function(mat)
Возвращает матрицу, полученную путем умножения матрицы this
на матрицу mat
.
matOut = this * mat
Пример:
var mat1 = new Matrix3D(1, 2, 3,
5, 6, 7,
0, 1, 2);
var mat2 = new Matrix3D(0.5, 6, 7,
4, 1, 2,
3, 2, 1);
var out = mat1.MultiplyTwoMatrices(mat2);
// out = [17.5, 14, 14]
// [47.5, 50, 54]
// [ 10, 5, 4]
Matrix3D.prototype.Transpose = function(mat)
Возвращает транспонированную матрицу mat
.
Пример:
var mat = new Matrix3D(1, 2, 3,
4, 5, 6,
7, 8, 9);
var tr = mat.Transpose(mat); // tr = [1, 4, 7]
// [2, 5, 8]
// [3, 6, 9]
Matrix3D.prototype.MatrixSetVectorInColumn = function(vec0, vec1, vec2)
Устанавливает значения матрицы по столбцам,
где vec0, vec1, vec2 - 3D
векторы
Пример:
var vec0 = new Vector3D(1, 2, 3);
var vec1 = new Vector3D(4, 5, 6);
var vec2 = new Vector3D(7, 8, 9);
var mat = new Matrix3D();
var out = mat.MatrixSetVectorInColumn(vec0, vec1, vec2);
// out = [1, 4, 7]
// [2, 5, 8]
// [3, 6, 9]
Matrix3D.prototype.MatrixSetVectorInRow = function(vec0, vec1, vec2)
Устанавливает значения матрицы по рядам,
где vec0, vec1, vec2 - 3D
векторы
Пример:
var vec0 = new Vector3D(1, 2, 3);
var vec1 = new Vector3D(4, 5, 6);
var vec2 = new Vector3D(7, 8, 9);
var mat = new Matrix3D();
var out = mat.MatrixSetVectorInRow(vec0, vec1, vec2);
// out = [1, 2, 3]
// [4, 5, 6]
// [7, 8, 9]
Matrix3D.prototype.UnitaryMatrix = function()
Функция устанавливает компоненты матрицы this
равными компонентам единичной матрицы.
Пример:
var mat = new Matrix3D();
var unitMat = mat.UnitaryMatrix();
// mat = [1, 0, 0]
// [0, 1, 0]
// [0, 0, 1]
// unitMat = [1, 0, 0]
// [0, 1, 0]
// [0, 0, 1]
Matrix3D.prototype.InvertMatrixMultiply = function (vector)
Функция возвращает инвертированную матрицу this
умноженную на вектор vector
.
Данная функция используется в функции IntersectionThreePlanes
.
Пример:
var mat = new Matrix3D(-3, 0, 2,
3, -1, 0,
-2, 0, 1);
var vec = new Vector3D(1, 2, 3);
var vecOut = mat.InvertMatrixMultiply(vec);
// vecOut = [-5, -17, -7]
// инвертированная матрица = [1, 0, -2]
// [3, -1, -6]
// [2, 0, -3]
Matrix3D.prototype.RotX = function(angle)
Матрица поворота вокруг оси X на угол angle
Пример:
var mat = new Matrix3D(); // создание (объявление) матрицы
mat.RotX(Math.PI/2); // заполнение компонент матрицы
// поворот вектора [0, 1, 0] вокруг оси X на 90°
var vecOut = mat.MultiplyMatrixVector(new Vector3D(0, 1, 0));
// vecOut = [0, 0, 1]
Matrix3D.prototype.RotY = function(angle)
Матрица поворота вокруг оси Y на угол angle
Пример:
var mat = new Matrix3D(); // создание (объявление) матрицы
mat.RotY(Math.PI/2); // заполнение компонент матрицы
// поворот вектора [1, 0, 0] вокруг оси Y на 90°
var vecOut = mat.MultiplyMatrixVector(new Vector3D(1, 0, 0));
// vecOut = [0, 0, -1]
Matrix3D.prototype.RotZ = function(angle)
Матрица поворота вокруг оси Z на угол angle
Пример:
var mat = new Matrix3D(); // создание (объявление) матрицы
mat.RotZ(Math.PI/2); // заполнение компонент матрицы
// поворот вектора [1, 0, 0] вокруг оси Z на 90°
var vecOut = mat.MultiplyMatrixVector(new Vector3D(1, 0, 0));
// vecOut = [0, 1, 0]
Matrix3D.prototype.SetRotateMatrix = function(vector1, vector2, vector3)
Установка компонент матрицы вращения (установка компонент матрицы this
)
по трем векторам vector1, vector2
и vector3
.
Пример:
var vec1 = new Vector3D(1, 1, 0);
var vec2 = new Vector3D(0, 2, 2);
var vec3 = new Vector3D(3, 0, 3);
var mat = new Matrix3D();
mat.SetRotateMatrix(vec1, vec2, vec3);
// mat = [0.70710.., 0.70710.., 0]
// [0, 0.70710.., 0.70710..]
// [0.70710.., 0, 0.70710..]
3D точки.
function Point3D(x, y, z)
Функция-конструктор 3D точки Point3D
,
где x, y, z
- координаты точки.
Примеры:
var point1 = new Point2D(2, 1, 3); // point1 = [2, 1, 3]
var point2 = new Point3D();
// point2 = [undefined, undefined, undefined]
Point3D.prototype.Add = function(point)
Функция возвращает точку, являющюся суммой двух точек this
и point
.
Пример:
var pt1 = new Point3D(1, 2, 3);
var pt2 = new Point3D(4, -3, -7);
var ptOut = pt1.Add(pt2); // ptOut = [5, -1, -4]
Point3D.prototype.Translate = function(vector)
Возвращает точку this
перенесенную на вектор vector
Пример:
var pt1 = new Point3D(1, 2, 3);
var pt2 = new Point3D(4, -3, -7);
var ptOut = pt1.Add(pt2); // ptOut = [5, -1, -4]
Point3D.prototype.Distance = function(point)
Возвращает расстояние между точкой this
и точкой point
.
Пример:
var pt1 = new Point3D(1, 1, 1);
var pt2 = new Point3D(2, 2, 2);
var dist = pt1.Distance(pt2);
// dist = 1.7320508075688772
Point3D.prototype.Rotate = function(rot)
Функция возвращает точку this
, повернутую матрицей rot
.
Пример:
var mat = new Matrix3D(); // создание (объявление) матрицы
mat.RotY(Math.PI/2); // заполнение компонент матрицы поворота
// поворот точки с координатами [1, 0, 0] вокруг оси Y на 90°
var pt = new Point3D(1, 0, 0);
var ptOut = pt.Rotate(mat);
// ptOut = [0, 0, -1]
function SquareTriangle(point1, point2, point3)
Функция возвращает площадь треугольника заданного точками point1, point2
, и point3
.
Пример:
var pt1 = new Point3D(1,0,0);
var pt2 = new Point3D(0,1,0);
var pt3 = new Point3D(0,0,1);
var square = SquareTriangle(pt1, pt2, pt3);
// square = 0.8660254037844386
3D прямые
function Line3D(point1, point2)
Функция создает новую прямую в пространстве по двум точкам point1
и point2
.
Создаваемая прямая определяется своими направляющими косинусоми и точкой,
принадлежащей прямой.
Примеры:
1. var line1 = new Line3D();
// directCos = [undefined, undefined, undefined]
// pointOnLine = [undefined, undefined, undefined]
2. var line2 = new Line3D(new Point3D(1, 1, 1), new Point3D(1, 0, 0));
// directCos = [0, -0.7071067811865475, -0.7071067811865475]
// pointOnLine = [1, 1, 1]
Line3D.prototype.CreateLineVectorPoint = function(vector, point)
Функция создает прямую в пространстве направленную вдоль
вектора vector
и проходящую через точку point
.
Пример:
var vec = new Vector3D(1, 1, 1);
var point = new Point3D(1, 0, 0);
var line = new Line3D();
var lineOut = line.CreateLineVectorPoint(vec, point);
// lineOut = line
// directCos = [0.577.., 0.577.., 0.577..]
// pointOnLine = [1, 0, 0]
Line3D.prototype.Rotate = function(rot)
Функция вращает прямую this
в пространстве посредством матрицы rot
Пример:
var mat = new Matrix3D(); // создание (объявление) матрицы
mat.RotY(Math.PI/2); // заполнение компонент матрицы поворота для
// поворота прямой line вокруг оси Y на 90°
var line = new Line3D(new Point3D(1, 0, 0), new Point3D(0, 0, 0));
// directCos = [-1, 0, 0]
// pointOnLine = [1, 0, 0]
line.Rotate(mat);
// directCos = [0, 0, 1]
// pointOnLine = [0, 0, -1]
Line3D.prototype.Angle = function(line)
Функция возвращает угол между векторами определяющими направления прямой this
и прямой line
.
Пример:
var line1 = new Line2D(new Point3D(0, 0, 0), new Point2D(0, 1, 1));
var line2 = new Line2D(new Point3D(0, 0, 0), new Point2D(1, 1, 1));
var degreeAng12 = (180 / Math.PI) * line1.Angle(line2);
// degreeAng12 = -45°
3D плоскость
function Plane3D(norm, dist)
Функция-конструктор трехмерной плоскости.
Плоскость задается вектором нормали к плоскости norm
и расстоянием
dist
от начала координат.
Данная функция используется только для создания заготовки (объявления) плоскости.
Конкретные параметры плоскости задаются с помощью функций
CreatePlaneThreePoints, CreatePlaneNormalVectorPoint,
CreatePlaneVectorTwoPoints, CreateInclinePlane
.
Пример:
var plane = new Plane3D();
// directCos = [undefined, undefined, undefined]
// distOXYZ = undefined
Plane3D.prototype.Normer = function()
Нормировка уравнения плоскости. Данная функция используется внутри функций
CreatePlaneThreePoints, CreatePlaneNormalVectorPoint, CreatePlaneVectorTwoPoints, CreateInclinePlane
.
Plane3D.prototype.CreatePlaneThreePoints = function(point1, point2, point3)
Функция создает плоскость проходящую через три точки
point1, point2
и point3
.
Пример:
var pt1 = new Point3D(1, 5, 2);
var pt2 = new Point3D(4, 2, 6);
var pt3 = new Point3D(3, 1, 3);
var plane = new Plane3D();
plane.CreatePlaneThreePoints(pt1, pt2, pt3);
// directCos = [0.8571.., 0.3296.., -0.3956..]
// distOXYZ = 1.7143892..
Plane3D.prototype.CreatePlaneNormalVectorPoint = function(vector, point)
Создание плоскости по ее нормальному вектору и точке, принадлежащей плоскости.
Пример:
var vec = new Vector3D(1, 1, 1);
var pt = new Point3D(1, 0, 0);
var plane = new Plane3D();
plane.CreatePlaneNormalVectorPoint(vec, pt);
// directCos = [0.5773.., 0.5773.., 0.5773..]
// distOXYZ = 0.5773502691896258
Plane3D.prototype.CreatePlaneVectorTwoPoints = function(vector, point1, point2)
Создание плоскости по вектору vector
, параллельному плоскости,
и двум точкам point1
и point2
, принадлежащим плоскости.
Пример:
var vec = new Vector3D(0, -1, 1);
var pt1 = new Point3D(0, 1, 0);
var pt2 = new Point3D(1, 0, 0);
var plane = new Plane3D();
var pl = plane.CreatePlaneVectorTwoPoints(vec, pt1, pt2);
// pl = plane
// directCos = [0.5773.., 0.5773.., 0.5773..]
// distOXYZ = 0.5773502691896258
Plane3D.prototype.CreatePlaneNormalDistOXYZ = function(norm, dist)
Функция создает плоскость по направляющему вектору norm
и расстоянию от начала координат dist
.
Пример:
var Z0 = new Vector3D(0, 0, 1);
var plane = new Plane3D();
plane.CreatePlaneNormalDistOXYZ(Z0, 4.0);
// directCos = [0, 0, 1]
// distOXYZ = 4
Plane3D.prototype.IntersectionThreePlanes = function(plane2, plane3)
Функция возвращает точку пересечения плоскости this
с плоскостями plane2
и plane3
.
Пример:
var plane1 = new Plane3D();
plane1.CreatePlaneThreePoints(new Point3D(1,1,0),
new Point3D(1,1,1),
new Point3D(0,1,1));
var plane2 = new Plane3D();
plane2.CreatePlaneThreePoints(new Point3D(1,1,0),
new Point3D(1,1,1),
new Point3D(1,0,1));
var plane3 = new Plane3D();
plane3.CreatePlaneThreePoints(new Point3D(1,1,1),
new Point3D(1,0,1),
new Point3D(0,0,1));
var point = plane1.IntersectionThreePlanes(plane2, plane3);
// point = [1, 1, 1]
Plane3D.prototype.VectorIntersectionTwoPlanes = function(plane)
Функция возвращает вектор, имеющий направление прямой по которой пересекаются
плоскости this
и plane
.
Пример:
var plane1 = new Plane3D();
plane1.CreatePlaneThreePoints(new Point3D(1,1,0),
new Point3D(1,1,1),
new Point3D(0,1,1));
var plane2 = new Plane3D();
plane2.CreatePlaneThreePoints(new Point3D(1,1,1),
new Point3D(1,0,1),
new Point3D(0,0,1));
var vec = plane1.VectorIntersectionTwoPlanes(plane2);
// vec = [1, 0, 0]
Plane3D.prototype.Rotate = function(rot)
Функция при помощи матрицы rot
вращает плоскость this
.
Пример:
var plane = new Plane3D();
plane.CreatePlaneThreePoints(new Point3D(1,1,1),
new Point3D(1,0,1),
new Point3D(0,0,1));
// directCos = [0, 0, -1]
// distOXYZ = -1
var mat = new Matrix3D(); // создание (объявление) матрицы
mat.RotX(Math.PI/2); // заполнение компонент матрицы
// поворот плоскости plane вокруг оси X на 90°
plane.Rotate(mat);
// directCos = [0, 1, 0]
// distOXYZ = -1
var dist = plane.DistancePoint(new Point3D(0, 0, 0));
// dist = 1
Plane3D.prototype.DistancePoint = function(point)
Функция возвращает расстояние от точки point
до плоскости this
.
Пример:
var plane = new Plane3D();
// Создаем плоскость проходящую перпендикулярно оси OZ на расстоянии // равным 1 от начала координат.
plane.CreatePlaneThreePoints(new Point3D(1,1,1),
new Point3D(1,0,1),
new Point3D(0,0,1));
// Создаем две точки point1 и point2 находящиеся на одинаковом
// расстоянии по абсолютной величине от плоскости plane но по разные
// стороны от этой плоскости.
var point1 = new Point3D(0, 0, 3);
var dist1 = plane.DistancePoint(point1); // dist1 = -2
var point2 = new Point3D(0, 0, -1);
var dist2 = plane.DistancePoint(point2); // dist2 = 2
// Значения расстояний dist1 и dist2 различаются своими знаками.
Plane3D.prototype.Slope = function()
Функция возвращает угол между плоскостью this
и плоскостью OXY
.
Пример:
var plane1 = new Plane3D();
plane1.CreatePlaneThreePoints(new Point3D(1,1,1),
new Point3D(1,0,1),
new Point3D(0,0,1));
var ang1 = (180 / Math.PI) * plane1.Slope();
// ang1 = 0°
var plane2 = new Plane3D();
plane2.CreatePlaneThreePoints(new Point3D(0, 0, 0),
new Point3D(0.5, 0, 1),
new Point3D(1, 1, 1));
var ang2 = (180 / Math.PI) * plane2.Slope();
// ang2 = 65.90515744788931°
var plane3 = new Plane3D();
plane3.CreatePlaneThreePoints(new Point3D(0, 0, 0),
new Point3D(-0.5, 0, -1),
new Point3D(1, 1, -1));
var ang3 = (180 / Math.PI) * plane3.Slope();
// ang3 = -74.49864043306299°
Plane3D.prototype.Angle = function(plane)
Функция возвращает угол между плоскостью this
и плоскостью plane
.
Пример:
var plane1 = new Plane3D();
plane1.CreatePlaneThreePoints(new Point3D(0, 0, 0),
new Point3D(1,0,1),
new Point3D(1,1,1));
var plane2 = new Plane3D();
plane2.CreatePlaneThreePoints(new Point3D(0, 0, 0),
new Point3D(1,0,1),
new Point3D(1,0,0));
var ang = (180 / Math.PI) * plane1.Angle(plane2);
// ang = 90°
Plane3D.prototype.Normal = function()
Функция возвращает вектор перпендикулярный к плоскости this
.
Пример:
var plane = new Plane3D();
plane.CreatePlaneThreePoints(new Point3D(1,1,3),
new Point3D(1,0,3),
new Point3D(0,0,3));
var normal = plane.Normal(); // normal = [0, 0, -1]
Plane3D.prototype.Distance = function()
Функция возвращает расстояние от плоскости this
до начала координат.
Пример:
var plane = new Plane3D();
plane.CreatePlaneThreePoints(new Point3D(1,1,3),
new Point3D(1,0,3),
new Point3D(0,0,3));
var dist = plane.Distance(); // dist = -3
Line3D.prototype.IntersectionLinePlane = function(plane)
Функция возвращает точку пересечения прямой this
с плоскостью plane
.
Пример:
var plane = new Plane3D();
plane.CreatePlaneThreePoints(new Point3D(1,1,3),
new Point3D(1,0,3),
new Point3D(0,0,3));
var line = new Line3D(new Point3D(2, 3, -4), new Point3D(2, 3, -6));
var point = line.IntersectionLinePlane(plane);
// point = [2, 3, 3]
Plane3D.prototype.CreateInclinePlane = function(angle, point1, point2, point3)
Данная функция создает плоскость наклоненную относительно плоскости OXY
на угол angle
.
Точки point1
и point2
должны иметь одинаковое значение
координаты Z (pt1[2] = pt2[2]
).
Рассчитывается двумерный вектор norm2d и затем определяется плоскость
имеющая наклон angle к плоскости OXY.
Данная функция делает то же самое что и функция Facet
,
но в ней в отличие от функции Facet
, используется наследование через прототипы.
Для лучшего понимания работы функции ниже приведен ее текст:
Plane3D.prototype.CreateInclinePlane = function(angle, pt1, pt2, pt3)
{
var norm2d = new Vector2D(pt1[1] - pt2[1], pt2[0] - pt1[0]);
norm2d.Normer();
var x = Math.sin(angle) * norm2d[0];
var y = Math.sin(angle) * norm2d[1];
var z = Math.cos(angle);
var normPlaneVector = new Vector3D(x, y, z);
normPlaneVector.Normer();
this.CreatePlaneNormalVectorPoint(normPlaneVector, pt3);
this.Normer();
}
Рассчитывается вектор norm2d, который задается точками с координатами pt1 и pt2.
Затем определяется плоскость имеющая наклон angle к плоскости OXY.
Для определения уравнения этой плоскости вычисляется
3D-вектор normPlaneVector, который имеет угол наклона к горизонтальной
плоскости OXY
равный величине угла angle.
Проекции этого вектора на горизонтальную плоскость определяется вектором norm2d
и синусом угла angle. Для искомой плоскости
вектор normPlaneVector принимается в качестве нормального вектора.
Этой плоскости принадлежит точка pt3. Если искомая плоскость проходит через
точки pt1 и pt2 то в качестве pt3 можно взять одну
из этих двух точек. Но часто бывает так, что искомая плоскость не проходит
через точки pt1 и pt2, хотя и задается при помощи вектора проходящего
через эти точки. В этом случае необходимо задать точку pt3 исходя
из того как должна располагаться искомая плоскость.
Следует учесть, что вектор normPlaneVector может быть повернут
на угол angle относительно отрезка, соединяющего точки pt1 и pt2 двумя способами.
В качестве примера можно взять построение граней короны многогранника
Octagon
примыкающих к рундисту. В этой огранке эти грани направлены как бы "внутрь рундиста".
Поэтому точки pt1 и pt2 в параметрах функции заданы
вполне определенным способом:
для A0 - "7 и 0",
для A1 - "0 и 1",
для A2 - "1 и 2",
(для того, чтобы увидеть нумерацию вершин огранки следует нажать кнопку Crown-Gd.-Pav.):
var A0 = new Plane3D();
A0.CreateInclinePlane(angle_A0, girdle[7], girdle[0], girdle[7]);
// Закоментированные варианты также позволяют получить правильное построение грани A0.
// A0.CreateInclinePlane(-angle_A0, girdle[0], girdle[7], girdle[7]);
// var A0 = Facet(angle_A0, girdle[7], girdle[0], girdle[7]);
// var A0 = Facet(-angle_A0, girdle[0], girdle[7], girdle[7]);
var A1 = new Plane3D();
A1.CreateInclinePlane(angle_A0, girdle[0], girdle[1], girdle[0]);
var A2 = new Plane3D();
A2.CreateInclinePlane(angle_A0, girdle[1], girdle[2], girdle[1]);
Если изменить выбор пар точек, например, осуществить выбор точек для грани
A0 так, как показано ниже, то эта грань будет построена не так как ожидалось:
var A0 = new Plane3D();
A0.CreateInclinePlane(angle_A0, girdle[0], girdle[7], girdle[7]);
function Facet(angle,point1, point2, point3)
Данная функция делает то же самое что и функция CreateInclinePlane
,
но в ней не используется наследование через прототипы и она возвращает созданную этой функцией плоскость.
Предполагается, что точки pt1 и pt2 имеют одинаковую величину координаты Z
(pt1[2] = pt2[2]
).
Рассчитывается двумерный вектор norm2d и затем определяется возвращаемая плоскость
имеющая наклон angle к плоскости OXY.
Пример:
var pt1 = new Point3D(0,0,4);
var pt2 = new Point3D(2,1,4)
var pt3 = new Point3D(0.5, 0.5, 6.0)
var plane = Facet(Math.PI/4, pt1, pt2, pt3);
// directCos = [ -0.31622.., 0.63245.., -0.70710..]
// distOXYZ = -4.084526804110867