| Autor | Správa |
Siriuse
 Užívateľ
 Založený: 23.05.2009 Príspevky: 81 Bydlisko: Michalovce
 | Zaslal: Št 25.08.11 22:44 |   |
Zdravim, potreboval by som poradit. Mam canvas na ktory zlozitym vypoctom vykreslujem krivky grafu. Ked na graf vykreslim dve krivky tak mi prebehne funkcia vykreslujuca krivku dvakrat. Ked chcem vykreslit este jednu krivku tak musim resetnut cely canvas a vykreslit zasa vsetky tri krivky. Ked ich tam mam dajme tomu 20 uz fakt dlho trva. Resetujem graf zakazdym pretoze ked nahodou zobrazovanie jednej krivky vypnem neviem ju zmazat. Ako na to?
priklad pre lepsie pochopenie
mam canvas na ktory vykreslim graf funkcie x^2. Potom na neho vykreslim aj dajme tomu e^x. Potom log(x). Potom e^x chcem dat prec z canvasu bez toho aby som cely graf zmazal a znovu vykreslil tie dva. (pretoze to v mojom grafe je velmi zlozite). |
| |
   |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 936
 | Zaslal: Pi 26.08.11 10:46 |   |
no mozes prekreslit krivku ktoru chces vymazat tak ze ju zinvertujes, alebo si sprav viacvrstvovy system, kazda krivka bude na inej vrstve a pri zobrazovani sa budu vrstvy na seba ukladat alebo odtial odoberat tak ako to robia editory obrazkov. |
| |
  |
 |
chrono
 Skúsený užívateľ
 Založený: 13.11.2007 Príspevky: 808
 | Zaslal: Pi 26.08.11 13:08 |   |
Celkom by ma zaujímalo, ako veľký graf vykresluješ, keď to trvá tak dlho. Predpokladám ale, že tým vykresľovaním v skutočnosti myslíš výpočet a následné vykreslenie (a ak áno, tak ti nič nebráni si ten výpočet uložiť do poľa, aby si to potom nemusel počítať znovu). |
| |
  |
 |
Siriuse
 Užívateľ
 Založený: 23.05.2009 Príspevky: 81 Bydlisko: Michalovce
 | Zaslal: Pi 26.08.11 16:29 |   |
Hej... nie vykreslovanie ale vypocet presne som myslel, a ako by som spravil ten viacvrstvovy system? Grafy maju roznu farbu aby sa v nich dalo vyznat, preto to nepomoze invertovat. A ukladat kazdy graf do poli sa mi nepaci. |
| |
   |
 |
chrono
 Skúsený užívateľ
 Založený: 13.11.2007 Príspevky: 808
 | Zaslal: Pi 26.08.11 17:22 |   |
Viacvrstvový systém neurobíš nijako (pretože tie grafy sa budú prekrývať a to, čo je prekryté už nijako nezískaš).
Ak teda nechceš nič nikam ukladať, musíš sa zmieriť s tým, že to bude pomalé (ukladať môžeš napr. predrendrovaný obrázok či niečo podobné, ale pole s údajmi je výhodnejšie, pretože napr. ak ten graf zväčšíš dvojnásobne, tak už v tom poli polovicu bodov budeš mať vypočítanú). |
| |
  |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 936
 | Zaslal: Pi 26.08.11 19:54 |   |
Siriuse, vcom je problem ? kreslis predsa na canvas . tak zacni kreslit kazdy graf na samostatny canvas a podla potreby si kopiruj obsah jedneho az n canvasov do toho ktory je na zobrazovanie.
| kód: |
img1.Canvas.CopyMode := cmSrcAnd ; //nastavis sposob kopirovania na taky aby sa obrazky zmiesali
img1.Canvas.CopyRect(rect(20,20,250,250),img2.canvas,rect(20,20,250,250)); // a tu vykonas skopirovanie
|
ked budes chciet niektoru z kriviek odobrat z grafu tak iba graf znovuvyskladas z canvasov ale bez canvasu na ktorom je krivka ktoru v grafe nechces. to je aj podla mna dostatocne rychle.
edit:
narychlo zbuchana ukazka
| kód: |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
img1: TImage;
img2: TImage;
img3: TImage;
chk1: TCheckBox;
chk2: TCheckBox;
img4: TImage;
chk3: TCheckBox;
procedure chk1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.chk1Click(Sender: TObject);
begin
img1.Canvas.FillRect(img1.ClientRect);
img1.Canvas.CopyMode := cmSrcAnd ;
if chk1.Checked then
img1.Canvas.CopyRect(img1.Canvas.ClipRect,img2.canvas,img1.Canvas.ClipRect);
if chk2.Checked then
img1.Canvas.CopyRect(img1.Canvas.ClipRect,img3.canvas,img1.Canvas.ClipRect);
if chk3.Checked then
img1.Canvas.CopyRect(img1.Canvas.ClipRect,img4.canvas,img1.Canvas.ClipRect);
end;
procedure TForm1.FormCreate(Sender: TObject);
var i : Integer;
begin
img1.Canvas.FillRect(img1.ClientRect);
img3.Canvas.Pen.Color := clGreen;
img4.Canvas.Pen.Color := clBlue;
img2.Canvas.MoveTo(1,20);
img3.Canvas.MoveTo(1,20);
img4.Canvas.MoveTo(1,20);
for i :=0 to 360 do begin
img2.Canvas.LineTo(i*16,20-trunc(sin(i)*16));
end;
for i :=0 to 360 do begin
img3.Canvas.LineTo(i*16,20-trunc(sin(i+5)*16));
end;
for i :=0 to 360 do begin
img4.Canvas.LineTo(i*16,20-trunc(sin(i+10)*16));
end;
end;
end.
|
|
| |
  |
 |
vama
 Užívateľ
 Založený: 20.11.2009 Príspevky: 213 Bydlisko: Myjava Vek: 19
 | Zaslal: So 27.08.11 11:54 |   |
A co tak pouzit komponent urceny na vykreslovanie grafov - Chart?
Jednoducho sa snim pracuje, a mozes si snim invidualne vykreslovat, zmazavat krivky. |
_________________ "Digitálna technika pozostáva len z 0 a 1, ktoré sú správny čas na správnom mieste." M. Valášek | |
    |
 |
|