Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Stern zeichnen mit line to und move to (https://www.delphipraxis.net/142286-stern-zeichnen-mit-line-und-move.html)

hedi112 25. Okt 2009 13:11


Stern zeichnen mit line to und move to
 
Liste der Anhänge anzeigen (Anzahl: 1)
guten tag,

ich studiere aktuell im dritten semester, und muss nun ein praktikum machen, wo ein stern vieleck gezeichnet weden soll.

ich hab mir auch bereits gedanken gemacht und das programm geschrieben, aber leider kommt da kein stern bei raus, sondern nur eine linie.

Da mir hinten und vorne nicht klar ist, woran das liegt, bitte ich euch einfach mal um hilfe.

ich hänge mal den bereits vorhandenen quelltext an...

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    SpinEdit1: TSpinEdit;
    SpinEdit2: TSpinEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    SpinEdit3: TSpinEdit;
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  xm, ym,
  Anzahl_Punkte,
  ri, ra: integer;
  Winkelstueck: double;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
    begin
    xm:=image1.Width div 2;
    ym:=image1.height div 2;
    Anzahl_Punkte:=2*spinedit1.value;
    ri:= SpinEdit2.value;              //spinedit.value ist sofort
    ra:= SpinEdit3.value;              //ein integer wert...
    xm:=xm+ri;
    winkelstueck:=(2*pi)/Anzahl_Punkte;
    end;

procedure TForm1.Button1Click(Sender: TObject);
var
index,x,xi,yi: integer;

begin
   image1.Canvas.moveto(xm,ym);
   x:=Anzahl_Punkte mod 2;
for index:=1 to Anzahl_Punkte do
    if x=0 then
        begin
        xi:=trunc (ri*cos(index*winkelstueck));
        yi:=trunc (ri*sin(index*winkelstueck));
        image1.Canvas.LineTo(xi,yi)
        end
    else
        begin
        xi:=trunc (ra*cos(winkelstueck));
        yi:=trunc (ra*sin(winkelstueck));
        image1.Canvas.lineto(xi,yi);
        end;
end;

procedure TForm1.Button2Click(Sender: TObject);
   begin
   image1.picture:= nil
   end;

end.
[edit=mkinzler]Code-Tag durch Delphi-Tag ersetzt Mfg, mkinzler[/edit]

mkinzler 25. Okt 2009 13:19

Re: Stern zeichnen mit line to und move to
 
Seit ihr Kommilitonen?

hedi112 25. Okt 2009 13:22

Re: Stern zeichnen mit line to und move to
 
jo, möglich ist das, weiß zwar gerade nicht wer genau sich da noch mit dem selben thema rumschlägt, dafür sind wir dann doch noch zuviele im studiengang

turboPASCAL 25. Okt 2009 14:03

Re: Stern zeichnen mit line to und move to
 
Der Ansatz ist nicht schlecht, du musst aber bei dem Zeichnen vom Mittelpunkt ausgehen.

Delphi-Quellcode:
for i :=1 to Anzahl_Punkte do
  begin
    if x=0 then
    begin
      xi:=trunc (xm + ri*cos(i*winkelstueck)); // <--<<
      yi:=trunc (ym + ri*sin(i*winkelstueck)); // <--<<
      Image1.Canvas.LineTo(xi, yi)
    end else
    begin
      xi:=trunc (xm + ra*cos(winkelstueck)); // <--<<
      yi:=trunc (ym + ra*sin(winkelstueck)); // <--<<
      image1.Canvas.lineto(xi, yi);
    end;
  end;

hedi112 25. Okt 2009 14:10

Re: Stern zeichnen mit line to und move to
 
ok, da haste natürlich recht, da hab ich den wald vor lauter bäumen nicht gesehen...

so, jetzt kommt auf klick zwar das imagefeld, aber das ist leer?... komisch...

hathor 25. Okt 2009 15:11

Re: Stern zeichnen mit line to und move to
 
Ich habe hier was Schönes gefunden:
Es zeichnet eine EU-Flagge mit 12 (!) Sternen:

Delphi-Quellcode:
procedure drawstar( xc, yc: integer; radius:double);
var data : array[1..10] of Tpoint;
    j : integer; a: double;
begin
    for j := 0 to 4 do begin
        with data[2*j+1] do begin
            a := 2*pi*j/5;
            x := xc + round(radius*sin(a));
            y := yc - round(radius*cos(a));
            end;
        with data[2*j+2] do begin
            a := 2*pi*(j+0.5)/5;
            x := xc + round(0.4*radius*sin(a));
            y := yc - round(0.4*radius*cos(a));
            end;
        end;
    Form1.canvas.polygon(data);
end;

procedure TForm1.FormPaint(Sender: TObject);
var j, h,w, r, n: integer; a: double;
begin with canvas do begin
    h := Form1.clientheight;
    w := Form1.clientwidth;
    brush.color := clblue;
    rectangle(0,0,w,h);
    r := (2*h) div 6;
    n := 12;
    {15 EU countries - 1999,
    but flag fixed at 12
    data from EU publicity map 1999}
    brush.color := clyellow;
    for j := 0 to n do begin
        a := 2*pi*j/n;
        drawstar(  w div 2 + round( r * sin(a)),
                   h div 2 + round( r * cos(a)),
                   (4*h) div 100);
        end;{for}
    end; {with}
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   FormPaint(Self);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 //  1 Stern mit 5 Zacken
 drawstar(150,150,150);
end;

olee 25. Okt 2009 15:38

Re: Stern zeichnen mit line to und move to
 
@hathor: Es ist nicht Sinnvoll, einfach eine Lösung in den Raum reinzuwerfen wenn es darum geht, dass er es auch verstehen muss.

Naja wie dem auch sei.

Du hast da wohl einen kleinen Fehler in deiner Schleife

Bisher hast du ja das hier
Delphi-Quellcode:
var
  index,x,xi,yi: integer;
begin
  image1.Canvas.moveto(xm,ym);
  x:=Anzahl_Punkte mod 2;
  for index:=1 to Anzahl_Punkte do
    if x=0 then
    begin
      xi:=trunc (ri*cos(index*winkelstueck));
      yi:=trunc (ri*sin(index*winkelstueck));
      image1.Canvas.LineTo(xi,yi)
    end
    else
    begin
      xi:=trunc (ra*cos(winkelstueck));
      yi:=trunc (ra*sin(winkelstueck));
      image1.Canvas.lineto(xi,yi);
    end;
end;
Nur bleibt für jeden Zacken X = const. D.h. Du hast immer nur gleich lange "Spitzen"

Vllt. solltest du es mit so etwas versuchen

Delphi-Quellcode:
var
  i,xi,yi: integer;
begin
  xi := trunc (ra*cos(0));
  yi := trunc (ra*sin(0));
  image1.Canvas.moveto(xi,yi);

  winkelstueck := 1/Anzahl_Spitzen * ???;

  for i := 0 to Anzahl_Spitzen-1 do
  begin
    // Spitze zeichnen
    xi := trunc (ra*cos(i*winkelstueck)); //Noch falsch
    yi := trunc (ra*sin(i*winkelstueck)); //Noch falsch
    image1.Canvas.LineTo(xi,yi);

    // Gegenstück zur Spitze zeichnen (das ding da was näher am Mittelpunkt liegt xD)
    xi := trunc (ri*cos((i+0.5)*winkelstueck)); //Noch falsch
    yi := trunc (ri*sin((i+0.5)*winkelstueck)); //Noch falsch
    image1.Canvas.lineto(xi,yi);
  end;
end;
Beachte das die Berechnung noch nicht korrigiert ist das musst du noch machen (Mittelpunk mit einbeziehen).

EDIT: Im zweiten code bei der Nicht-Spitze wurde auch noch mit Index multipliziert, was bei dir im unteren Teil deines Codes noch gefehlt hat.

MFG

hathor 25. Okt 2009 15:57

Re: Stern zeichnen mit line to und move to
 
Zitat:

Zitat von olee
@hathor: Es ist nicht Sinnvoll, einfach eine Lösung in den Raum reinzuwerfen wenn es darum geht, dass er es auch verstehen muss...
MFG

Ich denke auch an Suchende, die über "Stern zeichnen" auf diesen Thread geleitet werden.

Du und alle anderen können sich in Zukunft solche Bemerkungen sparen.

olee 25. Okt 2009 15:59

Re: Stern zeichnen mit line to und move to
 
[OT]
Bis jmd. nach so etwas sucht, wird sich hier sicherlich eine Lösung gefunden haben.

Und der Thread-Ersteller wird seine Lösung dann sicherlich posten.
[/OT]

MFG

Jakob Ullmann 25. Okt 2009 17:15

Re: Stern zeichnen mit line to und move to
 
Zitat:

Zitat von hathor
Zitat:

Zitat von olee
@hathor: Es ist nicht Sinnvoll, einfach eine Lösung in den Raum reinzuwerfen wenn es darum geht, dass er es auch verstehen muss...
MFG

Ich denke auch an Suchende, die über "Stern zeichnen" auf diesen Thread geleitet werden.

Du und alle anderen können sich in Zukunft solche Bemerkungen sparen.

Naja, er muss es genauso viel / wenig verstehen wie alle anderen. Sinnvoller wäre es, die Geometrie eines Sternes mal zu erläutern (nehme mal an, das war das Problem), als etwas fertiges zu posten.

http://en.wikipedia.org/wiki/Star_polygon

Zur Konstruktion: Für einen Stern mit n Zacken einfach 2n Punkte nehmen und sie gleichmäßig um einen gewählten Mittelpunkt verteilen, mit abwechselnd hohem und niedrigem Abstand. -> Sinus, Cosinus, ... (hat also gewissermaßen Ähnlichkeiten mit der polaren Darstellung von r=f(t)=sin(n*t)/a+b+1/a)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:16 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz