Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > TChart TTowerSeries не отображаются все точки


Автор: Michrutka 8.6.2010, 12:57
Здравствуйте, граждане Форумчане!
имею следующую ситуацию:
есть матрица резуьтатов n x m результатов экспериментов.
ее необходимо визуализировать в виде баров (поверхности) в 3D графике.
делаю следующим образом
Код

//*.h
TTowerSeries *Series3DResult;
//*.cpp
    Series3DResult->Clear();
    for(int j = 0; j < N; ++j)
    {
            double y = ...;
            double x = ...;
            double z = ...;
            Series3DResult->AddXYZ(x, y, z);
    }

при этом имею такую картинку:
user posted image
первые ряды по X и Z почему то не отображаются, хотя есть - лейблы на них есть.
с чем этио может быть связано и как это победить.
подскажите пожалуйста.
зы использую TChart 8
Заранее Спасибо

Автор: lyucean 8.6.2010, 17:47
попробуй уменьшить размер площадок, возможно просто баг. 
Могу скинуть код вывода 3д изображения ..можешь нарисовать их сам на имейдже или форме, если так надо smile 

Автор: Michrutka 9.6.2010, 08:02
lyucean, спасибо
Уменьшение размеров площадок никак не влияло.
скинь, посмотрю. вдруг я там что не так делаю.

Автор: lyucean 10.6.2010, 10:40
Цитата(Michrutka @ 9.6.2010,  08:02)
lyucean, спасибо
Уменьшение размеров площадок никак не влияло.
скинь, посмотрю. вдруг я там что не так делаю.

Код

void Risuem_cub(double& r,double& a,double& b,double& c,double& num)
{

        double ImX,ImY;
        double ugol=Form1->Edit1->Text.ToDouble();
        Form1->Im->Canvas->Pen->Width=1;
        Form1->Im->Canvas->Brush->Color=clBlack;
        Form1->Im->Canvas->Pen->Color=clRed;
        
        double H=sin(ugol*M_PI/360/3)*b+c*(cos(ugol*M_PI/360*2/3));
        for(int i=0;i<a+r;i=i+r)
        {
                if(num==0)
                {
                        Form1->Im->Canvas->Brush->Color=Form1->Im->Canvas->Pen->Color;

                        ImX= i;
                        ImY=(1+sin(ugol*M_PI/360))*H-c;
                        Form1->Im->Canvas->Ellipse(ImX-r,ImY-r,ImX+r,ImY+r);

                        ImX= i;
                        ImY=(1+sin(ugol*M_PI/360))*H;
                        Form1->Im->Canvas->Ellipse(ImX-r,ImY-r,ImX+r,ImY+r);
                }
                else
                {
                        if(i==0)
                        {
                                Form1->Im->Canvas->Pen->Color=Form1->Im->Canvas->Brush->Color;
                                Form1->Im->Canvas->Rectangle(0,0,Form1->Im->Width,Form1->Im->Height);
                                Form1->Im->Canvas->Pen->Color=clRed;
                        }

                        ImX= i+b*cos(ugol*M_PI/360);
                        ImY=(1+sin(ugol*M_PI/360))*H - c - b*sin(ugol*M_PI/360);
                        Form1->Im->Canvas->Ellipse(ImX-r,ImY-r,ImX+r,ImY+r);

                        ImX= i+b*cos(ugol*M_PI/360);
                        ImY=(1+sin(ugol*M_PI/360))*H - b*sin(ugol*M_PI/360);
                        Form1->Im->Canvas->Ellipse(ImX-r,ImY-r,ImX+r,ImY+r);;
                }
        }

        Form1->Im->Canvas->Pen->Color=clLime;
        for(int i=0;i<b+r;i=i+r)
        {
                if(num==0)
                {
                        Form1->Im->Canvas->Brush->Color=Form1->Im->Canvas->Pen->Color;

                        ImX=a+i*cos(ugol*M_PI/360);
                        ImY=(1+sin(ugol*M_PI/360))*H- i*sin(ugol*M_PI/360);
                        Form1->Im->Canvas->Ellipse(ImX-r,ImY-r,ImX+r,ImY+r);

                        ImX=a+i*cos(ugol*M_PI/360);
                        ImY=(1+sin(ugol*M_PI/360))*H-c- i*sin(ugol*M_PI/360);
                        Form1->Im->Canvas->Ellipse(ImX-r,ImY-r,ImX+r,ImY+r);
                }
                else
                {
                        ImX=i*cos(ugol*M_PI/360);
                        ImY=(1+sin(ugol*M_PI/360))*H-c- i*sin(ugol*M_PI/360);
                        Form1->Im->Canvas->Ellipse(ImX-r,ImY-r,ImX+r,ImY+r);

                        ImX=i*cos(ugol*M_PI/360);
                        ImY=(1+sin(ugol*M_PI/360))*H- i*sin(ugol*M_PI/360);
                        Form1->Im->Canvas->Ellipse(ImX-r,ImY-r,ImX+r,ImY+r);
                }
        }

        Form1->Im->Canvas->Pen->Color=clYellow;
        for(int i=0;i<c+r;i=i+r)
        {
                if(num==0)
                {
                        Form1->Im->Canvas->Brush->Color=Form1->Im->Canvas->Pen->Color;

                        ImX=0;
                        ImY=(1+sin(ugol*M_PI/360))*H-i;
                        Form1->Im->Canvas->Ellipse(ImX-r,ImY-r,ImX+r,ImY+r);

                        ImX=a;
                        ImY=(1+sin(ugol*M_PI/360))*H-i;
                        Form1->Im->Canvas->Ellipse(ImX-r,ImY-r,ImX+r,ImY+r);

                        ImX=a+b*cos(ugol*M_PI/360);
                        ImY=(1+sin(ugol*M_PI/360))*H-i- b*sin(ugol*M_PI/360);
                        Form1->Im->Canvas->Ellipse(ImX-r,ImY-r,ImX+r,ImY+r);
                }
                else
                {
                        ImX=b*cos(ugol*M_PI/360);
                        ImY=(1+sin(ugol*M_PI/360))*H-i- b*sin(ugol*M_PI/360);
                        Form1->Im->Canvas->Ellipse(ImX-r,ImY-r,ImX+r,ImY+r);
                }
        }
        Form1->Im->Canvas->Pen->Color=Form1->Im->Canvas->Brush->Color;
}


