Jestem początkującym programistą i zwracam się z prośbą o pomoc.
Do rzeczy!
Mam pewien wykres w skali logarytmicznej. Potrzebuje dynamicznego przesuwania określonych punktów na tym wykresie na zasadzie przeciągania kursorem (może być pixel po pixelu). Niestety nie mam pojęcia jak to zrobić. Wykres jest rysowanay na dwóch PaintBox'ach (wymiar 300x300) - jeden odpowiada za skale logarytmiczną a drugi za sam wyrysowanie lini (wykresu). Dane pobierane są ze StringGrida (dwie kolumny - współrzędne x y)
Oto fragmenty kodu:
Rysowanie skali:
KOD cpp: UKRYJ
//funkcja rysująca skale logarytmiczną
void __fastcall TForm1::uklad_logarytmiczny()
{
int i=0, j=0;
int odl_dol=0;
int odl_gorna=0;
int odl_prawa=0;
int odl_lewa=0;
int szer_wyk=300;
int wys_wyk=300;
//ustawienie szerokosci i wysokosci
PaintBox1->Width=301;//Form1->ClientWidth-300+1;
PaintBox1->Height=301;//Form1->ClientHeight-300+1;
PaintBox1->Canvas->Brush->Color=clWhite;
PaintBox1->Canvas->Rectangle(1,1,300,300);
//ustawienie koloru skali
PaintBox1->Canvas->Pen->Color=clLtGray;
//rysowanie skali logarytmicznej poziomej
int k,l;
for (l=0;l<3;l++)
{
for (k=1;k<10;k++)
{
PaintBox1->Canvas->MoveTo(odl_lewa,l*(wys_wyk/3)+odl_gorna+(wys_wyk/3)-log10(k)*(wys_wyk/3));
PaintBox1->Canvas->LineTo(szer_wyk-odl_prawa,l*(wys_wyk/3)+odl_gorna+(wys_wyk/3)-log10(k)*(wys_wyk/3));
}
}
//rysowanie skali logarytmicznej pionowej
for (l=0;l<3;l++)
{
for (k=1;k<10;k++)
{
PaintBox1->Canvas->MoveTo(l*(szer_wyk/3)+odl_lewa+log10(k)*szer_wyk/3,odl_gorna);
PaintBox1->Canvas->LineTo(l*(szer_wyk/3)+odl_lewa+log10(k)*szer_wyk/3,wys_wyk-odl_dol);
}
}
// tworzenie ramki:
PaintBox1->Canvas->Pen->Color=clBlack;
// podzial poziomy ramki :
for (i=0;i<4;i++)
{
PaintBox1->Canvas->MoveTo(odl_lewa,(odl_gorna+i*wys_wyk/3));
PaintBox1->Canvas->LineTo(szer_wyk-odl_prawa,(odl_gorna+i*wys_wyk/3));
}
// podzial pionowy ramki:
for (j=0;j<4;j++)
{
PaintBox1->Canvas->MoveTo(odl_lewa+j*szer_wyk/3,odl_gorna);
PaintBox1->Canvas->LineTo(odl_lewa+j*szer_wyk/3,wys_wyk-odl_dol);
}
}
void __fastcall TForm1::uklad_logarytmiczny()
{
int i=0, j=0;
int odl_dol=0;
int odl_gorna=0;
int odl_prawa=0;
int odl_lewa=0;
int szer_wyk=300;
int wys_wyk=300;
//ustawienie szerokosci i wysokosci
PaintBox1->Width=301;//Form1->ClientWidth-300+1;
PaintBox1->Height=301;//Form1->ClientHeight-300+1;
PaintBox1->Canvas->Brush->Color=clWhite;
PaintBox1->Canvas->Rectangle(1,1,300,300);
//ustawienie koloru skali
PaintBox1->Canvas->Pen->Color=clLtGray;
//rysowanie skali logarytmicznej poziomej
int k,l;
for (l=0;l<3;l++)
{
for (k=1;k<10;k++)
{
PaintBox1->Canvas->MoveTo(odl_lewa,l*(wys_wyk/3)+odl_gorna+(wys_wyk/3)-log10(k)*(wys_wyk/3));
PaintBox1->Canvas->LineTo(szer_wyk-odl_prawa,l*(wys_wyk/3)+odl_gorna+(wys_wyk/3)-log10(k)*(wys_wyk/3));
}
}
//rysowanie skali logarytmicznej pionowej
for (l=0;l<3;l++)
{
for (k=1;k<10;k++)
{
PaintBox1->Canvas->MoveTo(l*(szer_wyk/3)+odl_lewa+log10(k)*szer_wyk/3,odl_gorna);
PaintBox1->Canvas->LineTo(l*(szer_wyk/3)+odl_lewa+log10(k)*szer_wyk/3,wys_wyk-odl_dol);
}
}
// tworzenie ramki:
PaintBox1->Canvas->Pen->Color=clBlack;
// podzial poziomy ramki :
for (i=0;i<4;i++)
{
PaintBox1->Canvas->MoveTo(odl_lewa,(odl_gorna+i*wys_wyk/3));
PaintBox1->Canvas->LineTo(szer_wyk-odl_prawa,(odl_gorna+i*wys_wyk/3));
}
// podzial pionowy ramki:
for (j=0;j<4;j++)
{
PaintBox1->Canvas->MoveTo(odl_lewa+j*szer_wyk/3,odl_gorna);
PaintBox1->Canvas->LineTo(odl_lewa+j*szer_wyk/3,wys_wyk-odl_dol);
}
}
Kreślenie wykresu:
KOD cpp: UKRYJ
void __fastcall TForm1::rysowanie_wykresu()
{
PaintBox2->Repaint();
PaintBox2->Width=301;//Form1->ClientWidth-300+1;
PaintBox2->Height=301;//Form1->ClientHeight-300+1;
PaintBox2->Canvas->Pen->Width =2;
PaintBox2->Canvas->Pen->Color=clRed;
for(int i=0;i<17;i++)
{
String a=StringGrid1->Cells[0][i];
float b = a.ToDouble() ;
String c=StringGrid1->Cells[1][i];
float d = c.ToDouble();
PaintBox1->Canvas->TextOutA((log10(b))*100,300-(log10(d))*100,i+1);
PaintBox2->Canvas->MoveTo((log10(b))*100,300-(log10(d))*100);
String e=StringGrid1->Cells[0][i+1];
float f = e.ToDouble();
String g=StringGrid1->Cells[1][i+1];
float h = g.ToDouble();
PaintBox2->Canvas->LineTo((log10(f))*100,300-(log10(h))*100);
}
}
{
PaintBox2->Repaint();
PaintBox2->Width=301;//Form1->ClientWidth-300+1;
PaintBox2->Height=301;//Form1->ClientHeight-300+1;
PaintBox2->Canvas->Pen->Width =2;
PaintBox2->Canvas->Pen->Color=clRed;
for(int i=0;i<17;i++)
{
String a=StringGrid1->Cells[0][i];
float b = a.ToDouble() ;
String c=StringGrid1->Cells[1][i];
float d = c.ToDouble();
PaintBox1->Canvas->TextOutA((log10(b))*100,300-(log10(d))*100,i+1);
PaintBox2->Canvas->MoveTo((log10(b))*100,300-(log10(d))*100);
String e=StringGrid1->Cells[0][i+1];
float f = e.ToDouble();
String g=StringGrid1->Cells[1][i+1];
float h = g.ToDouble();
PaintBox2->Canvas->LineTo((log10(f))*100,300-(log10(h))*100);
}
}
Da się uchwycić właśnie te konkretne pkt'y i przesunąć je jedynie góra dół (po y) i automatycznie zaktualizować dane w StringGrid'zie. Albo chociaż po przeciągnięciu punktu wyświetlić jego aktualną wartość (gdziekolwiek - dymek albo jakiś Edit/Memo)?
Jakby ktoś wiedział jak to zrobić na zwykłym liniowym wykresie chociaż, mógłbym przerobić to na mój log. Jak przeciągać jakiekolwiek pkty.
Czy w ogóle jet taka możliwość działania na PaintBox'ie? Czy może na jakimś innym komponencie?
Z góry dziękuję za jakąkolwiek pomoc.