С++ Builder5 визуализация

AndrewNew

Может знает кто, как сделать визуализацию цветами. Например: у меня есть сетка (массив размером 200 на 20 ячеек(прямоугольная, криволинейная -не важно прога выдает в каждый момент времени координаты ячеек сетки, считаются в нутри ячеек какие- то параметры. Дык мне нужно, в зависимости от значений этих параметров как то по-разному раскрасить ети ячейки. Может есть какие то команды. В принципе в билдере все вроде черно белое, но может есть команды для разных заштриховок.

yolki

Image1->Canvas->Brush->Color=clGreen;
Image1->Canvas->Rectangle(10,10,20,20);

AndrewNew

а что ето в аргументах

yolki

А в хелп заглянуть? Или по наглицки не понимайт?

AndrewNew

ну слабовато бля таких мануалов у меня

yolki

Rectangle(int X1, int Y1, int X2, int Y2);
Rectangle рисует прямоугольник от одной точки (x1,y1) до другой (x2,y2)
чтобы нарисовать массив прямоугольников 200х20 можно сделать так:
пусть у тебя есть массив int Data[], в котором 0 и 1, и нужно закрасить 0 - красным, 1 - зелёным, тогда:

for(i=0;i<200;i++)
for(j=0;j<20;j++)
{
if(Data[i+j*200])
Image1->Canvas->Brush->Color=clGreen; else
Image1->Canvas->Brush->Color=clRed;
Image1->Canvas->Rectangle(i*5,j*5,i*5+4,j*5+4);
}
200*5 - ширина такой картинки будет 1000 пикс

AndrewNew

Кстати, а важно ли прямоугольная или криволинейная фигура в самом деле? И что делать если у меня криволинейная сетка

yolki

А кривая - это как?

так?

AndrewNew

вообще моя прога путем геометрических преобразований из прямоугольного массива 200на 20 делает криволинейный такого же размера. В конктретном случае - выгибает в дугу(полукруг с толстыми стенками, толщина стенок 20, кол-во ячеек на внешней и внутренней сторонах по 200. И вот у меня получается что и ячейки все криволинейные.

yolki

вот в приведённой картинке внешняя оболочка шара 25х500 (по-моему).
Могу дать код, который рисует это делов в .EPS файл, может, сможешь портировать в билдер.

AndrewNew

давай, будет круто.

yolki

Что такое EPS файл в курсе?
Функция, пишущая "пролог" файла:

void EpsProlog(FILE *fp,char *fname, int maxx,int maxy)
{

fprintf(fp,"%s\n","%!");
fprintf(fp,"%s\n","%%Creator: - Created by Mesh2EPS mesh converter by ");
fprintf(fp,"%s %s\n","%%Title:",fname);
fprintf(fp,"%%%%Pages: 1\n");
fprintf(fp,"%%%%BoundingBox: %d %d %d %d\n",0,0,maxx,maxy);
fprintf(fp,"%s\n","%%EndComments");
fprintf(fp,"%s\n","/m {moveto} def");
fprintf(fp,"%s\n","/l {lineto} def");
fprintf(fp,"%s\n","/s {stroke} def");
fprintf(fp,"%s\n","/c {closepath} def");
fprintf(fp,"%s\n","/n {newpath} def");
fprintf(fp,"/Times findfont 22 scalefont setfont\n");
fprintf(fp,"%s\n","/F {fillC fillM fillY fillK setcmykcolor eofill} def");
fprintf(fp,"%s\n","/S {strokeC strokeM strokeY strokeK setcmykcolor stroke} def");
fprintf(fp,"%s\n","/B {gsave F grestore S} bind def");
fprintf(fp,"%s\n","/K { /strokeK exch def /strokeY exch def /strokeM exch def /strokeC exch def } bind def");
fprintf(fp,"%s\n","/k { /fillK exch def /fillY exch def /fillM exch def /fillC exch def } bind def");
fprintf(fp,"%s\n","1 setlinejoin");
}
Функция отрисовки сетки:

...
fprintf(ef,"%4.2lf %4.2lf %4.2lf %4.2lf K\n",c1.C,c1.M,c1.Y,c1.K); // задаём цвет линий
for(i=0;i<M1_M-1;i++)
for(j=0;j<M1_N-2;j++)
{
// fprintf(ef,"n\n"); // новая линия
x0=TrX(M1[j+i*M1_N].x,minx,maxx,M);
y0=TrY(M1[j+i*M1_N].y,miny,maxy,N);
fprintf(ef,"%d %d m\n",x0,y0); // moveto
x=TrX(M1[j+1+i*M1_N].x,minx,maxx,M);
y=TrY(M1[j+1+i*M1_N].y,miny,maxy,N);
fprintf(ef,"%d %d l\n",x,y); // lineto
x=TrX(M1[j+1+(i+1)*M1_N].x,minx,maxx,M);
y=TrY(M1[j+1+(i+1)*M1_N].y,miny,maxy,N);
fprintf(ef,"%d %d l\n",x,y); // lineto
x=TrX(M1[j+(i+1)*M1_N].x,minx,maxx,M);
y=TrY(M1[j+(i+1)*M1_N].y,miny,maxy,N);
fprintf(ef,"%d %d l\n",x,y); // lineto
fprintf(ef,"%d %d l\n",x0,y0); // lineto
c=BlendColor(F1[j+i*M1_N],mm1.x,mm1.y,palette,PalSize);
SetFillColor(ef,c);
fprintf(ef,"B\n"); // fill with color
fprintf(ef,"S\n"); // stroke with color
}
Координаты узлов сетки даны в массиве M1[].x M1[].y
Функция TrX, TrY:

int TrX(double x,double minx,double maxx, int N)
{
return (x-minx)/(maxx-minx)*N*scale+hoffset*scale;
}
int TrY(double x,double minx,double maxx, int N)
{
return (x-minx)/(maxx-minx)*N*scale+voffset*scale;
}
BlendColor выбирает цвет из некоторой палитры, соответсвующий значению F1[]
SetFillColor:

int SetFillColor(FILE *fp,TCMYKColor c)
{
return fprintf(fp,"%4.2lf %4.2lf %4.2lf %4.2lf k\n",c.C/pastel,c.M/pastel,c.Y/pastel,c.K/pastel);
}
множитель "pastel" предназначен для "обледнения" цвета, чтобы на цветном принтере цвета смотрелись не так ядовито.
цвет c задаётся в CMYK- формате. (cyan, magenta, yello, black)

AndrewNew

Да вроде знаю что это картинки формат, тока не знаю в чем это кодить.

yolki

что значит, в чём кодить?
вот тривиальный пример eps картинки:

%!PS-Adobe-3.0 EPSF-3.0
%%Creator: , by hand
%%Title: a.eps
%%CreationDate: Wed Sep 15 00:00:15 2004
%%BoundingBox: 0 0 100 100
%%Orientation: Portrait
%%EndComments

/mat2 matrix def
/cm { 6 array astore concat } bind def
/c {curveto} def
/Q { mat2 setmatrix } bind def
/F {fillC fillM fillY fillK setcmykcolor eofill} def
/S {strokeC strokeM strokeY strokeK setcmykcolor stroke} def
/B {gsave F grestore S} bind def
/K { /strokeK exch def /strokeY exch def /strokeM exch def /strokeC exch def } bind def
/k { /fillK exch def /fillY exch def /fillM exch def /fillC exch def } bind def

1 0 0 1 -20 -610 cm
3 setlinewidth
0.00000 0.00000 0.00000 1.00000 K
0 1 1 0.00000 k

30 620 moveto
60 680 100 700 110 690 c
120 680 116 662 110 650 c
100 630 92 620 70 620 c
48 620 40 630 30 650 c
23 662 20 680 30 690 c
40 700 80 680 110 620 c
Q
B
showpage
сохрани в файле a.eps и просмотри при помощи ghostview или чего-ещё..

yolki

можно ещё проще:

%!PS-Adobe-3.0 EPSF-3.0
%%Creator: , by hand
%%Title: a.eps
%%BoundingBox: 0 0 100 100
%%Orientation: Portrait
%%EndComments
0 0 moveto
100 0 lineto
100 100 lineto
0 100 lineto
0 0 lineto
stroke
showpage

AndrewNew

ну а в какой программе этот код писать, ну или на каком языке?

AndrewNew

на С чтоли?

yolki

это был фрагмент программы на С, которая генерит файл .EPS из некоторых данных.
Оставить комментарий
Имя или ник:
Комментарий: