![]() |
Linie im Winkel zeichnen
Hallo. Ich soll in einem Kreis eine Linie zeichnen soweit kein Problem. Aber diese Linie soll im Winkel angepasst sein. das heißt wenn ich 15° eingebe soll die Linie im 15° Winkel gezeichnet werden. Kann mir jemand helfen?
In etwas so hier: ![]() |
AW: Linie im Winkel zeichnen
Und wo genau ist dein Problem, was hast du denn bis jetzt schon? Hast du schon mit MoveTo und LineTo herumexperimentiert, so wie in dem
![]() Weiterhin: Was sind deine mathematischen Vorkenntnisse? Weißt du, wie Sinus und Kosinus definiert sind und wie man mit deren Hilfe einen beliebigen Punkt auf einem Kreis mit Radius R beschreiben kann? Besten Gruß |
AW: Linie im Winkel zeichnen
Dieses Beispiel habe ich schon etwa 100 mal im Internet gepostet. Ich habe es mal als Demo geschrieben um zu zeigen wie man einen Kreis mit Sinus und Kosinus alleine zeichnen kann.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var w, x, sinX, sinY, cosX, cosY, sinXorY, cosXorX, KreisX, KreisY: Integer; const FX = 200; FY = 50; sinStartX = 200; sinStartY = 100; cosStartX = 100; cosStartY = 200; procedure CanLine(Can: TCanvas; x1, y1, x2, y2: Integer); begin Can.MoveTo(x1, y1); Can.LineTo(x2, y2); end; function mySin(PixelX: Integer; PiInPixel, OneInPixel: Word): Integer; var x: Extended; begin x := Pi * (PixelX / PiInPixel); Result := Trunc(sin(x) * OneInPixel); end; function myCos(PixelX: Integer; PiInPixel, OneInPixel: Word): Integer; var x: Extended; begin x := Pi * (PixelX / PiInPixel); Result := Trunc(cos(x) * OneInPixel); end; procedure XorLine(Can: TCanvas; x1, y1, x2, y2: Integer); begin with Can, TPen.Create do try Mode := Pen.Mode; Pen.Mode := pmNot; MoveTo(x1, y1); LineTo(x2, y2); Pen.Mode := Mode; finally Free; end; end; begin with Canvas do begin FillRect(ClipRect); MoveTo(sinStartX, sinStartY-FY); LineTo(sinStartX, sinStartY+FY); MoveTo(sinStartX, sinStartY); LineTo(sinStartX+(FX*2), sinStartY); MoveTo(cosStartX-FY, cosStartY); LineTo(cosStartX+FY, cosStartY); MoveTo(cosStartX, cosStartY); LineTo(cosStartX, cosStartY+(FX*2)); sinX := sinStartX; sinY := sinStartY; cosX := cosStartY; cosY := cosStartX; KreisY := sinY; KreisX := cosY; for w := -FX to FX do begin if not(w = -FX) then begin //alte Xor-Linen löschen XorLine(Canvas, 0, sinXorY, ClipRect.Right, sinXorY); XorLine(Canvas, cosXorX, 0, cosXorX, ClipRect.Bottom); end; //sin zeichnen x := w; MoveTo(sinX, sinY); sinX := sinStartX + FX + w; sinY := sinStartY + mySin(x, FX, FY); LineTo(sinX, sinY); //cos zeichnen x := w; MoveTo(cosY, cosX); cosX := cosStartY + FX + w; cosY := cosStartX + myCos(x, FX, FY); LineTo(cosY, cosX); //Kreis zeichen aus den Y-Werten von Sinus und Cosinus MoveTo(KreisX, KreisY); KreisY := sinY; KreisX := cosY; LineTo(KreisX, KreisY); //Xor-Line zeichnen sinXorY := sinY; cosXorX := cosY; XorLine(Canvas, 0, sinXorY, ClipRect.Right, sinXorY); XorLine(Canvas, cosXorX, 0, cosXorX, ClipRect.Bottom); Sleep(10); //eine kurze Verzögerung damit es langsammer geht Application.ProcessMessages; end; //Letzte Xor-Linen löschen XorLine(Canvas, 0, sinXorY, ClipRect.Right, sinXorY); XorLine(Canvas, cosXorX, 0, cosXorX, ClipRect.Bottom); end; end; {Popov} |
AW: Linie im Winkel zeichnen
Mein Eindruck: Der TE probiert hier so lange die Hilfsbereitschaft gewisser User aus, bis er eine fertige Lösung erhält, weil er im Unterricht nicht aufgepaßt hat. Ich finde nicht, daß man das auch noch unterstützen sollte.
|
AW: Linie im Winkel zeichnen
Das braucht er nicht, denn ob er etwas hier bekommt oder über Google, ist gehopst wie gesprungen. Nicht die Formeln sind das Problem, denn von denen gibt es im Internet genug, wichtig ist wie man an die Aufgabe herangeht. Es ist die Methode, bzw. die Technik wie man eine Aufgabe löst. Die bekommt man eigentlich in der Schule beigebracht.
Code:
Hat man alle schön aufgeschrieben, muss man nur nach der Lösung suchen wo das Gesuchte mit dem Gegebenen berechnet werden kann.
Aufgabe:
Koordinate B berechnen. Gegeben: Koordinate A Winkel Alpha Hypotenuse (Radius) Kreiszahl Pi Gesucht: Ankathete (Länge X) Gegenkathete (Länge Y) |
AW: Linie im Winkel zeichnen
Zitat:
|
AW: Linie im Winkel zeichnen
Ich hatte sowas wie Informatik gar nicht in der Schule ich mache derzeit ein Praktikum und soll diese Dinge programmieren. ich schick euch mal meinen Quellcode ist wirklich sehr einfach^^
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); begin canvas.Ellipse(100,100,400,400); end; procedure TForm1.ResetClick(Sender: TObject); begin paintbox1.Repaint end; procedure TForm1.StrichClick(Sender: TObject); var i : integer ; begin canvas.MoveTo(250,250); canvas.lineto(250,100); i := StrToInt(Winkel.Text) ; end; end. |
AW: Linie im Winkel zeichnen
Zitat:
|
AW: Linie im Winkel zeichnen
Wenn du auf dem Canvas der Paintbox malen möchtest, dann musst du auch auf dem Canvas der Paintbox malen und nicht auf dem Canvas der Form!
Delphi-Quellcode:
procedure TForm1.PaintBox1Paint(Sender: TObject);
var LCanvas: TCanvas; begin LCanvas := TPaintBox(Sender).Canvas; LCanvas.Ellipse(100,100,400,400); end; |
AW: Linie im Winkel zeichnen
Das ist jetzt mein Quellcode. Jetzt komm ich aber absolout nicht mehr weiter...
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); end; procedure TForm1.ResetClick(Sender: TObject); begin paintbox1.Repaint end; procedure TForm1.StrichClick(Sender: TObject); var Radi, Gradi : extended ; Pi: extended ; begin canvas.MoveTo(280,280); canvas.lineto(280,125); Gradi := StrToFloat(Winkel.Text) ; Radi := Pi*(Gradi/180); end; end. |
AW: Linie im Winkel zeichnen
Zitat:
|
AW: Linie im Winkel zeichnen
Leider nein :D
|
AW: Linie im Winkel zeichnen
Zitat:
![]()
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 |
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:
mit.
TPaintBox.Repaint
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; |
AW: Linie im Winkel zeichnen
Zitat:
|
AW: Linie im Winkel zeichnen
Zitat:
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. |
AW: Linie im Winkel zeichnen
Naja, das nebensächliche
![]() |
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. |
AW: Linie im Winkel zeichnen
Zitat:
Delphi-Quellcode:
Radi := DegToRad(Gradi);
|
AW: Linie im Winkel zeichnen
Zitat:
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. |
AW: Linie im Winkel zeichnen
Zitat:
Aber nein, im Prinzip spricht nichts dagegen. |
AW: Linie im Winkel zeichnen
Zitat:
|
AW: Linie im Winkel zeichnen
Pi befindet sich in der Unit System. Die ist in der Regel schon eingebunden, so dass du einfach nur noch Pi schreiben musst. Beispiel:
Delphi-Quellcode:
.
ShowMessage(FloatToStr(Pi));
Die Funktion Round ist nur ein guter Tipp. Aus Erfahrung weiß ich, dass es manchmal um die Nachkommastellen geht. Round ist öfter näher am richtigen Ergebnis als Trunc. |
AW: Linie im Winkel zeichnen
Zitat:
|
AW: Linie im Winkel zeichnen
Zitat:
|
AW: Linie im Winkel zeichnen
Zitat:
|
AW: Linie im Winkel zeichnen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz