1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91:
| procedure DrawArrow(Canvas: TCanvas; PX1,PY1,PX2,PY2: Extended); const H = 30; C = H*6/7; W = H*2/3; Var L, PX, PY, X, Y : Extended; begin X := PX2-PX1; Y := PY2-PY1; L := sqrt(X*X+Y*Y); PX := X*(1-H/L); PY := Y*(1-H/L); with Canvas do begin MoveTo(Round(PX1),Round(PY1)); LineTo(Round(PX2),Round(PY2)); Brush.Style := bsSolid; Polygon([Point(Round(PX2), Round(PY2)), Point(Round(PX1+PX-Y/L*W/2), Round(PY1+PY+X/L*W/2)), Point(Trunc(PX1+X-X/L*C), Trunc(PY1+Y-Y/L*C)), Point(Round(PX1+PX+Y/L*W/2), round(PY1+PY-X/L*W/2))]); end; end;
procedure DrawCircle(Canvas: TCanvas; X, Y, R: Extended; Text: String); var Size: TSize; begin with Canvas do begin Brush.Style := bsSolid; Ellipse(Round(X-R),Round(Y-R),Round(X+R),Round(Y+R)); Size := Canvas.TextExtent(Text); Brush.Style := bsClear; TextOut(Round(X)-Size.cx div 2, Round(Y)-Size.cy div 2, Text); end; end;
procedure DrawConnectionArrow(Canvas: TCanvas; X1, Y1, X2, Y2, R, Offset: Extended); var EX, EY, L, P: Extended; begin EX := X2-X1; EY := Y2-Y1; L := sqrt(sqr(EX)+sqr(EY)); EX := EX/L; EY := EY/L; P := sqrt(sqr(R)-sqr(Offset)); if Offset > R then Offset := R; DrawArrow(Canvas, X1+EY*Offset+EX*P, Y1-EX*Offset+EY*P, X2+EY*Offset-EX*P, Y2-EX*Offset-EY*P); end;
procedure TForm1.Button1Click(Sender: TObject); const R = 16; Offset = 8; var X1, Y1, X2, Y2: Integer; begin with Image1,Image1.Canvas do begin Font.Name := 'Arial'; Font.Height := 30;
X1 := 20; Y1 := 30; X2 := 180; Y2 := 60; Brush.Color := clYellow; DrawCircle(Canvas, X1, Y1, R, '1'); Brush.Color := clYellow; DrawCircle(Canvas, X2, Y2, R, '2'); Brush.Color := clBlack; DrawConnectionArrow(Canvas, X1, Y1, X2, Y2, R, 0);
X1 := 20; Y1 := 80; X2 := 180; Y2 := 110; Brush.Color := clYellow; DrawCircle(Canvas, X1, Y1, R, 'A'); Brush.Color := clYellow; DrawCircle(Canvas, X2, Y2, R, 'B'); Brush.Color := clBlack; DrawConnectionArrow(Canvas, X1, Y1, X2, Y2, R, Offset); DrawConnectionArrow(Canvas, X2, Y2, X1, Y1, R, Offset); end; end; |