this slowpoke moves

Create Chart Points

const
  ARROWCLR = clBlack;
  AXISCLR = clBlue;
  BKCOLOR = clBtnFace;
  DOTCLR = clRED;
  FONTCLR = clGreen;
  LEN_X = 800;
  LEN_Y = 495;
  ORG_X = 30;
  ORG_Y = 30;
  SCALE = 17;
  MARKERLEN = 10;
  R = 2;
  
//

procedure DrawAxes(Canvas: TCanvas; Origin: TPoint; leny, lenx: Integer);
  procedure DrawXAxisArrow;
  var
    pts: array of TPoint;
  begin
    setlength(pts, 4);
    pts[0].X := LEN_X;
    pts[0].Y := Canvas.ClipRect.Bottom - ORG_Y - 5;
    pts[1].X := LEN_X + 10;
    pts[1].Y := Canvas.ClipRect.Bottom - ORG_Y;
    pts[2].X := LEN_X;
    pts[2].Y := Canvas.ClipRect.Bottom - ORG_Y + 5;
    pts[3].X := LEN_X;
    pts[3].Y := Canvas.ClipRect.Bottom - ORG_Y - 5;
    Canvas.Pen.Color := ARROWCLR;
    Canvas.Polyline(pts);
    Canvas.Brush.Color := ARROWCLR;
    Canvas.FloodFill(LEN_X + 1, Canvas.ClipRect.Bottom - ORG_Y - 4, ARROWCLR,
      fsBorder);
    Canvas.Brush.Color := BKCOLOR;
  end;

  procedure DrawYAxisArrow;
  var
    pts: array of TPoint;
  begin
    setlength(pts, 4);
    pts[0].X := ORG_X - 5;
    pts[0].Y := Canvas.ClipRect.Bottom - LEN_Y - ORG_Y;
    pts[1].X := ORG_X;
    pts[1].Y := Canvas.ClipRect.Bottom - LEN_Y - ORG_Y - 10;
    pts[2].X := ORG_X + 5;
    pts[2].Y := Canvas.ClipRect.Bottom - LEN_Y - ORG_Y;
    pts[3].X := ORG_X - 5;
    pts[3].Y := Canvas.ClipRect.Bottom - LEN_Y - ORG_Y;
    Canvas.Pen.Color := ARROWCLR;
    Canvas.Polyline(pts);
    Canvas.Brush.Color := ARROWCLR;
    Canvas.FloodFill(ORG_X - 5 + 1, Canvas.ClipRect.Bottom - LEN_Y - ORG_Y - 1,
      ARROWCLR, fsBorder);
    Canvas.Brush.Color := BKCOLOR;
  end;

begin
  Canvas.Brush.Color := BKCOLOR;
  Canvas.FillRect(Canvas.ClipRect);
  Canvas.Pen.Color := AXISCLR;
  Canvas.MoveTo(Origin.X, Origin.Y);
  Canvas.LineTo(Origin.X, leny);
  DrawYAxisArrow;
  Canvas.Pen.Color := AXISCLR;
  Canvas.MoveTo(Origin.X, Origin.Y);
  Canvas.LineTo(lenx, Origin.Y);
  DrawXAxisArrow;
end;

procedure DrawHorzMarker(Canvas: TCanvas; Left: TPoint; len: Integer);
begin
  Canvas.Pen.Color := AXISCLR;
  Canvas.MoveTo(Left.X, Left.Y);
  Canvas.LineTo(len, Left.Y);
end;

procedure DrawVerMarkers(Canvas: TCanvas; Top: TPoint; len: Integer);
begin
  Canvas.Pen.Color := AXISCLR;
  Canvas.MoveTo(Top.X, Top.Y);
  Canvas.LineTo(Top.X, len);
end;

procedure DrawXAxisNumbers(Canvas: TCanvas; TopLeft: TPoint; Number: Integer);
begin
  Canvas.Font.Color := FONTCLR;
  Canvas.TextOut(TopLeft.X - 5, TopLeft.Y + 5, IntToStr(Number));
end;

procedure DrawYAxisNumbers(Canvas: TCanvas; TopLeft: TPoint; Number: Integer);
begin
  Canvas.Font.Color := FONTCLR;
  Canvas.TextOut(TopLeft.X - 15, TopLeft.Y - 6, IntToStr(Number));
end;

procedure DrawPoint(Canvas: TCanvas; Center: TPoint; Radius: Integer);
var
  rect: TRect;
begin
  Canvas.Pen.Color := DOTCLR;
  Canvas.Brush.Color := DOTCLR;
  rect.Left := Center.X - Radius;
  rect.Top := Center.Y - Radius;
  rect.Right := Center.X + Radius;
  rect.Bottom := Center.Y + Radius;
  Canvas.Ellipse(rect);
end;

function Coordinates2Pixel(Origin, cords: TPoint; Interval: Integer): TPoint;
begin
  result.X := Origin.X + (cords.X * Interval);
  result.Y := Origin.Y - (cords.Y * Interval);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Origin: TPoint;
  cntHorzMarkers: Integer;
  cntVerMarkers: Integer;
  i: Integer;
  pt: TPoint;
begin
  pt.X := 0;
  pt.Y := 0;
  Bmp := TBitmap.Create;
  Bmp.Width := Paintbox1.Width;
  Bmp.Height := Paintbox1.Height;
  Origin.X := ORG_X;
  Origin.Y := Bmp.Height - ORG_Y;
  DrawAxes(Bmp.Canvas, Origin, Origin.y - LEN_Y, LEN_X);
  cntHorzMarkers := LEN_Y div SCALE;
  for i := 1 to CntHorzMarkers - 1 do
  begin
    pt.X := Origin.X - (MARKERLEN div 2);
    pt.Y := Origin.Y - (SCALE * i);
    DrawHorzMarker(Bmp.Canvas, pt, Origin.X + (MARKERLEN div 2));
    DrawYAxisNumbers(Bmp.Canvas, pt, i);
  end;
  cntVerMarkers := (LEN_X - ORG_X) div SCALE;
  for i := 1 to cntVerMarkers do
  begin
    pt.X := Origin.X + (SCALE * i);
    pt.Y := Origin.Y + (MARKERLEN div 2);
    DrawVerMarkers(Bmp.Canvas, pt, Origin.Y - (MARKERLEN div 2));
    DrawXAxisNumbers(Bmp.Canvas, pt, i);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(Bmp);
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  BitBlt(Paintbox1.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height,
    Bmp.Canvas.Handle, 0, 0, SRCCOPY);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Origin: TPoint;
  pt: TPoint;
begin
  Origin.X := ORG_X;
  Origin.Y := Bmp.Height - ORG_Y;
  pt.X := StrToInt(Edit1.Text);  // X Punkt Eingabe
  pt.Y := StrToInt(Edit2.Text);  // Y Punkt Eingabe
  pt := Coordinates2Pixel(Origin, pt, SCALE);
  DrawPoint(Bmp.Canvas, pt, R);
  Paintbox1.Repaint;
end;

Keine Kommentare:

Kommentar veröffentlichen

Beliebte Posts

Translate