Sinus und Cosinus Tabelle

Es gibt 41 Antworten in diesem Thema, welches 9.830 mal aufgerufen wurde. Der letzte Beitrag (3. Februar 2009 um 12:33) ist von heptasean.

  • So, ich mir eben mal ein Program in Purebasic geschrieben, welches mir diese Tabellen für Sinus und Cosinus als Textdatei angefertigt hat, so wie sie abgedruckt sind, tolle Sache. Ich habe den Wert mal 1000 genommen, damit die genaugigkeit hoch ist.

    Nun eine Frage an den Fachman, wie kann man diese Tabelle verkürzen und wie sieht dann der Code aus für ein ganzen Kreis von 0-360 Grad.

    Also bitte , kürzt mir die Tabelle und setzt mir dafür ein Code, der die Kürtzung ersetzt damit ich eine Kreis von 360 Grad zeichnen kann.

    Wenn ich jetzt die Floatsinuswerte * 1024 nehmen würde, müsste doch nachher die Teilung einfach durch eine Bitverschiebung schneller sein, oder? x=sinus[179]*100 zb und dann x Teilen durch eine Bitverschiebung(1024)?



    Wer sich für das Purebasicprogramm interessiert:

    5 Mal editiert, zuletzt von schnucke (31. Januar 2009 um 22:42)

  • Sind das die richtigen Werte, ich hatte sin(radiant)/cos(radiant) genommen.
    Kann das einer mal nachprüfen , ob diese Werte rauskommen , wenn ich den Sinuswert bzw Cosinuswert x 1000 nehme?

    Irgendwie wird der Kreis nicht rund sondern...

    mfg

  • Sieht ziemlich sinusartig aus. Der Cosinus ist übrigens nur eine Verschiebung des Sinus. Und die zweite Halbwelle des Sinus ist nur das Vorzeichen umgekehrt. Aber wenn Du genug Speicher hast, kannst Du auch diese Tabellen abspeichern.

    edit: Hab jetzt erst Deinen Screenshot gesehen. Sieht sehr hübsch aus. Besser als ein richtiger Kreis. In diesem Fall vergiss meinen ersten Absatz, dann: Erst zum Laufen kriegen, dann optimieren /edit

    Der Kreis-Bresenham (oder wie das Ding hieß) hat Dir nicht gefallen?

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

  • Die letzten und die ersten Werte der beiden Tabellen sind sich ziemlich ähnlich, das spricht dafür, dass es ein Vollkreis ist. Der maximale (Co-)Sinuswert * 1000 sollte =1000 sein. In der ersten Tabelle gehn die Werte nur bis 999, evtl. ein Rundungsfehler?

  • Der Kreis-Bresenham (oder wie das Ding hieß) hat Dir nicht gefallen?

    Ich muss jetzt erstmal den Sinus/Cosinus verstehen.

    Dann geht es weiter.

    Aber der Kreis oben klappt noch nicht.

    mfg

  • >Ich muss jetzt erstmal den Sinus/Cosinus verstehen.

    Das sind einfach nur die Längenverhältnisse von Gegenkathete/Ankathete zur Hypotenuse im rechtwinkligen Dreieck. Was das mit Kreisen zu tun hat: Bitte melde dich an, um diesen Link zu sehen.

  • Haut etwas mit den Longwerten vom cc65 nicht hin : static int32_t xx; static int32_t yy; ?

    mfg

  • Cosinus ist die Ankathete (x-Achsen-Abschnitt) des (Einheits-)Kreispunktes, Sinus die Gegenkathete, also y.
    Tausche mal Deine x-/y-Zuweisung.

  • Nun eine Frage an den Fachman, wie kann man diese Tabelle verkürzen


    sin(x) = -sin(x+Pi) = cos(x-Pi/2) = cos(Pi/2-x) = -cos(x+Pi/2) = sin(x+2*Pi) = cos(x+1.5*Pi)

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Bitte melde dich an, um diesen Link zu sehen.

    LIFE IS SHORT - Break the rules, do more, need less, smile often, be brave, stay true, dream big, forgive quickley, kiss slowly, love truly, laugh uncontrollably and never regret anything that made you smile.

  • Warum ensteht bei mir oben kein Kreis, sondern so ein Gebilde?

    mfg

  • Ich wollte gerade fragen, ob's jetzt klappt. Momentan habe ich keine Zeit, aber später (mittag?) schaue ich's mir mal genauer an, Wenn Du's bis dahin schon herausgefunden hast, schreib's bitte gleich hier.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

  • Bitte melde dich an, um diesen Link zu sehen.

    Schau daa uch mal.

    Ich musste die Sinuswerte in der Tabelle als 32bit definieren, dann war der Multiplizierte Wert richtig.
    Man kann also in der 32bitergebnisvariable auch nur 32bitwerte multiplizieren etc. sonst kommen falsche Werte raus.

    static const int sinus[360] = { musste ich auf >>>> const int32_t sinus[360] setzen.


    Jetzt muss ich irgendwie nur noch den Speicher vom Plus4 hochsetzen mit der cfg.

    Auf dem c64 läuft jetzt die Kreisplotroutine mit den Werten aus der Tabelle mit hochgesetztem Speicher.

    mfg

  • Wie kann man jetzt die Tabelle von Draco nutzen im cc65 oder als Sys-Aufruf?
    Verstehe die Wertübergabe nicht und die Wertrückgabe.

    mfg

  • Du kannst die Werte auch casten:

    Code
    xx=60*(long)sinus[x];
    yy=60*(long)cosinus[x];

    Ansonsten: Warum Werte * 1000? Warum * 60? Besser wären doch 1024 und 64, da man dann shiften anstatt multiplizieren kann.

    Die Tabellen sind auch unschön gerundet. Ich würde da eher int(((sin(x)+1)*1024)+0.5)-1024 machen.

  • Du kannst die Werte auch casten:

    Code
    xx=60*(long)sinus[x];
    yy=60*(long)cosinus[x];


    60L statt 60 zu schreiben geht auch.

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.


  • 60L statt 60 zu schreiben geht auch.


    (long) hat aber den Vorteil, dass man eine Konstante wie 64 einfach ersetzen kann:

    Code
    xx=((long)sinus[x]) << 6;
    yy=((long)cosinus[x]) << 6;
  • Es geht mir jetzt nicht ums Runden und Casten, das ist erst mal nebensache, mir geht darum, den Speicher vom Plus4 mit der cfg für den cc65 hochsetzen. Dann gehe ich an die nächste Runde.


    Das mit 1024, 64 kommt auch Später, kann man mit Bitverschiebung arbeiten.

    Was soll ich mit scheiss long in der Sinustabelle, wenn ich die nicht brauche, mir nur den Speicher wegfressen aber vom cc65 erzwungen für die Multiplication..scheissdreck :roll2:


    mfg

    Einmal editiert, zuletzt von schnucke (1. Februar 2009 um 15:12)

  • Es geht mir jetzt nicht ums Runden und Casten, das ist erst mal nebensache, mir geht darum, den Speicher vom Plus4 mit der cfg für den cc65 hochsetzen. Dann gehe ich an die nächste Runde.


    Das mit 1024, 64 kommt auch Später, kann man mit Bitverschiebung arbeiten.

    Was soll ich mit scheiss long in der Sinustabelle, wenn ich die nicht brauche, mir nur den Speicher wegfressen aber vom cc65 erzwungen für die Multiplication..scheissdreck :roll2:


    Deswegen ja casten.

  • Die Tabellen sind auch unschön gerundet. Ich würde da eher int(((sin(x)+1)*1024)+0.5)-1024 machen.

    Ich war froh das ich ein Basicprogramm geschrieben habe mit Purebasic , das mir erst mal eine Tabelle als Text rausbrachte, wie ich sie im cc65 brauche.

    Das mit dem runden geht mir erst mal "hinten vorbei..".

    Und den Kreis den ich schon mit dem c64 Plotten kann, sieht rund aus und hat keine Verzahnungen an den Kanten, das zeigt auch schon, das die Werte richtig liegen.


    mfg

    Einmal editiert, zuletzt von schnucke (1. Februar 2009 um 15:31)