Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.05.18;
Скачать: CL | DM;

Вниз

Помогите перевести с 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.006 c
15-1383152239
Rouse_
2013-10-30 20:57
2014.05.18
Требуется небольшая вычитка статьи.


15-1384259097
L8
2013-11-12 16:24
2014.05.18
Как определить что в TImage?


2-1374915886
blackmane
2013-07-27 13:04
2014.05.18
Вывод формы в активный сеанс


2-1374929827
dis12345
2013-07-27 16:57
2014.05.18
отрисовка на форме


15-1381867348
Германн
2013-10-16 00:02
2014.05.18
Линукс