Lazarus 3.0 (2023.12.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Válasz: Grafikon készítése 2014 aug. 16 09:55 #1358

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 499
  • Köszönetek: 86
Az egyesével átszínezés valóban lassú lenne...

Van egy másik javaslatom is, ami ugyan nem lesz olyan gyors, mint az előző (amit rávezetőnek szántam), viszont most mellékelek hozzá kódot. Ennek lényege, hogy a háttérben, egymástól függetlenül, elkészíted a grafikont piros és zöld színnel is, és csak a megfelelő/szükséges területeket másolod az alkalmazás által megjelenítendő képbe.
A működés részleteit a kódban található megjegyzésekben olvashatod:
procedure TForm1.PaintBox1OnPaint(Sender: TObject);
var
  Rect:TRect;
  Temp:TBitmap;
begin
  // egy ideiglenes kép létrehozása a rajzoláshoz
  Temp:=TBitmap.Create();
  Temp.Width:=100;
  Temp.Height:=100;
 
  // kék lesz a háttér (a végleges képé is)
  Temp.Canvas.Brush.Color:=clblue;
  Temp.Canvas.FillRect(0,0,100,100);
 
  // a teljes vonal rajzolása pirossal az ideiglenes képbe
  Temp.Canvas.Pen.Color:=clred;
  Temp.Canvas.Line(  0,  0, 25, 75);
  Temp.Canvas.Line( 25, 75, 50, 25);
  Temp.Canvas.Line( 50, 25, 75,  0);
  Temp.Canvas.Line( 75,  0,100,100);
  // a piros vonalat tartalmazó és megjeleníteni kívánt terület másolása a végleges képbe
  Rect.Left:=0;
  Rect.Top:=0;
  Rect.Right:=100;
  Rect.Bottom:=50;
  PaintBox1.Canvas.CopyRect(Rect,Temp.Canvas,Rect);
 
  // a teljes vonal rajzolása zölddel az ideiglenes képbe
  Temp.Canvas.Pen.Color:=clgreen;
  Temp.Canvas.Line(  0,  0, 25, 75);
  Temp.Canvas.Line( 25, 75, 50, 25);
  Temp.Canvas.Line( 50, 25, 75,  0);
  Temp.Canvas.Line( 75,  0,100,100);
  // a zöld vonalat tartalmazó és megjeleníteni kívánt terület másolása a végleges képbe
  Rect.Left:=0;
  Rect.Top:=50;
  Rect.Right:=100;
  Rect.Bottom:=100;
  PaintBox1.Canvas.CopyRect(Rect,Temp.Canvas,Rect);
 
  // a középvonal rajzolása a végleges képbe
  PaintBox1.Canvas.Pen.Color:=clgray;
  PaintBox1.Canvas.Line(0,50,100,50);
 
  // az ideiglenes kép megszüntetése
  Temp.Destroy;
end;

A próbaalkalmazásomban a fenti eljárás a Form1:TForm ablakban elhelyezett PaintBox1:TPaintBox (az 'Additional' fülön található) OnPaint eseményéhez volt rendelve...

Sok sikert!
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Válasz: Grafikon készítése 2014 aug. 15 19:39 #1357

  • JohnnyK
  • JohnnyK profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 78
  • Köszönetek: 16
A TaChart komponens grafikonjainak használatában láttam reményt a keresett funkciódra, de végülis sikertelenül. Én is egyelőre azt az ötletet osztom, hogy a tengellyel való metszéspontok meghatározása biztosan megoldást nyújt, csak ki kell őket matekozni a berajzolás előtt.
A matekozás talán elkerülhető nem túl elegánsan, ha a grafikonodat mondjuk csak pirossal rajzolod meg a Canvasra, majd a végén egyesével átnézed a tengelyed feletti összes pixel színét, és ha piros a szín, akkor kicseréled zöldre. Ez sok pixelt fog átvizsgálni feleslegesen, így időigényes lehet, de te tudod majd, hogy ennyi belefér-e cserébe.

Válasz: Grafikon készítése 2014 aug. 15 16:30 #1356

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 499
  • Köszönetek: 86
A tengelyt metsző vonalakat 2 menetben rajzold meg: az [A] ponttól a tengelyig és a tengelytől a pontig...
Hogy a tengelyen pontosan hol legyen a vonalak egymást érő vége, azt az [A] és pontok tengelytől való távolságának arányát felhasználva lehet/kell kiszámolni!
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Válasz: Grafikon készítése 2014 aug. 13 13:04 #1355

  • probakilenc
  • probakilenc profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 2
  • Köszönetek: 0
Bár csatoltam hozzá képet, nem látom sehol, így feltöltöttem máshova. Íme a link:
kepfeltoltes.hu/140813/Grafikon_www.kepfeltoltes.hu_.jpg

Grafikon készítése 2014 aug. 13 13:01 #1354

  • probakilenc
  • probakilenc profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 2
  • Köszönetek: 0
Sziasztok


Erősen kezdőnek számítok a programozás világában, így biztos sokan a hajukat fogják tépni, hogy ilyen "egyértelmű" dolgot kérdezek. :) De hiába keresgéltem, sehogy sem bírtam megtalálni a választ.

Szóval egy grafikont szeretnék készíteni, ami csupán annyit tud, hogy piros (szaggatott) vonalat rajzol, ha az érték 0 alá csökken (ami ez esetben nagyobb, mint 250) és zöld el, ha 0 fölé (ami ugye kisebb, mint 250). A probléma az, hogy én azt szeretném, hogy a vonal onnantól váljon pirossá vagy zöldé, ahol metszi az x tengelyt.
Azt eddig megoldottam, hogy ha nagyobb vagy kisebb, más színt kap, viszont ha +100-ban vagyok, és lecsökken az érték -25re, akkor a +100tól egészen a -25-ig piros lesz a vonal.

Íme a program:

procedure TForm1.Button1Click(Sender: TObject);
var a,b,c,d,x,y,p,k:integer;
begin
with image1.canvas do
begin
c:= strtoint(edit3.text);
d:= strtoint(edit4.text);
a:= strtoint(edit1.text);
b:= strtoint(edit2.text);
x:= strtoint (edit5.text);
y:=strtoint (edit6.text);
p:= x*50+c;
k:= d+y*(-1);
begin
pen.color:=clred;
if k<250 then
pen.color:=clgreen;
begin
pen.width:=2;
pen.style:=psDash;
line(c,d,p,k);
ellipse(a-4,b-4,a+4,b+4);
ellipse(c-4,d-4,c+4,d+4);

edit3.text:= inttostr(p);
edit4.text:= inttostr(k);
end;
end;
end;

end;



(Azért némi magyarázatot fűznék ahhoz, hogy hogyan is működik.
Szóval, az első edit oszlopban csak a kezdő adatok vannak, azt nem kell bolygatni [edit1;edit2]
a második oszlop első cellájába az eltelt napok számát kell írni, tehát, ha 2nap telt el, s eközben az érték +48-al nőtt, akkor felső:2 alsó:48 [edit5,edit6]
a harmadik oszlopot szintén nem kell bolygatni :) [edit3,edit4]

A Button1 arra szolgál, hogy a bevitt értéket megjelenítsük, a Button2 pedig a koordinátarendszert jeleníti meg.)

  • Oldal:
  • 1