// Ein Bild
wird in die Form einer Ellipse gezwängt. Die Berechnung
const mindest = 25; type rcd = Record cx, cy: Integer; end; prz = 10 .. 200; // ein Zehntel bis doppelt so hoch wie breit brt = mindest .. 1000; function DrawEllipse(source: TGraphic; cnv: TCanvas; x0, y0: Integer; breit: brt; hoch: prz; rand: Integer = 0; farbe: TColor = 0; streckung: Word = 0): rcd; var rx2, ry2, rx4, ry4, F, Fx, Fy, ry, x, y, yy, dff, rnd: Integer; bm: TBitmap; xx: single; procedure spalte(x, y, z: Integer); begin cnv.copyrect(rect(x - 1, y, x, z + streckung), bm.Canvas, rect(x - bm.width - 1 + dff, 0, x - bm.width + dff, bm.height)); end; procedure doit; begin SetStretchBltMode(cnv.handle, STRETCH_HALFTONE); spalte(x0 - x, y0 - y, y0 + y); spalte(x0 + x, y0 - y, y0 + y); end; procedure DrawArc(R: TRect; StartAngle, EndAngle: single); var MX, MY, RX, YR, SA, EA, P2: single; SX, SY, EX, EY: Integer; begin P2 := PI / 180; RX := (R.Right - R.Left) / 2; YR := (R.Bottom - R.Top) / 2; MX := R.Left + RX; MY := R.Top + YR; SA := StartAngle * P2; EA := EndAngle * P2; SX := Round(MX + sin(SA) * RX); SY := Round(MY - cos(SA) * YR); EX := Round(MX + sin(EA) * RX); EY := Round(MY - cos(EA) * YR); Arc(cnv.handle, R.Left, R.Top, R.Right, R.Bottom, EX, EY, SX, SY); end; begin bm := TBitmap.create(breit, breit + streckung); Result.cy := -1; try rand := rand + ord(rand = 1); // muss zwecks Randabdeckung ungleich 1 sein if rand > breit div 4 then rand := breit div 4; ry := Round(breit * (hoch / 200)); Result.cy := ry * 2 + rand * 2 + streckung; Result.cx := breit + rand * 2; if source = nil then exit; dff := breit - x0 - rand; with bm.Canvas do begin SetStretchBltMode(handle, STRETCH_HALFTONE); stretchdraw(cliprect, source); end; breit := Round(breit * 0.5); inc(x0, breit + rand); inc(y0, ry + rand); rx2 := breit * breit; ry2 := ry * ry; rx4 := rx2 + rx2; ry4 := ry2 + ry2; F := Round(ry2 - rx2 * ry + 0.25 * breit); Fx := 0; Fy := rx4 * ry; x := 0; y := ry; doit; while Fx < Fy do begin if F >= 0 then begin dec(y); Fy := Fy - rx4; F := F - Fy; end; inc(x); Fx := Fx + ry4; F := F + Fx + ry2; doit; end; xx := x + 0.5; yy := pred(y); F := Round(ry2 * xx * xx + rx2 * yy * yy - rx2 * ry2); while y > 0 do begin if F <= 0 then begin inc(x); Fx := Fx + ry4; F := F + Fx; end; dec(y); Fy := Fy - rx4; F := F + rx2 - Fy; doit; end; if rand > 0 then with cnv do begin rnd := rand div 2; brush.Style := bsClear; pen.width := rand; pen.Color := farbe; DrawArc(rect(x0 - breit - rnd, y0 - rnd - ry + streckung, x0 + breit + rnd, y0 + ry + rnd + streckung), 90, 270); DrawArc(rect(x0 - breit - rnd, y0 - rnd - ry, x0 + breit + rnd, y0 + ry + rnd), 270, 90); moveto(x0 - breit - rnd, y0); lineto(x0 - breit - rnd, y0 + streckung); moveto(x0 + breit + rnd, y0); lineto(x0 + breit + rnd, y0 + streckung); end; except Result.cx := -1 end; bm.Free; end; function dimensions(Breite: brt; Prozent: prz; rand: Integer; streckung: Word): rcd; begin Result := DrawEllipse(nil, nil, 0, 0, Breite, Prozent, rand, 0, streckung); end; // --- Beispiele --- procedure TForm1.Button1Click(Sender: TObject); var Quelle: TGraphic; Ziel: TCanvas; x, y: Integer; Prozent: prz; Breite: brt; begin x := 0; y := 0; Breite := 250; Prozent := 100; // Kreisförmig Ziel := Canvas; // z.B. Quelle := Image1.Picture.Graphic; if DrawEllipse(Quelle, Ziel, x, y, Breite, Prozent).cx < mindest then ShowMessage('Fehler'); end; procedure TForm1.Button2Click(Sender: TObject); var Quelle: TGraphic; Ziel: TCanvas; x, y: Integer; Prozent: prz; Breite: brt; begin x := 280; y := 10; Breite := 156; Prozent := 200; // doppelt so hoch wie breit Ziel := Canvas; Quelle := Image1.Picture.Graphic; DrawEllipse(Quelle, Ziel, x, y, Breite, Prozent); end; procedure TForm1.Button3Click(Sender: TObject); var Quelle: TGraphic; Ziel: TCanvas; x, y: Integer; Prozent: prz; Breite: brt; begin x := 20; y := 320; Breite := 300; Prozent := 50; // halb so hoch wie breit Ziel := Canvas; Quelle := Image1.Picture.Graphic; DrawEllipse(Quelle, Ziel, x, y, Breite, Prozent); end; // ---------------------------------------------- // zuerst Abmaße ermitteln var Mass: rcd; Breite: brt = 265; Prozent: prz = 67; rand: Integer = 6; streckung: Word = 0; procedure TForm1.Button4Click(Sender: TObject); begin Mass := dimensions(Breite, Prozent, rand, streckung); ShowMessage('Breite: ' + InttoStr(Mass.cx) + #13 + 'Höhe: ' + InttoStr(Mass.cy)); end; // dann mit roter Umrandung zeichnen procedure TForm1.Button5Click(Sender: TObject); begin DrawEllipse(Image1.Picture.Graphic, Canvas, 10, 10, Breite, Prozent, rand, clRed); end; // ---------------------------------------------- // blaue Umrandung und Streckung procedure TForm1.Button6Click(Sender: TObject); const dehnung = 100; begin DrawEllipse(Image1.Picture.Graphic, Canvas, 10, 10, 250, 33, 5, clblue, dehnung); end;
|
||||||||||||
Zugriffe seit
6.9.2001 auf Delphi-Ecke |