Autor Beitrag
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Mi 07.11.07 19:54 
Zitat:
Ich weiß zwar nich aus welchem BuLand du kommst, aber bei mir in BaWü wurde erst in der 10. Klasse vor den ZKs die Trigonometrie behandelt ...


komm aus NRW und bin noch die generation die keine ZKs erlebt hat ^^
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mi 07.11.07 20:40 
Klar bewegt sich dein Bild nur nach rechts. Wenn es sich im Kreis bewegen soll sieht das ganze dann doch noch ein bisschen anders aus.
Wenn du dir einen Kreis anschaust, dann besteht der ja im Grunde aus einer Reihe von Punkten die so dich gesetzt sind das sie wie eine Linie wirken.
Wenn du nun einen virtuellen Punkt (deine Erde) auf dieser Punktkette wandern lassen willst musst du sie jedes mal auf einen neuen Punkt setzen!

Funktionen hattest du doch aber schon in der Schule? Sowas wie y = x+2 oder y = x^2+x?

Hier geht es ja um nichts anderes, nämlich um die Kreisfunktion. Die stellt aber eben keine gerade Linie oder Parabel dar, sondern eigentlich eine Sinuswelle - oder eben einen Kreis.

Das produziert eine Sinuswelle:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  l,x,y: integer;

for l := 0 to 360 do
begin
  x := l;
  y := Round(Sin(DegToRad(l))*100); // die 100 ist die ausdehnung der welle
end;


Und das wird ein Kreis.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  l,x,y: integer;

for l := 0 to 360 do
begin
  x := Round(Cos(DegToRad(l))*100); // die 100 ist der radius des kreises
  y := Round(Sin(DegToRad(l))*100); // die 100 ist der radius des kreises
end;

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
-Nala- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62



BeitragVerfasst: So 11.11.07 00:26 
also.. ich hab jetzt mal deine sachen ausprobiert.. allerdings verschwindet das image (bei der unten angegebenen unit) immer kurz nach rechts unten und erscheint dann wieder. Letztendlich ist er dann ganz verschwunden...

hier die unit:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  l,x,y: integer;
  begin
  for l := 0 to 360 do
begin
x:=l;
x := Round(Cos(DegToRad(l))*100);
y := Round(Sin(DegToRad(l))*100);
image1.Top:=image1.top+y;
image1.left:=image1.left+x;
end;
end;
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: So 11.11.07 00:39 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  l,x,y: integer;
begin
  for l := 0 to 360 do  // Was meinst Du, warum du nur ein Flimmern wahrnimmst? ;-)
   begin
     x:=l;  // Wofür setzt Du X jedes mal wieder auf Eins?
     
     x := Round(Cos(DegToRad(l))*100);  // Radius 100 ist schon groß :-)
     y := Round(Sin(DegToRad(l))*100);

     image1.Top:=image1.top+y;
     image1.left:=image1.left+x;
   end;
end;

Ich würde "L" mit Hilfe des Timers und nicht mit einer For-Schleife hochzählen lassen.
Irgendwie sowas:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
  l,x,y: integer;
begin
 if (l >= 360then l := 0;

 inc(l,10);

      x := Round(Cos(DegToRad(l))*10);
      y := Round(Sin(DegToRad(l))*10);

      image1.Top:=image1.top+x;
      image1.left:=image1.left+y;
end;


grüße,
Marc
-Nala- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62



BeitragVerfasst: So 11.11.07 00:50 
so... ich habe genau das verwendet was du geschrieben hast... trotzdem bewegt sich das image schief nach unten rechts... ich hab keine ahnung warum...
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: So 11.11.07 09:01 
Hier ein nette Demo die langsam zeigt wie ein Kreis berechnet und gezeichnet wird. Sinus und Cosinus liefern mit ihren Y Werten die Daten für den Kreis.

Für die Demo braucht man ein leeres Formular und ein Button (Button1). Auf dem Formular werden einige Diagramme gezeichnet. Mit dem Sleep Wert (unten) kann man die Demo schneller und langsamer ablaufen lassen.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
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
      //alte Xor-Linen löschen
      XorLine(Canvas, 0, sinXorY, ClipRect.Right, sinXorY);
      XorLine(Canvas, cosXorX, 0, cosXorX, ClipRect.Bottom);


      //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}

_________________
Popov
Andiäääh
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 04.02.09 21:25 
Hallo zusammen,

ich habe ein ähnliches Problem, ich möchte ein Image im Kreis fliegen lassen. Habe alle hier aufgeführten Codes ausprobiert, aber bei mir bewegt sich das Image entweder nur in eine Richtung oder es bewegt sich nur einmal und bleibt dann stehen.

Mein Code sieht momentan so aus:

procedure TForm1.Timer1Timer(Sender: TObject);
var
l,x,y: integer;
begin
if l>=360 then l:=0;
inc(l,1);
x := Round(Cos(DegToRad(l))*100);
y := Round(Sin(DegToRad(l))*100);
Image1.Left:=Image1.Left+x;
Image1.Top:=Image1.Top+y;
end;


Ich finde den Fehler einfach nicht. Wäre für Hilfe sehr dankbar :)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 04.02.09 21:38 
Hallo und :welcome: im Forum! ;-)

Das liegt daran, dass l hier eine lokale Variable ist. Die hat bei dem nächsten Aufruf der Methode Timer1Timer nicht mehr den vorherigen Wert.

Entweder deklarierst du die global oder du benutzt die Tag-Eigenschaft des Images zur Speicherung der aktuellen Position (Image1.Tag).
Andiäääh
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 04.02.09 22:09 
:) ES TUT!

ich könnt dich Knutschen, hab so ewig rumprobiert ;)
Lazarusboy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Mo 14.03.11 20:22 
Wie muss man denn die Variable deklarieren?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 14.03.11 21:04 
Am besten unter private im Formular und am besten natürlich mit einem aussagekräftigen Namen.
Lazarusboy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Mo 14.03.11 21:33 
Wie würde das aussehen, bin grade am probieren, verstehe aber grade nicht wie ich genau das machen soll.-)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 14.03.11 22:56 
Wie meinst du das? :gruebel:
ausblenden Delphi-Quelltext
1:
2:
3:
TMyForm = class(TForm)
private
  MyTest: Integer;