возникнут вопросы ..спрашивай .. smile 

Автор: Michrutka 10.6.2010, 15:09
Проблему обошел добавлением нулевого столбца и строки (нулевые не видны, но зато видны информативные столбцы)
вдруг кому поможет.
и все таки интересно - что там не так.

lyucean, Спасибо

Автор: lyucean 5.11.2010, 15:45
Цитата(Michrutka @ 10.6.2010,  15:09)
Проблему обошел добавлением нулевого столбца и строки (нулевые не видны, но зато видны информативные столбцы)
вдруг кому поможет.
и все таки интересно - что там не так.

lyucean, Спасибо

Если не трудно, выложи кусок кода, тоже понадобилось вывести поверхность на TChart, сижу велосипед придумываю.  smile 

Автор: Michrutka 8.11.2010, 11:23
Пожалуйста. но там ничего примечатльного - добавляем нулевуюб строчку и столбец и данные начиная с 1
Код

for(int j = 0; j < Cols; ++j) 
    {
        Series3DResult->AddXYZ(j+1, 0, 0);
    }
    for(int j = 0; j < Rows; ++j)
    {
        Series3DResult->AddXYZ(0, 0,j+1);
    }
    for(int j = 0; j < NumOfChannels; ++j)
    {
        if(RawDataCheckBoxGrid->Checked(j))
        {
            double y = RawDataResult[j];
            double x = j%Cols+1;
            double z = Rows - (j/Cols+1)+1;
            Series3DResult->AddXYZ(x, y, z);
        }
    }

Автор: lyucean 8.11.2010, 14:58
Спасибо, разобрался, у меня почему-то в версии 8.04 нет такой проблемы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)