// Ein Muster wird
über einen Würfel gelegt.
// Getestet mit D2010 unter
Win7
type PColor = ^TColor; function frontface(src: TBitmap): Integer;
var
w, h: Integer;
begin
w := src.width div 3;
h := src.height div 2;
if h < w then
result := h
else
result := w;
end;
function cube(src: TBitmap): Integer; overload;
begin
result := trunc(frontface(src) * 1.333);
end;
procedure cube(cnv: TCanvas; Ground: TColor; x, y: Integer; src: TBitmap;
mutation: Boolean; border: PColor = nil); overload;
var
hlp: TBitmap;
w, m, md3, m33, mm: Integer;
Points: array [0 .. 2] of TPoint;
begin
m := frontface(src);
m33 := trunc(m * 1.333);
md3 := m div 3;
mm := m + m;
hlp := TBitmap.create;
hlp.width := m * 3;
hlp.height := m * 2;
w := (hlp.width - src.width) div 2;
hlp.Canvas.draw(w, 0, src);
with cnv do
begin
Brush.Color := Ground;
FillRect(rect(x, y, x + m33, y + m33));
if border <> nil then
Pen.Color := border^;
if mutation then
begin
CopyRect(rect(x, y + md3, m + x, m33 + y), hlp.Canvas,
rect(hlp.width - mm, hlp.height - m, hlp.width - m, hlp.height));
Points[0] := point(x + md3, y);
Points[1] := point(x + m33, y);
Points[2] := point(x, y + md3);
PlgBlt(handle, Points, hlp.Canvas.handle, hlp.width - mm, 0,
hlp.width - mm, m, 0, 0, 0);
Points[0] := point(x + m, y + md3 - 1);
Points[1] := point(x + trunc(m * 1.666) - 1, y - md3);
Points[2] := point(x + m, y + m33 - 1);
PlgBlt(handle, Points, hlp.Canvas.handle, hlp.width - m, 0,
hlp.width - m, m, 0, 0, 0);
if border <> nil then
begin
moveto(x, y + md3 - 1);
lineto(x + m - 1, y + md3 - 1);
lineto(x + m - 1, y + m33 - 1);
lineto(x, y + m33 - 1);
lineto(x, y + md3 - 1);
lineto(x + md3 - 1, y);
lineto(x + m33 - 1, y);
lineto(x + m33 - 1, y + m - 1);
lineto(x + m - 1, y + m33 - 1);
moveto(x + m - 1, y + md3 - 1);
lineto(x + m33 - 1, y);
end;
end
else
begin
CopyRect(rect(x + md3, y + md3, m33 + x, m33 + y), hlp.Canvas,
rect(hlp.width - mm, hlp.height - m, hlp.width - m, hlp.height));
Points[0] := point(x, y);
Points[1] := point(x + m, y);
Points[2] := point(x + md3, y + md3);
PlgBlt(handle, Points, hlp.Canvas.handle, hlp.width - mm, 0,
hlp.width - mm, m, 0, 0, 0);
Points[1] := point(x + md3, y + md3);
Points[2] := point(x, y + m - 1);
PlgBlt(handle, Points, hlp.Canvas.handle, 0, 0, m, m, 0, 0, 0);
if border <> nil then
begin
moveto(x, y + m - 1);
lineto(x, y);
lineto(x + m - 1, y);
lineto(x + m33 - 1, y + md3 - 1);
lineto(x + m33 - 1, y + m33 - 1);
lineto(x + md3 - 1, y + m33 - 1);
lineto(x + md3 - 1, y + md3 - 1);
lineto(x + m33 - 1, y + md3 - 1);
moveto(x, y);
lineto(x + md3, y + md3);
moveto(x, y + m - 1);
lineto(x + md3, y + m33);
end;
end;
end;
hlp.free;
end;
// --- Beispielaufrufe: ---
var
xx: Integer = 100;
yy: Integer = 50;
// Größe ermitteln
procedure TForm1.Button1Click(Sender: TObject);
var
groesse: Integer;
begin
groesse := cube(Image1.Picture.Bitmap);
With Canvas do
Rectangle(xx, yy, xx + groesse, yy + groesse); // z.B.
end;
// Abbildungen
procedure TForm1.Button2Click(Sender: TObject);
var
c: TColor;
begin
c := clBlack;
cube(Canvas, Color, xx, yy, Image1.Picture.Bitmap, true, @c);
cube(Canvas, Color, xx + 200, yy, Image1.Picture.Bitmap, false);
end;
// ------------------------------------------------------------------- // Variante
2
type brightness = -120 .. 120; procedure cube(cnv: TCanvas; Ground: TColor; x, y: Integer; src: TBitmap;
mutation: Boolean = False; cant: Boolean = False; light: brightness = 0;
border: PColor = nil); overload;
var
bl, bm, br, bu: TBitmap;
m, md3, m33, w, p1, p2: Integer;
Points: array [0 .. 2] of TPoint;
procedure bmps(var b: TBitmap);
begin
b := TBitmap.create;
b.PixelFormat := pf24Bit;
b.width := m;
b.height := m;
end;
procedure makelight(bm: TBitmap; Value: brightness);
function SetByte(a, b: Integer): Byte;
asm
ADD EAX, b
CMP EAX, 255
JG @MAX
CMP EAX, 0
JGE @OK
MOV EAX, 0
JMP @OK
@MAX:
MOV EAX,255
@OK:
end;
var
i, j, b3: Integer;
p: PByteArray;
begin
b3 := bm.width * 3;
for j := 0 to bm.height - 1 do
begin
p := bm.ScanLine[j];
i := 0;
while i < b3 do
begin
p[i] := SetByte(p[i], Value);
p[i + 1] := SetByte(p[i + 1], Value);
p[i + 2] := SetByte(p[i + 2], Value);
inc(i, 3);
end;
end;
end;
begin
m := frontface(src);
if m < 10 then
begin
ShowMessage('Das Bild ist zu klein für die Verarbeitung!');
exit;
end;
md3 := m div 3;
m33 := trunc(m * 1.333);
bmps(bl);
bmps(bm);
bmps(br);
bmps(bu);
w := (src.width - m * 3) div 2;
bl.Canvas.CopyRect(bl.Canvas.ClipRect, src.Canvas, rect(w, 0, w + m, m));
bm.Canvas.CopyRect(bm.Canvas.ClipRect, src.Canvas,
rect(w + m, 0, w + m * 2, m));
br.Canvas.CopyRect(br.Canvas.ClipRect, src.Canvas,
rect(w + m * 2, 0, w + m * 3, m));
bu.Canvas.CopyRect(bu.Canvas.ClipRect, src.Canvas,
rect(w + m, m, w + m * 2, m * 2));
if light > 0 then
light := light div 2;
makelight(bl, light);
makelight(bm, light);
makelight(br, -abs(light));
if cant then
begin
p1 := 2;
p2 := 1;
end
else
begin
p1 := 1;
p2 := 2;
end;
with cnv do
begin
if border <> nil then
Pen.Color := border^;
Brush.Color := Ground;
FillRect(rect(x, y, x + m33, y + m33));
if mutation then
begin
draw(x, y + md3 - 1, bu);
Points[0] := point(x + md3 - 1, y);
Points[1] := point(x + m + md3 - 1, y);
Points[2] := point(x, y + md3 - 1);
PlgBlt(handle, Points, bm.Canvas.handle, 0, 0, m, m, 0, 0, 0);
Points[0] := point(x + m, y + md3 - 1);
Points[p1] := point(x + m - 1 + md3, y);
Points[p2] := point(x + m, y + m33 - 1);
PlgBlt(handle, Points, br.Canvas.handle, 0, 0, m, m, 0, 0, 0);
if border <> nil then
begin
moveto(x, y + md3 - 1);
lineto(x + m - 1, y + md3 - 1);
lineto(x + m - 1, y + m33 - 1);
lineto(x, y + m33 - 1);
lineto(x, y + md3 - 1);
lineto(x + md3 - 1, y);
lineto(x + m33 - 1, y);
lineto(x + m33 - 1, y + m - 1);
lineto(x + m - 1, y + m33 - 1);
moveto(x + m - 1, y + md3 - 1);
lineto(x + m33 - 1, y);
end;
end
else
begin
draw(x + md3 - 1, y + md3 - 1, bu);
Points[0] := point(x, y);
Points[1] := point(x + m, y);
Points[2] := point(x + md3, y + md3);
PlgBlt(handle, Points, bm.Canvas.handle, 0, 0, m, m, 0, 0, 0);
Points[p1] := point(x + md3, y + md3);
Points[p2] := point(x, y + m - 1);
PlgBlt(handle, Points, bl.Canvas.handle, 0, 0, m, m, 0, 0, 0);
if border <> nil then
begin
moveto(x, y + m - 1);
lineto(x, y);
lineto(x + m - 1, y);
lineto(x + m33 - 1, y + md3 - 1);
lineto(x + m33 - 1, y + m33 - 1);
lineto(x + md3 - 1, y + m33 - 1);
lineto(x + md3 - 1, y + md3 - 1);
lineto(x + m33 - 1, y + md3 - 1);
moveto(x, y);
lineto(x + md3, y + md3);
moveto(x, y + m - 1);
lineto(x + md3, y + m33);
end;
end;
end;
bu.free;
br.free;
bm.free;
bl.free;
end;
// ------Beispiele-----
procedure TForm1.Button3Click(Sender: TObject);
var
c: TColor;
begin
c := clRed;
cube(Canvas, Color, xx, yy + 200, Image1.Picture.Bitmap, True, True, 0, @c);
cube(Canvas, Color, xx + 200, yy + 200, Image1.Picture.Bitmap, False, True,
-66);
cube(Canvas, Color, xx + 400, yy + 200, Image1.Picture.Bitmap, True, False,
85, @c);
cube(Canvas, Color, xx + 600, yy + 200, Image1.Picture.Bitmap, True, True,
-75, @c);
cube(Canvas, Color, xx + 600, yy + 200, Image1.Picture.Bitmap, False,
False, 100);
end;
// ------------------------------------------------------------------- // Variante
3
function dimension(b: array of TBitmap; out frontface: Integer): Integer;
var
i: Integer;
begin
frontface := maxint;
for i := 0 to high(b) do
begin
if b[i].width < frontface then
frontface := b[i].width;
if b[i].height < frontface then
frontface := b[i].height;
end;
result := trunc(frontface * 1.333);
end;
procedure cube_3(cnv: TCanvas; Ground: TColor; x, y: Integer;
src1, src2, src3: TBitmap; mutation: Boolean = False);
var
bl, bm, bu: TBitmap;
m, md3, m33: Integer;
Points: array [0 .. 2] of TPoint;
procedure bmps(var b: TBitmap);
begin
b := TBitmap.create;
b.width := m;
b.height := m;
end;
procedure conf(src, dst: TBitmap);
var
w, h: Integer;
begin
h := (src.height - m) div 2;
w := (src.width - m) div 2;
dst.Canvas.draw(-w, -h, src);
end;
begin
m33 := dimension([src1, src2, src3], m);
md3 := m div 3;
bmps(bl);
bmps(bm);
bmps(bu);
conf(src1, bl);
conf(src2, bm);
conf(src3, bu);
with cnv do
begin
Brush.Color := Ground;
FillRect(rect(x, y, x + m33, y + m33));
if mutation then
begin
draw(x, y + md3 - 1, bu);
Points[0] := point(x + md3 - 1, y);
Points[1] := point(x + m + md3 - 1, y);
Points[2] := point(x, y + md3 - 1);
PlgBlt(handle, Points, bm.Canvas.handle, 0, 0, m, m, 0, 0, 0);
Points[0] := point(x + m, y + md3 - 1);
Points[1] := point(x + m - 1 + md3, y);
Points[2] := point(x + m, y + m33 - 1);
PlgBlt(handle, Points, bl.Canvas.handle, 0, 0, m, m, 0, 0, 0);
end
else
begin
draw(x + md3 - 1, y + md3 - 1, bu);
Points[0] := point(x, y);
Points[1] := point(x + m, y);
Points[2] := point(x + md3, y + md3);
PlgBlt(handle, Points, bm.Canvas.handle, 0, 0, m, m, 0, 0, 0);
Points[1] := point(x + md3, y + md3);
Points[2] := point(x, y + m - 1);
PlgBlt(handle, Points, bl.Canvas.handle, 0, 0, m, m, 0, 0, 0);
end;
end;
bu.free;
bm.free;
bl.free;
end;
// Beispiel
procedure TForm1.Button4Click(Sender: TObject);
var
b1, b2, b3: TBitmap;
begin
b1 := TBitmap.create;
b1.LoadFromFile('D:\Bilder\Cube\frau.bmp');
b2 := TBitmap.create;
b2.LoadFromFile('D:\Bilder\Cube\bernd.bmp');
b3 := TBitmap.create;
b3.LoadFromFile('D:\Bilder\Cube\det.bmp');
cube_3(Canvas, Color, 350, 100, b1, b2, b3);
cube_3(Canvas, Color, 50, 100, b1, b2, b3, True);
b3.free;
b2.free;
b1.free;
end;
|
Zugriffe seit 6.9.2001 auf Delphi-Ecke





