![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите перевести с Java на Delphi
Вова © (2013-07-29 13:00:00)Есть реализация алгоритма построение кривой безье. на яве, в котором я ничего не могу понять, особенно в части работы с массивами. Т.е. остальное я вроде перевел, хоть и не уверен что верно, а вот с массивами вообще ничего не понял. да и тип данных также не задается, тоже как то непонятно наставил везде Extended. Алгоритм мне нужен не для рисования, т.е. Канвасные функции не подойдут, потому что они сразу рисуют, а мне нужно не рисовать, мне нужны координаты точек кривой. Если где то есть резвая реализация на делфи, тож сойдет.
// i - номер вершины, n - количество вершин, t - положение кривой (от 0 до 1)
function getBezierBasis(i, n, t) {
// Факториал
function f(n) {
return (n 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);
}
MBo (2013-07-29 17:43:00) [1]Так тебе, наверное, нужна растеризация кривой Безье.
Или упомянутый метод деления de Casteljau (+ Брезенхем, например), или посмотри, есть ли растеризация кривых в Anti-Grain Geometry library: http://www.crossgl.com/aggpas/
Вова (2013-07-29 17:24:00) [2]хотя вру, не медленно ) но все равно нужно по точкам, а не по отрезкам
Вова (2013-07-29 17:10:00) [3]да единственное что маленький алгоритм не точками, а отрезками рисует (т.е. между соседними точками разрывы). можно конечно задать 5000 отрезков, но тогда сильно медленно (
Вова (2013-07-29 17:08:00) [4]
> Для какой цели это нужно?Кривая может иметь сильно разную
> кривизну в разных точках (вплоть до "клювиков" - cusps),
> поэтому генерация точек с равномерным шагом по параметру
> не всегда оправдана (зависит от задачи). Часто применяется
> рекурсивное деление методом de Casteljau.
Для целей задания траектории, которая должна быть кривой, но пологой и каждый вызов функции разной ), попробовал тот короткий алгоритм вверху, чего то происходит в принципе, нужно разбираться.
MBo (2013-07-29 16:35:00) [5]Для какой цели это нужно?
Кривая может иметь сильно разную кривизну в разных точках (вплоть до "клювиков" - cusps), поэтому генерация точек с равномерным шагом по параметру не всегда оправдана (зависит от задачи). Часто применяется рекурсивное деление методом de Casteljau.
Rouse_ (2013-07-29 14:51:00) [6]http://rouse.drkb.ru/other.php#bezier
Вова (2013-07-29 14:37:00) [7]
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;
мне понравилась такая ) надеюсь она работает )
Dimka Maslov (2013-07-29 14:19:00) [8]Кубическая параметрическая формула для построения кривой Безье есть вещь элементарная
Вова (2013-07-29 13:52:00) [9]http://superinfo.do.am/load/5-1-0-379
http://www.enlight.ru/demo/faq/smth.phtml?query=alg_curves_splines
хм нашел, ток офигенная куча букв там...пошел курить.
RWolf (2013-07-29 13:01:00) [10]это JS, а не Java.