C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[69570] TeeChart 문의입니다ㅠ 같은 데이터인데 그래프가 달라집니다ㅠ
프뉴마 [pneuma] 2907 읽음    2013-05-30 15:42
일단 첨부한 압축파일에 사진을 봐주시면 이해하기가 한결 편하실 겁니다.

file select 콤보박스에서 파일넘버를 선택하면 그 파일에서 데이터를 읽어서 배열에 저장합니다.

이 데이터는 다른 콤포넌트에서도 사용하기 때문에 수정하지 않기 위해 Peak chart 내부에

이 데이터를 복사한 배열을 따로 만들었습니다. 그리고 복사한 배열을 통해서 chart2와(그림파일에서 아래의 chart)

사이의 bitmap 을 구간별로 256색 컬러맵핑한 것입니다.

문제는 첨부파일을 보시면 아시겠지만, 같은 파일에서 데이터를 읽어오는 것임에도 file select를 반복해서

왔다갔다하면 계속해서 chart2가 변합니다. chart2만 다른게 아니라 bitmap이 달라지는걸 봐선

그리기위한 데이터가 계속해서 변한다고 밖에 생각이 안되는데요ㅠ 왜 달라지는지를 모르겠습니다.

문장이 변하지 않으니 계속해서 같은 데이터를 가져올텐데...초기화를 안해서인가 싶어서 초기화도

해보고는 하는데 결과가 달라지진 않네요ㅠ 무슨 문제점이 있는지 지적해주시면 좋겠습니다ㅠ

그리고 chart2 에서 가져오는 데이터를 chart1의 게이트(tool ---> colorline1, colorline2로 구성한 겁니다)

의 움직임에 따라 실시간으로 연동하고 싶은데, chart1에선 변하지만 chart2에선 변하지 않습니다.

chart2에서 series를 그릴 때 게이트값이 움직이는걸 바로 가져오게 하는 방법을..힌트 좀 부탁드려요ㅎ

이것저것 실험해서 제가 다 해보고 싶긴한데...무한 삽질이 될 가능성도 있고..무한 삽질은 해도 되는데 내일까지는

도저히 못할 것 같아서 조언을 부탁드립니다ㅠ

아래는 Peak chart 그리기(chart2) 소스와, file select combo 소스입니다.




void __fastcall TForm1::PeakChartClick(TObject *Sender)  //Peak chart
{


    Chart2->LeftAxis->Minimum = -2048;                 //y축 범위 설정
    Chart2->LeftAxis->Maximum = 2048;


    Chart2->BottomAxis->Minimum = 0;                 //X축 범위 설정
    Chart2->BottomAxis->Maximum = ScanPts;



    SeriesPositive->Clear(); //Peak-Min
    SeriesNegative->Clear(); //Peak_Max
    SeriesAbsolute->Clear(); //Absolute_Peak
    Series3->Clear(); //Absolute_Peak


    short *ScanLine = new short[Points*ScanPts];

    memset(ScanLine, 0, sizeof(short)*Points*ScanPts);

    for(i=0; i<Points*ScanPts; i++)
    {
        ScanLine[i] = pData[i]-2048;
    }



    short *peakMaxVal = new short[ScanPts];
    short *peakMaxIdx = new short[ScanPts];


    short *peakMinVal = new short[ScanPts];
    short *peakMinIdx = new short[ScanPts];

    short *peakAbsVal = new short[ScanPts];
    short *peakAbsIdx = new short[ScanPts];



    //idx = ScanIndexSelect->ItemIndex;



    for(j= 0; j < ScanPts; j++)
    {

        for(i = 1000; i < 3500; i++)
        {

            //Positive Peak
            if(ScanLine[(j*Points)+i] > peakMaxVal[j])
            {
                peakMaxVal[j] = ScanLine[(j*Points)+i];
                peakMaxIdx[j] = (j*Points)+i;
            }

            //Negative Peak
            if(ScanLine[(j*Points)+i] < peakMinVal[j])
            {
                peakMinVal[j] = ScanLine[(j*Points)+i];
                peakMinIdx[j] = (j*Points)+i;
            }


            //Absolute Peak
            if(abs(ScanLine[(j*Points)+i]) > peakAbsVal[j])
            {
                peakAbsVal[j] = abs(ScanLine[(j*Points)+i]);
                peakAbsIdx[j] = (j*Points)+i;

            }
        }

        SeriesPositive->AddXY(j, peakMaxVal[j]);
        SeriesNegative->AddXY(j, peakMinVal[j]);
        SeriesAbsolute->AddXY(j, peakAbsVal[j]);

        Series3->AddXY(j, abs(peakMinVal[j]));


    }
        Chart2->Refresh();






    Image1->Picture->Bitmap->Width = Form1->Width; //ScanPts*2;
    Image1->Picture->Bitmap->Height = Image1->Height;


    double colorVal = 0;


    Image1->Picture = NULL;

    Image1->Canvas->Refresh();

    for(i = 0 ; i < ScanPts; i++)
    {

        colorVal = 256*peakMaxVal[i]/2048.0;


        //for(int j = 0; j < Image1->Height; j++)
            //Image1->Canvas->Pixels[i*2][j] = colorJet[(int)colorVal];                //---->pixel로 뿌리기.


        Image1->Canvas->Brush->Color = colorJet[(int)colorVal];
        Image1->Canvas->FillRect(Rect(i*2, 0, (i+1)*2, Image1->Height));


    }

    Image1->Canvas->Refresh();




    delete [] peakMaxVal;
    peakMaxVal = NULL;

    delete [] peakMaxIdx;
    peakMaxIdx = NULL;


    delete [] peakMinVal;
    peakMinVal = NULL;


    delete [] peakMinIdx;
    peakMinIdx = NULL;

    delete [] peakAbsVal;
    peakAbsVal = NULL;

    delete [] peakAbsIdx;
    peakAbsIdx = NULL;



    ScanLine = NULL;
    delete [] ScanLine;
}
//---------------------------------------------
void __fastcall TForm1::FileSelectChange(TObject *Sender)
{
    idx = FileSelect->ItemIndex;

        AnsiString fileName = "D:\\111\\222_Ch2_part" + IntToStr(idx) + ".tmp";

    FileName = fileName;

    StatusBar1->Panels->Items[0]->Text = "OpenFile : " + fileName;




    if(pData != NULL)
    {
        delete [] pData;
        pData = NULL;

    }


    TFileStream *pOpenStream = new TFileStream(FileName.c_str(), fmOpenRead);


    pOpenStream->Seek(HeadData, soFromBeginning);


    pData = new short[Points*ScanPts];

    memset(pData, 0, sizeof(short)*Points*ScanPts);


    pOpenStream->Read(pData, sizeof(short)*Points*ScanPts);


    delete pOpenStream;


    PeakChart->Click();

    if(RF_Mode->Checked)
        Bt_RF->Click();

    else
        Bt_Video->Click();
}

+ -

관련 글 리스트
69570 TeeChart 문의입니다ㅠ 같은 데이터인데 그래프가 달라집니다ㅠ 프뉴마 2907 2013/05/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.