Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Linie im Winkel zeichnen (https://www.delphipraxis.net/185785-linie-im-winkel-zeichnen.html)

Aphton 7. Jul 2015 10:04

AW: Linie im Winkel zeichnen
 
Zitat:

Zitat von GroZ (Beitrag 1307942)
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
LCanvas: TCanvas;
begin

LCanvas := TPaintBox(Sender).Canvas;

LCanvas.Ellipse(100,100,400,400);
// ...

procedure TForm1.StrichClick(Sender: TObject);
var Radi, Gradi : extended ;
Pi: extended ;
begin
canvas.MoveTo(280,280);
canvas.lineto(280,125);
// ...
[/DELPHI]

Fällt dir hier nichts auf?

GroZ 7. Jul 2015 10:11

AW: Linie im Winkel zeichnen
 
Leider nein :D

Aphton 7. Jul 2015 10:11

AW: Linie im Winkel zeichnen
 
Zitat:

... das heißt wenn ich 15° eingebe soll die Linie im 15° Winkel gezeichnet werden. Kann mir jemand helfen?
Aber gerne - hier

Code:
x := kreis_radius * cos(DegToRad(15))
y := kreis_radius * sin(DegToRad(15))

linie_x1 = kreis_mittelpunkt_x
linie_y1 = kreis_mittelpunkt_y
linie_x2 = kreis_mittelpunkt_x + x
linie_y2 = kreis_mittelpunkt_y + y

Sir Rufo 7. Jul 2015 10:13

AW: Linie im Winkel zeichnen
 
Das Wichtigste ist, dass die PaintBox ihren Kram selber zeichnet. Und zwar in dem Event
Delphi-Quellcode:
OnPaint
.

Wenn die PaintBox nun also etwas mehr zeichnen soll, dann muss man so etwas wie einen Bauplan zur Verfügung stellen und dann kann die PaintBox diesen Bauplan abarbeiten.

Ändert man den Bauplan, dann teilt man das der PaintBox durch den Aufruf von
Delphi-Quellcode:
TPaintBox.Repaint
mit.

Der einfachste Bauplan, wäre z.B. das Zeichnen der Ellipse:
Delphi-Quellcode:
type
  TForm1 = class( TForm )
    CheckBox1: TCheckBox; // OnClick = CheckBox1Click
    PaintBox1: TPaintBox; // OnPaint = PaintBox1Paint
    procedure CheckBox1Clicked( Sender: TObject );
    procedure PaintBox1.Paint( Sender: TObject );
  private
    FPaintEllipse: Boolean;
  end;

procedure TForm1.CheckBox1Clicked( Sender: TObject );
begin
  // Bauplan ändern
  FPaintEllipse := CheckBox1.Checked;
  // PaintBox neu zeichnen lassen
  PaintBox1.Repaint;
end;

procedure TForm1.PaintBox1Paint( Sender: TObject );
var
  LCanvas: TCanvas;
begin
  LCanvas := TPaintBox(Sender).Canvas;
  // nach dem Bauplan zeichnen
  if FPaintEllipse then
    LCanvas.Ellipse(100,100,400,400);
end;

Aphton 7. Jul 2015 10:14

AW: Linie im Winkel zeichnen
 
Zitat:

Zitat von GroZ (Beitrag 1307945)
Leider nein :D

Im StrichClick() greifst du auf den Canvas des Formulars zu, anstatt wie bei PaintBox1Paint() auf den Canvas der Paintbox zuzugreifen

GroZ 7. Jul 2015 10:52

AW: Linie im Winkel zeichnen
 
Zitat:

Zitat von Aphton (Beitrag 1307948)
Zitat:

Zitat von GroZ (Beitrag 1307945)
Leider nein :D

Im StrichClick() greifst du auf den Canvas des Formulars zu, anstatt wie bei PaintBox1Paint() auf den Canvas der Paintbox zuzugreifen

Habe es jetzt gelöst danke an alle!
Delphi-Quellcode:
unit Uhr;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Winkel: TEdit;
    Strich: TButton;
    Reset: TButton;
    PaintBox1: TPaintBox;
    procedure PaintBox1Paint(Sender: TObject);
    procedure ResetClick(Sender: TObject);
    procedure StrichClick(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  i : integer;

implementation

{$R *.dfm}

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  LCanvas: TCanvas;
begin

LCanvas := TPaintBox(Sender).Canvas;

  LCanvas.Ellipse(100,100,400,400);       // Kreis zeichnen


end;

procedure TForm1.ResetClick(Sender: TObject);
begin

paintbox1.Repaint ;                     // Clear
end;

procedure TForm1.StrichClick(Sender: TObject);
var Radi, Gradi, R, PX, PY : double ;
    MX, MY, PXi, PYi : integer ;

begin

MX := 250;                         // Mittelpunkt
MY := 250;
R := 150;
Canvas.MoveTo(MX,MY);
//Canvas.lineto(280,125);

Gradi := StrToFloat(Winkel.Text) ;

Radi := 3.14 *(Gradi/180);        // Rechnung

PX := cos(Radi)* R + MX ;
PY := MY-sin(Radi)* R;
PXi := trunc(PX) ;                   // Von ??? zu Integer umwandeln
PYi := trunc(PY) ;
Canvas.lineTo(PXi,PYi) ;








end;



end.

Aphton 7. Jul 2015 11:00

AW: Linie im Winkel zeichnen
 
Naja, das nebensächliche Problem besteht weiterhin.. Ansosnten - kein Problem :thumb:

Popov 7. Jul 2015 11:49

AW: Linie im Winkel zeichnen
 
@GroZ

Paar kleine Vorschläge:

- nimm die Konstante Pi statt 3,14. Kostet nix, ist bereits im System.
- Nutze lieber Round() statt Trunc(). Round rundet kaufmännisch, Trunc schneidet nur die Nachkommastellen ab.

Das alles ist zwar nicht ganz wichtig, kann aber den Unterschied ausmachen ob z. B. Punkt 9 Uhr klein wenig drunter oder über dem Punkt ist.

SProske 7. Jul 2015 12:12

AW: Linie im Winkel zeichnen
 
Zitat:

Zitat von Popov (Beitrag 1307974)

- nimm die Konstante Pi statt 3,14. Kostet nix, ist bereits im System.

Wieso nicht gleich DegToRad aus der Math?

Delphi-Quellcode:
Radi := DegToRad(Gradi);

BadenPower 7. Jul 2015 12:14

AW: Linie im Winkel zeichnen
 
Zitat:

Zitat von Aphton (Beitrag 1307963)
Naja, das nebensächliche Problem besteht weiterhin.. Ansosnten - kein Problem :thumb:

Als Nächstes kommen folgende Fragen des TE:

1.:
Ich habe die PaintBox im Formular um 100 Pixel nach unten verschoben, nun stimmt mein Anfangspunkt der Linie nicht mehr mit dem Mittelpunkt des Kreises überein.

2.:
Wenn ich die Anwendung minimiere und dann wieder Anzeigen lasse, dann sind meine gezeichneten Linien verschwunden.

3.:
Meine Linen bei 180 und 270° sind nicht gerade.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:12 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz