AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Tagarray

Ein Thema von EWeiss · begonnen am 24. Dez 2017 · letzter Beitrag vom 30. Dez 2017
Antwort Antwort
Delphi.Narium

Registriert seit: 27. Nov 2017
2.555 Beiträge
 
Delphi 7 Professional
 
#1

AW: Tagarray

  Alt 24. Dez 2017, 12:52
Kannst Du uns bitte mal die Definition der Arrays zeigen und eventuell ein paar Beispielwerte? Momentan ist mir das noch zu abstrakt um eine genaue Vorstellung davon zu haben, was genau gemacht werden soll.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Tagarray

  Alt 24. Dez 2017, 16:20
Kannst Du uns bitte mal die Definition der Arrays zeigen und eventuell ein paar Beispielwerte? Momentan ist mir das noch zu abstrakt um eine genaue Vorstellung davon zu haben, was genau gemacht werden soll.
Delphi-Quellcode:
zorder: Array[1..10]
faceorder: Array[1..10]
Das Array zorder ist gefüllt mit den wert der Positionen der einzelnen Icons.
Delphi-Quellcode:
procedure DrawCarousel(WinHandle: HWND);
var
  K: Integer;
  Angle: single;
  rc: TRect;
  fl: single;
  speed: Integer;
  xcenter, ycenter, zcenter: Single;
  radius: Single;
  anglePi: Single;
  scale, z: Single;
  x, y: Single;
begin
    if bAnimate then
    begin
       y := trbY.GetTrackValue(trbY.Handle);
       speed := trbSpeed.GetTrackValue(trbSpeed.Handle) div 4;
       fl := trbFocallength.GetTrackValue(trbFocallength.Handle) / 100;

       if fl < 0.02 then
         fl := 0.001;
       PiDiv180 := 1.74532925199433E-2;

       GetClientRect(HSprCtrl, rc);
       xcenter :=(rc.Right - 128) / 2;
       ycenter :=(rc.Bottom - 128) / 2;
       zcenter := ycenter / 2;
       radius := rc.Right / 3.675;

       for K := ID_MAX_SPRITE downto 1 do
       begin
         Angle := gSpriteData[K].rAngle;
         anglePi := Angle * PiDiv180;
         z := sin(anglePi) * radius + zcenter;
         scale := fl / (fl + z);
         x := cos(anglePi) * radius;
         gSpriteData[K].xPos := round(x * scale + xcenter);
         gSpriteData[K].yPos := round(y * scale + ycenter - y);

         zorder[K] := round(Angle - 90);
         if zorder[K] > 180 then
           zorder[K] := 360 - zorder[K];

         faceorder[K] := K;

         if bMoveToLeft then
         begin
           Angle := Angle - speed;
           if Angle < 1 then
             Angle := 360
         end else
         begin
           Angle := Angle + speed;
           if Angle > 359 then
             Angle := Angle - 360;
         end;
         gSpriteData[K].rAngle := round(Angle);

         // Skalierungsfaktor berechnen
         if Check3Ddepth.GetCheckButtonStatus(Check3Ddepth.Handle) then
           gSprCtrl.GD_SetObjectScale(gSpriteData[K].ID, (ABS(zorder[K]) MOD 182) * 0.0027777 + 0.5)
         else
         gSprCtrl.GD_SetObjectScale(gSpriteData[K].ID, 1);

         // Alpha Kanal unschalten
         if CheckOpacity.GetCheckButtonStatus(CheckOpacity.Handle) and (fl > 0.999) then
               gSprCtrl.GD_SetObjectAlpha(gSpriteData[K].ID, round(MIN(100 * scale, 255)), false)
         else
         gSprCtrl.GD_SetObjectAlpha(gSpriteData[K].ID, 255, false);

         gSprCtrl.GD_SetObjectXY(gSpriteData[K].ID, gSpriteData[K].xPos, gSpriteData[K].yPos);

         if CheckSelfRotation.GetCheckButtonStatus(CheckSelfRotation.Handle) then
           gSprCtrl.GD_SetObjectAngle(gSpriteData[K].ID, round(gSpriteData[K].rAngle))
         else
         gSprCtrl.GD_SetObjectAngle(gSpriteData[K].ID, 0);
       end;

       // müsste hier das Array sortieren ...
       // ARRAY SORT zorder(), TAGARRAY faceorder()

       // Sprite ZOrder setzen
       K := faceorder[1];
       if bMoveToLeft then
       begin
         inc(K);
         if K > ID_MAX_SPRITE then
           K := 1;
       end;

       gSprCtrl.GD_SetObjectZorder(gSpriteData[K].ID, GD_ORDER_BOTTOM);
       gSprCtrl.GD_SetObjectZorder(gSpriteData[faceorder[ID_MAX_SPRITE]].ID, GD_ORDER_TOP);

       if CheckMarquee.GetCheckButtonStatus(CheckMarquee.Handle) then
         DrawMarquee(rc.Right);

       gSprCtrl.GI_UpdateWindow(HSprCtrl, false);
    end;
