Skocz do zawartości

[Delphi] Reczne reskalowanie


Toster

Polecane posty

Ok od pewnego czasu pracuje nad recznym reskalowaniem Quada tak aby pasowal mi do moich wymagan, pomyslalem ze moze sie komus przyda wiec wrzucam kodzik. Dostepne sa 3 metody skalowania: Pionowe X, poziome Y, Const aspect ratio. Kod jest czesciowo zoptymalizowany, da sie go bardziej wyzylowac (co juz zrobilem) ale kod wynikowy jest w javie a to nie takie miejsce. Anyway, dla zainteresowanych potrzeba:
1. Paintbox
2. Image do ktorego wczytamy bitmape
3. 5 suwakow
4. jeden guzik
5. kod ponizej

[code=Delphi]
unit Unit1;

interface

uses
Windows, Messages, Sys][X[XBX[w2WD7G&27FD7G&2FGPDf&Ó6Ć72Df&4(Mąą QMąą 4(Mąą QMąą 4 ScrollBar3: TScrollBar;
Image1: TImage;
PaintBNZ[B]N]BĆ&#67&Ć&#SE67&Ć&#&Fw&WE&F4( ŃŃ
ąŹĄMQ=4(edure ScrollBar4Change(Sender: TObject);
private
proYH]]XY
KLKLLM[YNB&6VGW&RG&uVB67B2\"2CFVvW\"(IEĄąąąŃ4(Aate declarations }
public
{ Public declarations }
YH]]XY
KLKLLM[YNBVćCf f&ÓDf&ÓŚĆVVFFE\"ćF4(4)Q ŃŃ
ąŹĄMQ=4)4( QuadWidth, LeftY, RightY, LeftH, RightH : integer;
begin
Z[K[HXBZ[Kf2fĆ&V7BD&6ĆVE&V7BVEvGFŁ67&ĆAŃ4(1ŃdMąą AŃ4(IĄŃd ScrollBar5.Position;
LeftH := ScrollBar2.Position;
YH][BHY[ŃK][R[^`dG&uVBVEvGFĆVgE&vE1ŃdŹ1Ń IĄŃdIĄŃ 4(!E QuadWidth, LeftY, LeftY + LeftH, RightY, RightY+RightH);
]XY
LLL
ÓYL
Y
NB[BB[C&6VGW&RDf&ÓG&uVB67B\"\"2CŃ4)4(ąŃ4( dy34: integer;
slope12, slope34: integer;
minY, maxN[YBK[YBNX[B^L#&VŚ&VvW7FvVćRć& 4(źąŃi]Mi4( dx12 := x2 - x1;
dy12 := y2 - y1;
dy13 := y3 - y1;
LHMHLBX[YHBYLL wCFV&Vv6ĆS\"ŁG\"6FbG#ąą4(4(ąŃĄ4 slope34 := (dx12 shl 8) div dy34;
end else slope34H BBZ[HHZ[LKLNBZ[HHZ[Z[KLĘNŁBŁ
\"d5Ą5d4(d5Ą5d4(4( minY+1 to maxY-1 do begin
xs := x1;
xe := x2;BY
H LH[
ILJH[Y[Bś2\02ŁRŁ6ĆS\"Ą4(4(ĄąĄŃen begin
//skos /
xs := x1 + ((Slope12*(K^LJJH
NBHHB[BBY
fCBćBfwC2FV&Vv6ś25ĄŹĄMąĄĄ4( := Min(xe, x2);
end;
if (y < y3) and (y&gtM
H[Y[BBHX^
JRŁR6ĆS3B26\"4(4(Ńźź4( min(y1,y2)+(x-x1) * (dy12/dx12);
yy2 := min(y3,y4JĘ^JH

LLNBY^LH^LH[^LH^\"'Ł#G#'ŁĄźĄee4(%AŃ.Bitmap.Canvas.Pixels[Round(rx),Round(ry)];
cl := ]NBZ[K[^[WHHBVćCVćCG'6vćRĆćD&6fA
ąąeąą4(AŃ
5QźĄą
PaintBox1.Canvas.LineTo(x2,y2);
PaintBox1.Canvas.LinUĘM
NBZ[K[[UĘKLĘNBZ[6f2ĆćUFŚVćC&6VGW&RDf&ÓdG&uVB6Ń4)4(x: integer;
dy13, dy24, dy34: integer;
slope12, slopL[YBZ[KX^N[YBK[Y#''FVvW##FVvW#Ś&VvW74(źź4(źź4(źąŃowe x1 = x3, x2 = x4 ZAWSZE !
dx12 := x2 - x1;
dy12 HLHLNBLLHLHLNBLHMHLB&Ć7ŚćR6ĆpbG\"fCfwCFV&Vv6ĆĄĄ4(ąą4(4( if dx12 <> 0 then begin
slope34 := (dy34 shl
H]LB[[HLHBBZ[HHZ[L\& quot;Ł2ŁB(4(d5Ą4(d
5Ą5d4(Y := Max(MaxY, y4);
}
for x := x2 - x1 downto 0 do begiBYLL[BZ[HHLHJ

T\"6\"V6PŁ6ĆS\"Ą4(4(MąąŃĄ4(d - (((-Slope34)*x) shr 8)
else
maxY := y3 +

L

H
NBBYX^H Z[H[Y[BŁŁŁ4(4(Ą4(2 := (140 shl 8) div (maxY-minY);
for y := maxY-minY Y[BH

^LJHB'Ł\"6\"6ŁvS7GW&R&F
Aąmąt4(AŃ
Aąm minY+y] := cl;
end;
end;
//odrysowanie liniaZCBZ[K[[HY[BZ[K6f2fUFD&6f2ĆćUF\"\"AŃ
1QźĄą4(AŃ
1Qźx1,y3);
PaintBox1.Canvas.LineTo(x1,y1);
end;

proceduHLK[J[X
NBY[B]6Ć6ćŚVćC&6VGW&RDf&ÓG&uVB67BŃ4)4(ąŃ4(ą13, slope24: integer;
minX, maxX: integer;
rx,ry: inYBK[YBLLL[YB6FVvW#Ś&VvW7FvVćRć& źź4(źąŃi]Mi
dy13 := y3 - y1;
dx13 := x3 - x1;
dx24 := x4 - BYLLH[LLH NBX[YHB6ĆS2ŁG26FbG36ĆS#BŁG#B64
(4(Ńźź4(if Slope13<0 then
minX := x1 -(((-Slope13)*y) s
CB[CBZ[HH


LLĘJH
Nb6ĆS#BfCFVŁ\"ąĄ4(ą4(`ŹĄMą4*y) shr 8);

if maxX < minX then begin
HX^BX^HZ[BZ[HBVćCŁC6FbG
3\"ŁĄĄ``4(``Ńźdo begin
rx := (x * xx2) shr 8;
ry := (y
JHBH[XYLKXK]X[V5''ÓD& amp;6f2V5ś4(4(4(źą4(AintBox
1.Canvas.Pen.Color := clYellow;
PaintBox1.Canvas.MUĘKLJNBZ[K[[UĘLJNBZ[6f2ĆćUFB2D&6f2ĆćUF22(AŃ
1QźĄą4)4(4)Q.RQuad(const x1, y1, x4, y4: integer);
var
dx, dy: inteBN[YBYYK^^N[YBFVvW#Ś& amp;VvGŁBGŁBGĄ4(Ą
4(:= 0;
for y := dy downto 0 do begin
ix := 0;
HY[BH[XYLKX&R&F6f2V5ś6\"Ć6\"ÓD&
Aąmt4(Ź
end;
iy := iy + idy;
end;
end;

end.
[/code]

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...