Best Of Algorithen



  • sampler schrieb:

    Dem kann ich zustimmen. Der REINE KERN eines Raytracers ist in der Tat simpel.

    Darum geht es bei einem Algorithmus. Wie komplex du es implementierst hat dann wohl kaum noch mit der Definition zu tun.

    Aber in einem echten Raytracer (eben etwas, das wirklich gute Bilder erzeugt) steckt beliebig komplexe Mathematik (alleine an unserer cg Fakultät gibt es aktuell 2 Doktorarbeiten).

    Hat weniger mit Mathematik zu tun, die ist Simpel. Strahl verfolgen, mittels Schnittpunkten, Reflektionen und Refraktionen und adequatem Blenden.
    Mehr ist da wirklich nicht, Optimierungen sind nur obligatorisch.

    Mich hat einfach rapsos wiederholt arrogante Art genervt.

    Hat er mehr gesagt als ?:

    raytracer
    einfache idee, einefache implementierung und ohne cheaten recht langsam.

    Bist du vielleicht nur ein wenig eingeschossen?



  • @sampler :
    Ich glaube Justso meinte mit vermischen, daß sich Begriffe wie 'echt', 'wirklich' und 'gut' nicht in einem Algorithmus erfassen lassen.



  • Wenn auf den expliziten Hinweis, wie viel Hirn in einem Raytracer stecken kann:

    Wenn man einen echten Raytracer mit Beschleunigungsstrukturen, komplexen Beleuchtungssystem (nicht nur Mirror Reflection ) , Softshadows, Kaustiken, Nebel, Refraktion etc. haben will, wird es recht fix sehr komplex.

    so eine Antwort kommt:

    naja, vielleicht ist es ja auch fuer dich wirklich schwer sowas zu implementieren

    dann ist das pure Arroganz im Sinne: ist doch alles trivial. Sowas progg ICH (der große tolle Rapso) jedes Wochenende. Hätte er vernünftig geantwort a la "dann haben wir wohl unterschiedliche Auffassungen von Raytracern", wäre es ja ok gewesen. Aber in seiner infantilen Arroganz muss er natürlich gleich die Troll-Keule auspacken. 🙄

    @Justso: Wie ich bereits geschrieben habe: die Mathematik ist beliebig komplex. Offenbar hast du noch keinen größeren geschrieben. Sonst wüsstest du, wie komplex Dinge wie Radiance Transfer Estimate, Scattering oder Sampling sein können.



  • Zum einem hast du behauptet, dass thork keine Ahnung hat, weil er andrer Meinung ist als du. Zum anderen zittierst Rapsos Text somit ohne den Zusammenhang und bist zudem Gast, dass nicht ohne Grund. Regel das ausserhalb vom Forum, statt hier wegen ihm alle als unwissend abzustempeln.

    Nacht



  • raytracing kann ich mir auch nich soo kompliziert vorstellen, bisschen ne ahnung in physikalischer Optik, Geometrie etc.

    Das Problem ist ehr die Kunst , den Algorithmus so zu optimieren um viel performance rauszuholen..



  • rapso schrieb:

    denn wie du sagtest, reicht schulwissen um sowas zu implementieren (nicht umsonst schreiben soviele leute dann auch nen raytracer).

    Das habe ich nicht gesagt. Ich habe von Hochschulwissen geredet. Ich habe mich zwar bisher nur mit Raycasting beschäftigt, da habe ich aber schon diverse Dinge aus meinen Mathematikvorlesungen angewendet. Speziell aus der Linearen Algebra. Wenn ich so in meinen alten Code gucke, dann frage ich mich doch wirklich, ob Du zum Beispiel Basistransformationen in der Schule hattest. Ich sage nicht, dass man entsprechendes mathematisches Wissen unbedingt benötigt, aber es hilft doch sehr, wenn man in diesem Bereich Algorithmen implementieren möchte. Wenn man entsprechendes Wissen hat, dann wird es einem nicht so schwer fallen, so einen Algorithmus zu implementieren. Und man wird dabei auch relativ eleganten Code produzieren können. Aus Sicht eines Schulkinds stellt so ein Algorithmus hingegen sicherlich eine wirkliche Herausforderung dar.

    ...zur allgemeinen Belustigung kommt hier mal ein bischen Code aus dem Umfeld meines Raycasters. Es ist nicht der Raycaster selbst, sondern eine Methode, um den Blickwinkel zu ändern. 🙂

    public synchronized void rotate(final double horizontalAngle, final double verticalAngle)
       {
          final Matrix baseMatrix = new Matrix(new double[3][3]);
          for (int y = 0 ; y < 3 ; ++y)
          {
            baseMatrix.setComponent(0, y, rightDirection.getComponent(y));
            baseMatrix.setComponent(1, y, upDirection.getComponent(y));
            baseMatrix.setComponent(2, y, direction.getComponent(y));
          }
          final Matrix inverse = baseMatrix.createInvertedMatrix();
          final Matrix rotationMatrix = 
             LinearAlgebraMethods.createRotationMatrix(verticalAngle, horizontalAngle, 0);
          final Matrix functionMatrix = baseMatrix.mulBack(rotationMatrix).mulBack(inverse);
          rightDirection = functionMatrix.mulBack(new Vector(rightDirection));
          upDirection = functionMatrix.mulBack(new Vector(upDirection));
          direction = functionMatrix.mulBack(new Vector(direction));
       }
    

    Was meinst Du, wie ein Schulkind so eine Methode schreiben würde? Ähnlich? Und wie lange würde es für diese Methode brauchen? Ich glaube, das Schulkind würde sich da etwas schwer tun. Für einen Studenten mit entsprechendem Hintergrundwissen ist es hingegen nur ein kleines Problem, so einen Code innerhalb kurzer Zeit in den Rechner reinzurotzen. 😉



  • Gregor schrieb:

    rapso schrieb:

    denn wie du sagtest, reicht schulwissen um sowas zu implementieren (nicht umsonst schreiben soviele leute dann auch nen raytracer).

    Das habe ich nicht gesagt. Ich habe von Hochschulwissen geredet.

    hm, naja, ich hatte sowas in der 12ten klasse in einer klausur, schattierung eines pyramide, dafuer auch schnittpunktberechnungen vom blickfeld mit der ebene auf der sie stand und dann ob dieser punkt richtung sonne die pyramide schneidet, wobei, wenn ich mich recht erinnere, die sichtstrahlen vorgegeben waren. (nur 3strahlen oder so)

    Ich habe mich zwar bisher nur mit Raycasting beschäftigt, da habe ich aber schon diverse Dinge aus meinen Mathematikvorlesungen angewendet. Speziell aus der Linearen Algebra. Wenn ich so in meinen alten Code gucke, dann frage ich mich doch wirklich, ob Du zum Beispiel Basistransformationen in der Schule hattest. Ich sage nicht, dass man entsprechendes mathematisches Wissen unbedingt benötigt, aber es hilft doch sehr, wenn man in diesem Bereich Algorithmen implementieren möchte.

    wie du schon sagst, braucht man es nicht um Raytracing zu implementieren. die grundidee ist sehr simpel, die grundidee zu implementieren ist dementsprechend auch simpel. was du danach machst, sind optimierungen, in bildqualitaet, laufzeit, flexibilitaet usw. aber sobald du weisst wie man schnittpunkte mit ebene, kugel, kegel etc. berechnet (notfalls mit formelbuch), kannst du es implementieren.

    Wenn man entsprechendes Wissen hat, dann wird es einem nicht so schwer fallen, so einen Algorithmus zu implementieren. Und man wird dabei auch relativ eleganten Code produzieren können. Aus Sicht eines Schulkinds stellt so ein Algorithmus hingegen sicherlich eine wirkliche Herausforderung dar.

    Kommt wohl auf das kind an... darueber koennten wir uns einfach nur streiten ;), wieviele kinder in welchem alter das problem loesen.

    public synchronized void rotate(final double horizontalAngle, final double verticalAngle)
       {
          final Matrix baseMatrix = new Matrix(new double[3][3]);
          for (int y = 0 ; y < 3 ; ++y)
          {
            baseMatrix.setComponent(0, y, rightDirection.getComponent(y));
            baseMatrix.setComponent(1, y, upDirection.getComponent(y));
            baseMatrix.setComponent(2, y, direction.getComponent(y));
          }
          final Matrix inverse = baseMatrix.createInvertedMatrix();
          final Matrix rotationMatrix = 
             LinearAlgebraMethods.createRotationMatrix(verticalAngle, horizontalAngle, 0);
          final Matrix functionMatrix = baseMatrix.mulBack(rotationMatrix).mulBack(inverse);
          rightDirection = functionMatrix.mulBack(new Vector(rightDirection));
          upDirection = functionMatrix.mulBack(new Vector(upDirection));
          direction = functionMatrix.mulBack(new Vector(direction));
       }
    

    Was meinst Du, wie ein Schulkind so eine Methode schreiben würde? Ähnlich? Und wie lange würde es für diese Methode brauchen? Ich glaube, das Schulkind würde sich da etwas schwer tun.

    ich kann dir sagen wie ich meinen ersten raytracer schrieb, ich hab mir je einen start und einen endwinkel for horizontal und vertikal errechnet, bin die dann in schritten von einem pixel abgelaufen (mit cos+sin kann man den strahl erzeugen) und hab meine schnittpunkte errechnet. alles ohne eine einzige matrixberechnung. schnittpunkte hab ich uebrigens auch nur durch naehrung in vielen iterationen errechnet (also in gleich grossen schritten bis die erste kugel Radius>pytagoras(kugelcentrum,strahlpunkt) war), weil mir damals in der 9ten klasse keine mathematisch sinnvolle loesung einfiel (jedenfalls glaub ich dass es 9te war als wir cos und sin hatten). btw. das war in basic und eh sterbens langsam, aber wenn man morgens aufstand und dann der ultraschnelle 386DX ein bild anzeigte, war der tag gerettet 😃
    wie ich schattierte sag ich euch lieber nicht, das ist noch peinlicher und hat laenger gerechnet als das ultralangsame raytracing 😞

    Für einen Studenten mit entsprechendem Hintergrundwissen ist es hingegen nur ein kleines Problem, so einen Code innerhalb kurzer Zeit in den Rechner reinzurotzen. 😉

    ja, aber da ist man ja wieder bei der implementierung. Beim Raytracing algorithmus sagt dir niemand wie du es zu implementieren hast. Die grundidee ist nur dass ein strahl vom Auge in die Scene geworfen wird und man das was er trifft dann als pixel setzt. das kann man auch rekursiv weitermachen. wie du es implementierst ist dann deine sache. Ansonsten wäre ein Binarysearch auch sehr komplex weil es dir kaum ein schulkind implementieren kann.



  • sampler schrieb:

    @Justso: Offenbar hast du noch keinen größeren geschrieben. Sonst wüsstest du...

    sampler schrieb:

    dann ist das pure Arroganz im Sinne: Sowas progg ICH ...

    ..."du kannst das unmöglich schon gemacht haben, denn ICH studiere".

    Es wirkt auch von dir sehr arrogant jedem anderen Vorzuwerfen er hätte es wohl noch nicht programmiert und deswegen keine Ahnung, nur weil er deine Meinung nicht teilt. Zu glauben Justso, rapso, Jester und thordk wären dazu unfähig, obwohl du niemanden von Ihnen kennst 🙄

    Justso schrieb:

    ...und bist zudem Gast...

    ...sprach der Gast.



  • Aus Sicht eines "Hobbyprogrammierers" (im Sinne des Programmierens als Hobby, ich schreibe keine Hobbies):

    Der beste Algorithmus ist der, den man nicht braucht.

    Grüße... Heiko



  • bwbg schrieb:

    Der beste Algorithmus ist der, den man nicht braucht.

    du meinst sowas wie

    while(vec.NotSorted())
    {
      swap(vec[rand()%vec.size()],vec[rand()%vec.size()]);
    }
    

    ? 🤡



  • Habt ihr auch so ein bisschen das Gefühl, dass rapso von TGGC gelernt hat? Aber er _ist_ es noch nicht.



  • RealFake schrieb:

    Habt ihr auch so ein bisschen das Gefühl, dass rapso von TGGC gelernt hat? Aber er _ist_ es noch nicht.

    hehe, hab ich mir wirklich auch schon gedacht. die signatur, die immer bißchen arrogante art. wenn spieleprogrammierer alle so enden, bin ich froh, dass die branche so unattraktiv ist^^



  • Wozu als Gast? Als ob nicht jeder wüste welcher kleine gekränkte Geist hier dauernd jammert.



  • TR-Detektor schrieb:

    Wozu als Gast? Als ob nicht jeder wüste welcher kleine gekränkte Geist hier dauernd jammert.

    Im Moment jammerst du 🕶



  • inze schrieb:

    TR-Detektor schrieb:

    Wozu als Gast? Als ob nicht jeder wüste welcher kleine gekränkte Geist hier dauernd jammert.

    Im Moment jammerst du 🕶

    nein duu 🕶 🕶



  • anderes Kind schrieb:

    inze schrieb:

    TR-Detektor schrieb:

    Wozu als Gast? Als ob nicht jeder wüste welcher kleine gekränkte Geist hier dauernd jammert.

    Im Moment jammerst du 🕶

    nein duu 🕶 🕶

    dädädä, selber!111


Anmelden zum Antworten