end;
Wie man hier sehen kann ist das total durcheinander.

gruss

Geändert von EWeiss (11. Jul 2019 um 15:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Tagarray

  Alt 24. Dez 2017, 16:26
Ich würde statt eines Arrays die gute alte doppel verpointerte Liste nehmen.
z.B.
Delphi-Quellcode:
type
  pMyrecord=^tMyrecord;
  tMyrecord : record
                next,last : pMyrecord;
                Name : string;
                Wert : integer;
              end;

var
  firstrec,
  lastrec,
  actrec : pMyrecord;

...
  if actrecord^.Name>actrecord^.nextrecord^.Name then Tausche(actrecord);
Ist nur ein grobes Beispiel, da fehlt z.B. die Prüfung auf NIL.

Oder gleich eine (Object)Liste, die bekommt eine Sortierfunktion oder 2 oder 3... und fertig ist die Laube.

Gruß
K-H

Bitte nicht schlagen, ich bin extrem konservativ.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (24. Dez 2017 um 16:36 Uhr) Grund: falsche Syntax
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Tagarray

  Alt 24. Dez 2017, 16:28
Ich würde statt eines Arrays die gute alte doppel verpointerte Liste nehmen.
Oder gleich eine (Object)Liste, die bekommt eine Sortierfunktion oder 2 oder 3... und fertig ist die Laube.

Gruß
K-H

Bitte nicht schlagen, ich bin extrem konservativ.
Entschuldige weis jetzt nicht was du meinst.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Tagarray

  Alt 24. Dez 2017, 16:38
Na Pointerlisten sind doch aus der Hexenküche der alten Säcke!

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.555 Beiträge
 
Delphi 7 Professional
 
#6

AW: Tagarray

  Alt 24. Dez 2017, 16:45
Keine Ahnung, ob ich mich jetzt blamiere

Nur mal so 'ne hingedaddelte Idee (ungetestet, nicht kompiliert, nur so mal eben hingehauen )
Delphi-Quellcode:
procedure BubbleSort(var zorder: array of Integer; var faceorder: array of Integer);
var
  i : Integer;
  tempZ : Integer;
  tempFace : Integer;
  done : Boolean;
begin
  repeat
    done := True;
    for i := Low(zorder) to High(zorder) - 1 do
    begin
      if zorder[i] > zorder[i + 1] then
      begin
        tempZ := zorder[i];
        tempFace := faceorder[i];
        zorder[i] := zorder[i + 1];
        faceorder[i] := faceorder[i + 1];
        zorder[i + 1] := tempZ;
        faceorder[i + 1] := tempFace;
        done := False;
      end;
    end;
  until done;
end;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Tagarray

  Alt 24. Dez 2017, 16:56
Danke

Daran habe ich auch schon gedacht wusste aber nicht nach welchen Kriterien ich sortieren soll.
Fehler gibt es keinen nur sichtbare die ZOrder ist immer noch durcheinander.
Hmmm.. vielleicht liegt es an meiner DLL muss das nochmal gegen prüfen.

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Tagarray

  Alt 25. Dez 2017, 08:09
Irgendwie ist die Sortierung noch nicht in Ordnung.
Mit dem Bubblesort geht es nicht auch nicht nach meiner Änderung.

Delphi-Quellcode:
procedure BubbleSort(var zorder: array of Integer; var faceorder: array of Integer);
var
   i : Integer;
   tempZ : Integer;
   tempFace : Integer;
   done : Boolean;
begin
   repeat
     done := True;
     for i := 10 downto 1 do
     begin
       if zorder[i] > zorder[i + 1] then
       begin
         tempZ := zorder[i];
         tempFace := faceorder[i];
         zorder[i] := zorder[i + 1];
         faceorder[i] := faceorder[i + 1];
         zorder[i + 1] := tempZ;
         faceorder[i + 1] := tempFace;
         done := False;
       end;
     end;
   until done;
end;
Es drehen sich alle im Kreis aber der Visuelle Effekt ist der einer Schlange.
Das letzte Icon ist das grüne Index 10 die anderen setzen sich jetzt alle dahinter.

Bubblesort macht eigentlich nichts, wenn ich sie nicht verwende habe ich das gleiche verhalten.

gruss

Geändert von EWeiss (11. Jul 2019 um 15:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Tagarray

  Alt 25. Dez 2017, 09:55
So auf den ersten Blick scheint das grundsätzlich in Ordnung zu sein. Aber
for i := 10 downto 1 do ist nicht so optimal

for i := length(zorder)-1 downto 0 do wäre wohl besser (oder das high/low Gespann).

Und wenn sich nichts tut, liegen die Daten vllt. schon sortiert vor?

Gruß
K-H

P.S.
Schöne Feiertage wünsch ich Dir.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:12 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