Как аппроксимировать эллипс, чтобы заполнить данный прямоугольник, используя кривые Безье? - PullRequest
0 голосов
/ 12 апреля 2011

Я попробовал приведенный ниже код, который хорошо рисует окружность, если ширина прямоугольника равна его высоте;но он не рисует большой овал, «углы» очень заострены.Есть предложения?

float width = rect.width();
float height = rect.height();
float centerX = rect.width() / 2;
float centerY = rect.height() / 2;

float diameter = Math.min(width, height); 
float length = (float) (0.5522847498 * diameter/2);


path.moveTo(0, centerY);
path.cubicTo(0, centerY - length, 0, centerX - length, 0, centerX, 0);
path.cubicTo(centerX + length, 0, width, centerY - length, height, centerY);
path.cubicTo(width, centerY + length, centerX + length, height, centerX, height);
path.cubicTo(centerX - length, height, 0, centerY + length, 0, centerY);

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

Вы должны масштабировать length в зависимости от того, на какой оси он находится, чтобы расстояние от каждой конечной точки дуги до соседних контрольных точек было (не фиксировано, а) фиксированной долей оси, по которой вы движетесь параллельно в этой точке .

0 голосов
/ 12 апреля 2011

Если это настоящий прямоугольник с прямыми углами, то это должно быть легко.Большая и малая оси эллипса равны длине сторон прямоугольника, а центр эллипса расположен на пересечении диагоналей прямоугольника.

Я не знаю, как это выразить какБезье сплайнирует на макушке головы, но классическое уравнение для эллипса должно быть достаточно простым для написания, если сначала вы преобразуетесь в соответствующую систему координат (например, ось х вдоль большой оси прямоугольника / эллипса, уось вдоль малой оси прямоугольника / эллипса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...