![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:22 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