Показать сообщение отдельно
Старый 22.06.2016, 22:26   #16  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Цитата:
Сообщение от Link Посмотреть сообщение
Ждем интеграции с продуктами Dynamics
Ну раз такое дело, то вот вам первый критикал апдейт
Первоисточник формулы на арбузе.

Джоб:
X++:
static void CannabolaImage(Args _args)
{
    #define.PI(3.1415926535897900)
    
    int W = 500, H = W;       // при таких размерах время построения ~1 минута
    real scale = 1.0;
    
    int x, y, oX, oY;
    real dx, dy, angle, radius;
    int color;
    real bright;
    int start = timenow();

    Image                   image       = new Image();
    ImageList               imageList   = new ImageList(W, H);
    Dialog                  dialog      = new Dialog("Cannabola");
    DialogWindow            dialogWindow= dialog.addWindow();
    FormBuildWindowControl  imageBuildControl;
    FormWindowControl       imageControl;

/****************************************************************
    Формула листа конопли
    Автор: Антон Сухинов
    Подробнее: [url]http://forum.arbuz.uz/index.php?showtopic=998[/url]
*/
    real cannabola(real a, real r)
    {
        real b,c,d,e,f;
        real leafs, contour, barbs, junction, length, vein, petiole ;

        [b, c]      = [ a / 2 * 7,          r * r * r * r ];
        [d, e]      = [ cos(b - c * 0.3),   acos(cos((a + #PI) * 7 - c * 0.3)) ];
        f           = sin(100 * r * cos(a) + 10 * cos(40 * r * sin(a)))
                    + sin(100 * r * sin(a) + 10 * sin(40 * r * cos(a)));
        leafs       = r == 0 ? 0 : 1 / ( abs(d) + (0.005 / r));                             // f1
        contour     = abs(sin(a / 2));                                                      // f5
        barbs       = contour == 0 ? 0
                    : 8 * (((sin(b) * sin(b)) / ((r / contour) * (r / contour) * 10 + 1))
                        / (abs(sin((r - (e + 2 * r * e*e) / 20) * 8 * #PI)) + 0.1 + d*d));  // f2
        junction    = 3 / (10000 * r*r + 0.1);                                              // f3
        length      = contour - r*r;                                                        // f4
        vein        = 1 + 0.01 / (f*f + 0.01);                                              // f6
        petiole     = (r + 0.2) * 0.0002 / ((a - 0.1 * r) * (a - 0.1 * r) + 0.0001);        // f7

        return (((leafs + barbs + junction) * length - contour) * vein) + petiole;
    }
//-------------------------------------------------
    ;
    image.createImage(W, H, 32);
    for (x=0; x < W; x++)
        for (y=0; y < H; y++)
        {
            [oX, oY]    = [W*0.5, H*0.5];
            [dx, dy]    = [x - oX, oY - y];
            angle       = sign(dy) * (dx == 0 ? #PI/2 : (#PI/2 + sign(dx) * (atan(abs(dy/dx)) - #PI/2)));
            radius      = scale * sqrt (dx*dx + dy*dy) / min(oX, oY);
            
            bright      = cannabola(angle, radius);
            color       = (bright  <= 0) ? Image::rgb(255,255,255) 
                                         : Image::rgb(bright, (bright+50)*1.5, bright);
            image.setPixel(y, x, color);
        }
    imageList.add(image);

    dialog.addText(strfmt("ширина %1, высота %2, время построения %3 сек", W, H, timenow() - start));
    imageBuildControl = dialogWindow.control();
    imageBuildControl.width(W);
    imageBuildControl.height(H);
    dialog.doInit();
    imageControl = dialog.formRun().control(imageBuildControl.id());
    imageControl.imageList(imageList);
    dialog.run();
}
И его вывод:
За это сообщение автора поблагодарили: mazzy (2).