Rysowanie gwiazdy

0

witam
mam taki problem potrzebuje narysowac w delphi gwiazde n- ramienna
Dane wejsciowe:
n= 3..10
R=30..240
r=5..150
r<R

Prosil bym chociaŻ o podpowiedzi gdyz zaczynam dopiero programowanie w delphi ;)
pozdrawiam

0

To jest kod do pascala ..wystarczy żebyś to trochę przerobił żeby działało w Delphi;

procedure gwiazda(n,x,y,r1,r2:integer);
var
x1,y1,x2,y2,i:integer;
a:real;
begin
for i:=0 to n do
begin
a:=(i)*360/n -90 ;
x1:=trunc(cos(a*pi/180)*r1)+x;
y1:=trunc(sin(a*pi/180)*r1)+y;
a:=(i+0.5)*360/n-90 ;
x2:=trunc(cos(a*pi/180)*r2)+x;
y2:=trunc(sin(a*pi/180)*r2)+y;
line(x1,y1,x2,y2);
a:=(i+1)*360/n-90 ;
x1:=trunc(cos(a*pi/180)*r1)+x;
y1:=trunc(sin(a*pi/180)*r1)+y;
line(x1,y1,x2,y2);
end;
end;

i np. :

gwiazda(5,100,100,40,15);
0

ooo to juz cos :) wielkie dzieki powinienem sobie z tym poradzic ;) pozdro ;)

0
procedure Gwiazda(Canvas:TCanvas; X:integer; Y:integer; N:byte; Rmax:word; Rmin:word);
var i:integer;
    ang:double;
begin
if (N<2) or (Rmin>Rmax) then exit;
Canvas.MoveTo(X, Y-Rmax);
ang:=PI/N;
i:=0;
while (i<=N*2) do
  begin
  Canvas.LineTo(Round(sin(i*ang)*Rmax)+X, -Round(cos(i*ang)*Rmax)+Y );
  inc(i);
  Canvas.LineTo(Round(sin(i*ang)*Rmin)+X, -Round(cos(i*ang)*Rmin)+Y );
  inc(i);
  end
end;

Dodałem jeszcze parametry: Canvas - powierzchnia, po której rysujesz, X oraz Y środka.

0

jednak nie moge sobie z tym poradzic na przetlumaczenie tego na jezyk delphi moze dlatego ze nigdy tego jezyka nieuzywalem :/ mogl by ktos choc mnie naprowadzic na dobra droge ? ;) pozdrawiam

0

Może funkcja z opisami Ci bardziej pomoże:
(Na podstawie funkcji Szczawika)

procedure Gwiazda(const Canvas: TCanvas; const X, Y:integer; const N:byte; const Rmax, Rmin:word);
{
-- opis przekazywanych zmiennych --
   Canvas - Canvas obiektu, na który chcemy nanieść gwiazdę
   x - odległość środka gwiazdy od lewej krawędzi Canvasa
   y - odległość środka gwiazdy od górnej krawędzi Canvasa
   n - ilość ramion
   Rmax - odległość od środka gwiazdy dalszej części ramiona ( Rmin < Rmax )
   Rmin - odległość od środka gwiazdy bliższej części ramiona ( Rmin < Rmax )

-- zastosowanie --
   Gwiazda(Form1.Canvas,150,150,5,120,50);
}
var
   i:integer;
   ang:double;
begin
   if (N<2) or (Rmin>Rmax) then
      exit;

   Canvas.MoveTo(X, Y-Rmax);
   ang:=PI/N;
   i:=0;
   while (i<=N*2) do
   begin
      Canvas.LineTo(Round(sin(i*ang)*Rmax)+X, -Round(cos(i*ang)*Rmax)+Y );
      inc(i);
      Canvas.LineTo(Round(sin(i*ang)*Rmin)+X, -Round(cos(i*ang)*Rmin)+Y );
      inc(i);
   end;
end;
0

Na dzien dzisiejszy wyglada u mnie to tak zrozumialem procedure tylko nie wiem czego do niej brakuje. oto caly kod jak by mogl ktos podpowiedziec co gdzie dopisac lub czego zaduzo czy jaki obiekt dostawic. domyslam sie ze musze gdzies wstawic pola gdzie bedzie użytkownik wpisywal potrzebne dane ale nie wiem jak to zrobic po raz pierwszy mam doczynienia z delphi ... :(

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
procedure Gwiazda(const Canvas: TCanvas; const X, Y:integer; const N:byte; const Rmax, Rmin:word);
var
i:integer;
ang:double;
begin
if (N<2) or (Rmin>Rmax) then
exit;

Canvas.MoveTo(X, Y-Rmax);
ang:=PI/N;
i:=0;
while (i<=N2) do
begin
Canvas.LineTo(Round(sin(i
ang)Rmax)+X, -Round(cos(iang)Rmax)+Y );
inc(i);
Canvas.LineTo(Round(sin(i
ang)Rmin)+X, -Round(cos(iang)*Rmin)+Y );
inc(i);
end;
end;
Gwiazda(Form1.Canvas,150,150,5,120,50);

end.

0

zapomnialem dodac ze nic sie nie rysuje po wcisnieciu guzika rysuj ;p moze zle wywoluje procedure ?

0

to moze na poczatek uproszcze zadanie. Jak bedzie wygladal program ktory bedzie rysowal gwiazde np. 6 ramienna ... to zadanie przerasta moje sily :/

0

to moze na poczatek uproszcze zadanie. Jak bedzie wygladal program ktory bedzie rysowal gwiazde np. 6 ramienna ... to zadanie przerasta moje sily :/

0

Od kiedy przestali wydawać tą serię książek "... dla opornych" to na forum zaczęły się pojawiać bardzo zabawne pytania... :(

0

a jak ma dzialac jak w evencie onclick buttona nie dales nic..mozesz se tak klikac do usranej smierci wystarczylo pomyslec i zamienic 2 rzeczy ale poco...

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}



procedure Gwiazda(const Canvas: TCanvas; const X, Y:integer; const N:byte; const Rmax, Rmin:word);
var
   i:integer;
   ang:double;
begin
   if (N<2) or (Rmin>Rmax) then
      exit;

   Canvas.MoveTo(X, Y-Rmax);
   ang:=PI/N;
   i:=0;
   while (i<=N*2) do
   begin
      Canvas.LineTo(Round(sin(i*ang)*Rmax)+X, -Round(cos(i*ang)*Rmax)+Y );
      inc(i);
      Canvas.LineTo(Round(sin(i*ang)*Rmin)+X, -Round(cos(i*ang)*Rmin)+Y );
      inc(i);
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Gwiazda(Form1.Canvas,150,150,5,120,50);
end;

end.
0

x

1 użytkowników online, w tym zalogowanych: 0, gości: 1