Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1375017722
SkAndriy
2013-07-28 17:22
2014.05.18
Delphi XE4 функция StrPCopy не рекомендована


15-1384338945
[ВладОшин]
2013-11-13 14:35
2014.05.18
Синхронизация потоков через БД


15-1384356169
L8
2013-11-13 19:22
2014.05.18
Быстро закрасить кусок памяти


11-1250509132
Демьян
2009-08-17 15:38
2014.05.18
Закрыть все модальные формы


15-1381825860
[ВладОшин]
2013-10-15 12:31
2014.05.18
Порассуждаем? Кредитная карта пришла по почте





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский