Форум: "Начинающим";
Текущий архив: 2014.05.18;
Скачать: [xml.tar.bz2];
ВнизПомогите перевести с Java на Delphi Найти похожие ветки
← →
Вова (2013-07-29 13:00) [0]Есть реализация алгоритма построение кривой безье. на яве, в котором я ничего не могу понять, особенно в части работы с массивами. Т.е. остальное я вроде перевел, хоть и не уверен что верно, а вот с массивами вообще ничего не понял. да и тип данных также не задается, тоже как то непонятно наставил везде Extended. Алгоритм мне нужен не для рисования, т.е. Канвасные функции не подойдут, потому что они сразу рисуют, а мне нужно не рисовать, мне нужны координаты точек кривой. Если где то есть резвая реализация на делфи, тож сойдет.
// i - номер вершины, n - количество вершин, t - положение кривой (от 0 до 1)
function getBezierBasis(i, n, t) {
// Факториал
function f(n) {
return (n <= 1) ? 1 : n * f(n - 1);
};
// считаем i-й элемент полинома Берштейна
return (f(n)/(f(i)*f(n - i)))* Math.pow(t, i)*Math.pow(1 - t, n - i);
}
// arr - массив опорных точек. Точка - двухэлементный массив, (x = arr[0], y = arr[1])
// step - шаг при расчете кривой (0 < step < 1), по умолчанию 0.01
function getBezierCurve(arr, step) {
if (step == undefined) {
step = 0.01;
}
var res = new Array()
for (var t = 0; t < 1 + step; t += step) {
if (t > 1) {
t = 1;
}
var ind = res.length;
res[ind] = new Array(0, 0);
for (var i = 0; i < arr.length; i++) {
var b = getBezierBasis(i, arr.length - 1, t);
res[ind][0] += arr[i][0] * b;
res[ind][1] += arr[i][1] * b;
}
}
return res;
}
// ctx - rendering context холста, arr - массив точек по которым строим кривую
// delay - задержка перед отрисовкой следующей точки, pause - пауза перед началом рисования,
function drawLines(ctx, arr, delay, pause) {
if (delay == undefined) {
delay = 10;
}
if (pause == undefined) {
pause = delay;
}
var i = 0;
function delayDraw() {
if (i >= arr.length - 1) {
return;
}
ctx.moveTo(arr[i][0],arr[i][1]);
ctx.lineTo(arr[i+1][0],arr[i+1][1]);
ctx.stroke();
++i;
setTimeout(delayDraw, delay);
}
setTimeout(delayDraw, pause);
}
drawC = document.getElementById("bezier");
drawC.width = document.width - 30;
drawC.height = document.height - 30;
if (drawC && drawC.getContext) {
ctx = drawC.getContext("2d");
ctx.fillStyle="#33CC99";
ctx.lineWidth=0.1;
var flow; // Массив координат кривой
var arr = new Array();
arr[0] = new Array(0, 100);
arr[1] = new Array(100, 80);
arr[2] = new Array(150, 150);
arr[3] = new Array(200, 155);
flow = getBezierCurve(new Array(arr[0], arr[1], arr[2], arr[3]), 0.01);
drawLines(ctx, flow, 10);
}
← →
RWolf © (2013-07-29 13:01) [1]это JS, а не Java.
← →
Вова (2013-07-29 13:52) [2]http://superinfo.do.am/load/5-1-0-379
http://www.enlight.ru/demo/faq/smth.phtml?query=alg_curves_splines
хм нашел, ток офигенная куча букв там...пошел курить.
← →
Dimka Maslov © (2013-07-29 14:19) [3]Кубическая параметрическая формула для построения кривой Безье есть вещь элементарная
← →
Вова (2013-07-29 14:37) [4]
Procedure DrawSpline(x1,y1,x2,y2,x3,y3,x4,y4:real;k:Word);
Var
rx,ry : real;
n:word;
Begin
moveto(x1,y1);
for n:=0 to k do
Begin
rx :=
{0} 1 * 1 * (1-n/k)*(1- n/k)*(1-n/k) * x1 +
{1} 3 * n/k * (1-n/k)*(1- n/k) * x2 +
{2} 3 * n*n/k/k * (1-n/k) * x3 +
{3} 1 * n*n*n/k/k/k * 1 * x4;
ry :=
{0} 1 * 1 * (1-n/k)*(1- n/k)*(1-n/k) * y1 +
{1} 3 * n/k * (1-n/k)*(1- n/k) * y2 +
{2} 3 * n*n/k/k * (1-n/k) * y3 +
{3} 1 * n*n*n/k/k/k * 1 * y4;
lineto(rx,ry);
End;
End;
мне понравилась такая ) надеюсь она работает )
← →
Rouse_ © (2013-07-29 14:51) [5]http://rouse.drkb.ru/other.php#bezier
← →
MBo © (2013-07-29 16:35) [6]Для какой цели это нужно?
Кривая может иметь сильно разную кривизну в разных точках (вплоть до "клювиков" - cusps), поэтому генерация точек с равномерным шагом по параметру не всегда оправдана (зависит от задачи). Часто применяется рекурсивное деление методом de Casteljau.
← →
Вова (2013-07-29 17:08) [7]
> Для какой цели это нужно?Кривая может иметь сильно разную
> кривизну в разных точках (вплоть до "клювиков" - cusps),
> поэтому генерация точек с равномерным шагом по параметру
> не всегда оправдана (зависит от задачи). Часто применяется
> рекурсивное деление методом de Casteljau.
Для целей задания траектории, которая должна быть кривой, но пологой и каждый вызов функции разной ), попробовал тот короткий алгоритм вверху, чего то происходит в принципе, нужно разбираться.
← →
Вова (2013-07-29 17:10) [8]да единственное что маленький алгоритм не точками, а отрезками рисует (т.е. между соседними точками разрывы). можно конечно задать 5000 отрезков, но тогда сильно медленно (
← →
Вова (2013-07-29 17:24) [9]хотя вру, не медленно ) но все равно нужно по точкам, а не по отрезкам
← →
MBo © (2013-07-29 17:43) [10]Так тебе, наверное, нужна растеризация кривой Безье.
Или упомянутый метод деления de Casteljau (+ Брезенхем, например), или посмотри, есть ли растеризация кривых в Anti-Grain Geometry library: http://www.crossgl.com/aggpas/
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2014.05.18;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.002 c