Класс CubicCurve2D
- Все реализованные интерфейсы:
-
Shape,Cloneable
- Непосредственные известные подклассы:
-
CubicCurve2D.Double,CubicCurve2D.Float
public abstract class CubicCurve2D extends Object implements Shape, Cloneable
CubicCurve2D определяет сегмент кубической параметрической кривой в (x,y) системе координат. Этот класс является только абстрактным суперклассом для всех объектов, хранящих сегмент 2D кубической кривой. Фактическое представление координат остается за подклассом.
- С тех пор:
- 1.2
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
static class |
CubicCurve2D.Double |
Сегмент кубической параметрической кривой, заданный с помощью double координат. |
static class |
CubicCurve2D.Float |
Сегмент кубической параметрической кривой, заданный с помощью float координат. |
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Это абстрактный класс, который нельзя создать напрямую. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
Object |
clone() |
Создаёт новый объект того же класса, что и этот объект. |
boolean |
contains |
Проверяет, находятся ли указанные координаты внутри границы Shape, как описано в определении внутри области. |
boolean |
contains |
Проверяет, полностью ли внутренняя область Shape содержит указанную прямоугольную область. |
boolean |
contains |
Проверяет, находится ли указанная Point2D внутри границы Shape, как описано в определении внутри области. |
boolean |
contains |
Проверяет, полностью ли внутренняя область Shape содержит указанную Rectangle2D. |
Rectangle |
getBounds() |
Возвращает целочисленный Rectangle, который полностью охватывает Shape. |
Rectangle2D |
getBounds2D() |
Возвращает высокоточную и более точную ограничивающую рамку Shape, чем метод getBounds. |
abstract Point2D |
getCtrlP1() |
Возвращает первую контрольную точку. |
abstract Point2D |
getCtrlP2() |
Возвращает вторую контрольную точку. |
abstract double |
getCtrlX1() |
Возвращает координату X первой контрольной точки с двойной точностью. |
abstract double |
getCtrlX2() |
Возвращает координату X второй контрольной точки с двойной точностью. |
abstract double |
getCtrlY1() |
Возвращает координату Y первой контрольной точки с двойной точностью. |
abstract double |
getCtrlY2() |
Возвращает координату Y второй контрольной точки с двойной точностью. |
double |
getFlatness() |
Возвращает плавность этой кривой. |
static double |
getFlatness |
Возвращает плавность кубической кривой, заданной контрольными точками, хранящимися в указанном массиве по указанному индексу. |
static double |
getFlatness |
Возвращает плавность кубической кривой, заданной указанными контрольными точками. |
double |
getFlatnessSq() |
Возвращает квадрат плавности этой кривой. |
static double |
getFlatnessSq |
Возвращает квадрат плавности кубической кривой, заданной контрольными точками, хранящимися в указанном массиве по указанному индексу. |
static double |
getFlatnessSq |
Возвращает квадрат плавности кубической кривой, заданной указанными контрольными точками. |
abstract Point2D |
getP1() |
Возвращает начальную точку. |
abstract Point2D |
getP2() |
Возвращает конечную точку. |
PathIterator |
getPathIterator |
Возвращает объект итерации, определяющий границу фигуры. |
PathIterator |
getPathIterator |
Возвращает объект итерации, определяющий границу сглаженной фигуры. |
abstract double |
getX1() |
Возвращает координату X начальной точки с двойной точностью. |
abstract double |
getX2() |
Возвращает координату X конечной точки с двойной точностью. |
abstract double |
getY1() |
Возвращает координату Y начальной точки с двойной точностью. |
abstract double |
getY2() |
Возвращает координату Y конечной точки с двойной точностью. |
boolean |
intersects |
Проверяет, пересекается ли внутренняя область Shape с внутренней областью указанной прямоугольной области. |
boolean |
intersects |
Проверяет, пересекается ли внутренняя область Shape с внутренней областью указанной Rectangle2D. |
void |
setCurve |
Устанавливает расположение конечных и контрольных точек этой кривой в соответствии с координатами с плавающей точкой по указанному смещению в указанном массиве. |
abstract void |
setCurve |
Устанавливает расположение конечных и контрольных точек этой кривой в соответствии с указанными координатами с плавающей точкой. |
void |
setCurve |
Устанавливает расположение конечных и контрольных точек этой кривой в соответствии с теми же, что и в указанной CubicCurve2D. |
void |
setCurve |
Устанавливает расположение конечных и контрольных точек этой кривой в соответствии с координатами объектов Point2D по указанному смещению в указанном массиве. |
void |
setCurve |
Устанавливает расположение конечных и контрольных точек этой кривой в соответствии с указанными координатами Point2D. |
static int |
solveCubic |
Решает кубическое уравнение, коэффициенты которого находятся в массиве eqn, и возвращает количество корней, размещая действительные корни обратно в тот же массив. |
static int |
solveCubic |
Решает кубическое уравнение, коэффициенты которого находятся в массиве eqn, и размещает действительные корни в массив res, возвращая количество корней. |
static void |
subdivide |
Делит кубическую кривую, заданную координатами, хранящимися в массиве src по индексам srcoff до (srcoff + 7), и сохраняет полученные две разделенные кривые в двух результатных массивах по соответствующим индексам. |
void |
subdivide |
Делит эту кубическую кривую и сохраняет полученные две разделенные кривые в левой и правой кривых. |
static void |
subdivide |
Делит кубическую кривую, заданную параметром src, и сохраняет полученные две разделенные кривые в параметрах кривых left и right. |
Подробное описание конструкторов
CubicCurve2D
protected CubicCurve2D()
- С тех пор:
- 1.2
- См. также:
Подробное описание методов
getX1
public abstract double getX1()
- Возвращает:
- координату X начальной точки
CubicCurve2D. - С тех пор:
- 1.2
getY1
public abstract double getY1()
- Возвращает:
- координату Y начальной точки
CubicCurve2D. - С тех пор:
- 1.2
getP1
public abstract Point2D getP1()
- Возвращает:
- объект
Point2D, представляющий начальную точкуCubicCurve2D. - С тех пор:
- 1.2
getCtrlX1
public abstract double getCtrlX1()
- Возвращает:
- координату X первой контрольной точки
CubicCurve2D. - С тех пор:
- 1.2
getCtrlY1
public abstract double getCtrlY1()
- Возвращает:
- координату Y первой контрольной точки
CubicCurve2D. - С тех пор:
- 1.2
getCtrlP1
public abstract Point2D getCtrlP1()
- Возвращает:
- объект
Point2D, представляющий первую контрольную точкуCubicCurve2D. - С тех пор:
- 1.2
getCtrlX2
public abstract double getCtrlX2()
- Возвращает:
- координату X второй контрольной точки
CubicCurve2D. - С тех пор:
- 1.2
getCtrlY2
public abstract double getCtrlY2()
- Возвращает:
- координату Y второй контрольной точки
CubicCurve2D. - С тех пор:
- 1.2
getCtrlP2
public abstract Point2D getCtrlP2()
- Возвращает:
- объект
Point2D, представляющий вторую контрольную точкуCubicCurve2D. - С тех пор:
- 1.2
getX2
public abstract double getX2()
- Возвращает:
- координату X конечной точки
CubicCurve2D. - С тех пор:
- 1.2
getY2
public abstract double getY2()
- Возвращает:
- координату Y конечной точки
CubicCurve2D. - С тех пор:
- 1.2
getP2
public abstract Point2D getP2()
- Возвращает:
- объект
Point2D, представляющий конечную точкуCubicCurve2D. - С тех пор:
- 1.2
setCurve
public abstract void setCurve(double x1, double y1, double ctrlx1, double ctrly1, double ctrlx2, double ctrly2, double x2, double y2)
- Параметры:
-
x1- координата X, используемая для установки начальной точки этойCubicCurve2D -
y1- координата Y, используемая для установки начальной точки этойCubicCurve2D -
ctrlx1- координата X, используемая для установки первой контрольной точки этойCubicCurve2D -
ctrly1- координата Y, используемая для установки первой контрольной точки этойCubicCurve2D -
ctrlx2- координата X, используемая для установки второй контрольной точки этойCubicCurve2D -
ctrly2- координата Y, используемая для установки второй контрольной точки этойCubicCurve2D -
x2- координата X, используемая для установки конечной точки этойCubicCurve2D -
y2- координата Y, используемая для установки конечной точки этойCubicCurve2D - С тех пор:
- 1.2
setCurve
public void setCurve(double[] coords, int offset)
- Параметры:
-
coords- массив координат с типом double -
offset- индекс, с которого начинается установка конечных точек и контрольных точек этой кривой на координаты, содержащиеся вcoords - С тех пор:
- 1.2
setCurve
public void setCurve(Point2D p1, Point2D cp1, Point2D cp2, Point2D p2)
- Параметры:
-
p1- первый указанный объект Point2D, используемый для установки начальной точки этой кривой -
cp1- второй указанный объект Point2D, используемый для установки первой контрольной точки этой кривой -
cp2- третий указанный объект Point2D, используемый для установки второй контрольной точки этой кривой -
p2- четвёртый указанный объект Point2D, используемый для установки конечной точки этой кривой - С тех пор:
- 1.2
setCurve
public void setCurve(Point2D[] pts, int offset)
- Параметры:
-
pts- массив объектов Point2D -
offset- индекс, с которого начинается установка конечных точек и контрольных точек этой кривой на точки, содержащиеся вpts - С тех пор:
- 1.2
setCurve
public void setCurve(CubicCurve2D c)
- Параметры:
-
c- указанная кривая - С тех пор:
- 1.2
getFlatnessSq
public static double getFlatnessSq(double x1, double y1, double ctrlx1, double ctrly1, double ctrlx2, double ctrly2, double x2, double y2)
- Параметры:
-
x1- координата X, определяющая начальную точкуCubicCurve2D -
y1- координата Y, определяющая начальную точкуCubicCurve2D -
ctrlx1- координата X, определяющая первую контрольную точкуCubicCurve2D -
ctrly1- координата Y, определяющая первую контрольную точкуCubicCurve2D -
ctrlx2- координата X, определяющая вторую контрольную точкуCubicCurve2D -
ctrly2- координата Y, определяющая вторую контрольную точкуCubicCurve2D -
x2- координата X, определяющая конечную точкуCubicCurve2D -
y2- координата Y, определяющая конечную точкуCubicCurve2D - Возвращает:
- квадрат отклонения
CubicCurve2D, представленной указанными координатами. - С тех пор:
- 1.2
getFlatness
public static double getFlatness(double x1, double y1, double ctrlx1, double ctrly1, double ctrlx2, double ctrly2, double x2, double y2)
- Parameters:
-
x1- координата X, определяющая начальную точкуCubicCurve2D -
y1- координата Y, определяющая начальную точкуCubicCurve2D -
ctrlx1- координата X, определяющая первую опорную точкуCubicCurve2D -
ctrly1- координата Y, определяющая первую опорную точкуCubicCurve2D -
ctrlx2- координата X, определяющая вторую опорную точкуCubicCurve2D -
ctrly2- координата Y, определяющая вторую опорную точкуCubicCurve2D -
x2- координата X, определяющая конечную точкуCubicCurve2D -
y2- координата Y, определяющая конечную точкуCubicCurve2D - Returns:
- степень кривизны
CubicCurve2D, представленной указанными координатами. - Since:
- 1.2
getFlatnessSq
public static double getFlatnessSq(double[] coords, int offset)
- Parameters:
-
coords- массив, содержащий координаты -
offset- индексcoords, с которого начинать получение конечных точек и опорных точек кривой - Returns:
- квадрат степени кривизны
CubicCurve2D, заданной координатами вcoordsпо указанному смещению. - Since:
- 1.2
getFlatness
public static double getFlatness(double[] coords, int offset)
- Parameters:
-
coords- массив, содержащий координаты -
offset- индексcoords, с которого начинать получение конечных точек и опорных точек кривой - Returns:
- степень кривизны
CubicCurve2D, заданной координатами вcoordsпо указанному смещению. - Since:
- 1.2
getFlatnessSq
public double getFlatnessSq()
- Returns:
- квадрат степени кривизны этой кривой.
- Since:
- 1.2
getFlatness
public double getFlatness()
- Returns:
- степень кривизны этой кривой.
- Since:
- 1.2
subdivide
public void subdivide(CubicCurve2D left, CubicCurve2D right)
- Parameters:
-
left- объект кубической кривой для хранения левой или первой половины разделенной кривой -
right- объект кубической кривой для хранения правой или второй половины разделенной кривой - Since:
- 1.2
subdivide
public static void subdivide(CubicCurve2D src, CubicCurve2D left, CubicCurve2D right)
src, и сохраняет полученные две разделенные кривые в параметрах кривых left и right. Левый и/или правый объекты могут быть такими же, как объект src, или null. - Parameters:
-
src- кубическая кривая, подлежащая разделению -
left- объект кубической кривой для хранения левой или первой половины разделенной кривой -
right- объект кубической кривой для хранения правой или второй половины разделенной кривой - Since:
- 1.2
subdivide
public static void subdivide(double[] src, int srcoff, double[] left, int leftoff, double[] right, int rightoff)
src по индексам srcoff через (srcoff + 7), и сохраняет полученные две разделенные кривые в двух массивах результатов по соответствующим индексам. Массивы left и right могут быть null или ссылаться на тот же массив, что и массив src. Обратите внимание, что последняя точка первой разделенной кривой совпадает с первой точкой второй разделенной кривой. Поэтому можно передать один и тот же массив для left и right и использовать смещения, такие как rightoff равно (leftoff + 6), чтобы избежать выделения дополнительного места для этой общей точки.- Parameters:
-
src- массив, содержащий координаты исходной кривой -
srcoff- смещение в массиве начала 6 исходных координат -
left- массив для хранения координат первой половины разделенной кривой -
leftoff- смещение в массиве начала 6 левых координат -
right- массив для хранения координат второй половины разделенной кривой -
rightoff- смещение в массиве начала 6 правых координат - Since:
- 1.2
solveCubic
public static int solveCubic(double[] eqn)
eqn, и помещает действительные корни в тот же массив, возвращая количество корней. Решаемое кубическое уравнение представлено уравнением:
eqn = {c, b, a, d}
dx^3 + ax^2 + bx + c = 0
. Значение -1 используется для различения константного уравнения, которое может быть всегда 0 или никогда не 0, от уравнения, у которого нет нулей.- Parameters:
-
eqn- массив, содержащий коэффициенты кубического уравнения - Returns:
- количество корней или -1, если уравнение является константным.
- Since:
- 1.2
solveCubic
public static int solveCubic(double[] eqn, double[] res)
eqn, и помещает действительные корни в массив res, возвращая количество корней. Решаемое кубическое уравнение представлено уравнением: eqn = {c, b, a, d} dx^3 + ax^2 + bx + c = 0. Значение -1 используется для различения константного уравнения, которое может быть всегда 0 или никогда не 0, от уравнения, у которого нет нулей.- Parameters:
-
eqn- указанный массив коэффициентов, используемых для решения кубического уравнения -
res- массив, содержащий действительные корни, полученные в результате решения кубического уравнения - Returns:
- количество корней или -1, если уравнение является константным
- Since:
- 1.3
contains
public boolean contains(double x, double y)
Shape, как описано в определении внутри.- Specified by:
-
containsв интерфейсеShape - Parameters:
-
x- указанная координата X для проверки -
y- указанная координата Y для проверки - Returns:
-
true, если указанные координаты находятся внутри границShape;falseв противном случае. - Since:
- 1.2
contains
public boolean contains(Point2D p)
Point2D внутри границ Shape, как описано в определении внутри.- Specified by:
-
containsв интерфейсеShape - Parameters:
-
p- указанная точка для проверки - Returns:
-
true, если указанная точка находится внутри границShape;falseв противном случае. - Since:
- 1.2
intersects
public boolean intersects(double x, double y, double w, double h)
Shape с внутренней областью заданной прямоугольной области. Прямоугольная область считается пересекающейся с Shape , если хотя бы одна точка содержится как во внутренней области Shape, так и в заданной прямоугольной области. Метод Shape.intersects() позволяет реализации Shape консервативно возвращать true в случаях:
- с высокой вероятностью пересечения прямоугольной области и
Shape, но - вычисления точного определения этого пересечения слишком затратны.
Shapes этот метод может возвращать true даже если прямоугольная область не пересекает Shape. Класс Area выполняет более точные вычисления геометрического пересечения, чем большинство объектов Shape и поэтому может использоваться, если требуется более точный ответ.- Определено в:
-
intersectsв интерфейсеShape - Параметры:
-
x- координата X левого верхнего угла заданной прямоугольной области -
y- координата Y левого верхнего угла заданной прямоугольной области -
w- ширина заданной прямоугольной области -
h- высота заданной прямоугольной области - Возвращает:
-
trueесли внутренняя областьShapeи внутренняя область прямоугольной области пересекаются или с высокой вероятностью пересекаются, а вычисления пересечения слишком сложны;falseв противном случае. - С:
- 1.2
- См. также:
intersects
public boolean intersects(Rectangle2D r)
Shape с внутренней областью заданного Rectangle2D. Метод Shape.intersects() позволяет реализации Shape консервативно возвращать true в случаях: - с высокой вероятностью пересечения
Rectangle2DиShape, но - вычисления точного определения этого пересечения слишком затратны.
Shapes этот метод может возвращать true даже если Rectangle2D не пересекает Shape. Класс Area выполняет более точные вычисления геометрического пересечения, чем большинство объектов Shape и поэтому может использоваться, если требуется более точный ответ.- Определено в:
-
intersectsв интерфейсеShape - Параметры:
-
r- заданныйRectangle2D - Возвращает:
-
trueесли внутренняя областьShapeи внутренняя область заданногоRectangle2Dпересекаются или с высокой вероятностью пересекаются, а вычисления пересечения слишком сложны;falseв противном случае. - С:
- 1.2
- См. также:
contains
public boolean contains(double x, double y, double w, double h)
Shape содержит заданную прямоугольную область. Все координаты, лежащие внутри прямоугольной области, должны лежать внутри Shape для того, чтобы вся прямоугольная область считалась содержащейся внутри Shape. Метод Shape.contains() позволяет реализации Shape консервативно возвращать false в случаях:
- метод
intersectвозвращаетtrueи - вычисления того, содержит ли
Shapeполностью прямоугольную область, слишком затратны.
Shapes этот метод может возвращать false даже если Shape содержит прямоугольную область. Класс Area выполняет более точные геометрические вычисления, чем большинство объектов Shape и поэтому может использоваться, если требуется более точный ответ.- Определено в:
-
containsв интерфейсеShape - Параметры:
-
x- координата X левого верхнего угла заданной прямоугольной области -
y- координата Y левого верхнего угла заданной прямоугольной области -
w- ширина заданной прямоугольной области -
h- высота заданной прямоугольной области - Возвращает:
-
trueесли внутренняя областьShapeполностью содержит заданную прямоугольную область;falseв противном случае или еслиShapeсодержит прямоугольную область, и методintersectsвозвращаетtrueи вычисления содержательности слишком затратны. - С:
- 1.2
- См. также:
contains
public boolean contains(Rectangle2D r)
Shape содержит заданный Rectangle2D. Метод Shape.contains() позволяет реализации Shape консервативно возвращать false в случаях: - метод
intersectвозвращаетtrueи - вычисления того, содержит ли
ShapeполностьюRectangle2D, слишком затратны.
Shapes этот метод может возвращать false даже если Shape содержит Rectangle2D. Класс Area выполняет более точные геометрические вычисления, чем большинство объектов Shape и поэтому может использоваться, если требуется более точный ответ.- Определено в:
-
containsв интерфейсеShape - Параметры:
-
r- ЗаданныйRectangle2D - Возвращает:
-
trueесли внутренняя областьShapeполностью содержитRectangle2D;falseв противном случае или еслиShapeсодержитRectangle2D, а методintersectsвозвращаетtrueи вычисления содержательности слишком затратны. - С:
- 1.2
- См. также:
getBounds2D
public Rectangle2D getBounds2D()
Shape по сравнению с методом getBounds. Обратите внимание, что нет гарантии, что возвращаемый Rectangle2D является наименьшей ограничивающей прямоугольной областью, охватывающей Shape, только что Shape полностью лежит внутри указанной Rectangle2D. Ограничивающая прямоугольная область, возвращаемая этим методом, обычно уже, чем возвращаемая методом getBounds, и никогда не выходит из строя из-за переполнения, так как значение возврата может быть экземпляром Rectangle2D, который использует значения с двойной точностью для хранения размеров. Обратите внимание, что определение вложенности может привести к ситуациям, когда точки на определяющей контуре shape могут не считаться содержащимися в возвращенном объекте bounds, но только в тех случаях, когда эти точки также не считаются содержащимися в исходном shape.
Если point находится внутри shape в соответствии с методом contains(point), то она должна находиться внутри возвращаемой Rectangle2D ограничивающей прямоугольной области в соответствии с методом contains(point) объекта bounds. Конкретно:
shape.contains(p) требует bounds.contains(p)
Если point не находится внутри shape, то она может все еще находиться внутри объекта bounds:
bounds.contains(p) не подразумевает shape.contains(p)
- Определено в:
-
getBounds2Dв интерфейсеShape - Возвращает:
- экземпляр
Rectangle2D, являющийся высокоточной ограничивающей прямоугольной областьюShape. - С:
- 1.2
- См. также:
getBounds
public Rectangle getBounds()
Rectangle, которое полностью охватывает Shape. Обратите внимание, что нет гарантии, что возвращаемое Rectangle является наименьшей ограничивающей рамкой, охватывающей Shape, только то, что Shape целиком находится внутри указанной Rectangle. Возвращаемое Rectangle также может не полностью охватывать Shape, если Shape превышает ограниченный диапазон целочисленного типа данных. Метод getBounds2D обычно возвращает более тесную ограничивающую рамку из-за большей гибкости в представлении. Обратите внимание, что определение принадлежности может привести к ситуациям, когда точки на определяющей контуре shape могут не считаться содержащимися в возвращаемом bounds объекте, но только в тех случаях, когда эти точки также не считаются содержащимися в исходном shape.
Если point находится внутри shape в соответствии с методом contains(point), то оно должно быть внутри возвращаемых границ Rectangle в соответствии с методом contains(point) объекта bounds. Конкретно:
shape.contains(x,y) требует bounds.contains(x,y)
Если point не находится внутри shape, то оно все еще может содержаться в объекте bounds:
bounds.contains(x,y) не подразумевает shape.contains(x,y)
- Указано в:
-
getBoundsв интерфейсеShape - Возвращает:
- целочисленную
Rectangleрамку, которая полностью охватываетShape. - С:
- 1.2
- См. также:
getPathIterator
public PathIterator getPathIterator(AffineTransform at)
CubicCurve2D класс не гарантирует, что изменения геометрии этого CubicCurve2D объекта не повлияют на какие-либо итерации этой геометрии, которые уже находятся в процессе.- Указано в:
-
getPathIteratorв интерфейсеShape - Параметры:
-
at- необязательноеAffineTransformдля применения к координатам по мере их возвращения в итерации илиnull, если желаемы не преобразованные координаты - Возвращает:
- объект
PathIterator, который возвращает геометрию контура этогоCubicCurve2D, по одному сегменту за раз. - С:
- 1.2
getPathIterator
public PathIterator getPathIterator(AffineTransform at, double flatness)
CubicCurve2D класс не гарантирует, что изменения геометрии этого CubicCurve2D объекта не повлияют на любые итерации этой геометрии, которые уже находятся в процессе.- Указано в:
-
getPathIteratorв интерфейсеShape - Параметры:
-
at- необязательноеAffineTransformдля применения к координатам по мере их возвращения в итерации, илиnull, если желаемы не преобразованные координаты -
flatness- максимальное отклонение от коллинеарности контрольных точек кривой, после которого кривая заменяется отрезком прямой, соединяющим конечные точки. - Возвращает:
- объект
PathIterator, который возвращает геометрию контура этойCubicCurve2D, по одному сегменту за раз. - С:
- 1.2
clone
public Object clone()
- Переопределяет:
-
cloneв классеObject - Возвращает:
- клон этого экземпляра.
- Используется:
-
OutOfMemoryError- если памяти недостаточно. - С:
- 1.2
- См. также:
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.desktop/java/awt/geom/CubicCurve2D.html