Цитата:
Сообщение от
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();
}
И его вывод: