zeichnen aber exakt



  • Erstmal Hallo

    Ich will mit dem Borland C++ Builder 5 eine Anwendung schreiben.
    Diese sollte eine Zeichenfläche haben. In dieser Zeichenfläche soll mein Programm also zeichenen können. Zum Beispiel soll in dieser Fläche ein Kreis gezeichnet werden, der ausgefüllt ist, von dem natürlich auch Position und Radius bekannt sind.
    Jetzt zu meinem Problem es kann sein das der Radius des Kreises sehr klein ist also zum Beispiel 10^-3 m (oder noch kliener). Das heißt es kann sein das der Kreis garnicht mehr auf dem Monitor angezeigt werden kann (da er halt zu klein ist). Aber wenn ich jetzt 1000 solche kleinen Kreise nebeneinander zeichnen lasse wären sie ja wieder sichtbar. Wie schaffe ich das?

    Ich stelle mir irgendwie vor ein Bild mit einer sehr hohen Auflösung im Speicher zu erzeugen in dieses zeichen und dieses dann in eine niedrigere Auflösung umwandeln und auf dem Bildschrim ausgeben.

    Die Antworten bitte möglichst einfach halten da ich noch blutiger Anfänger im programmieren bin. 🙂

    Vielen Dank im Vorraus



  • ktc_supermario,

    ktc_supermario schrieb:

    Die Antworten bitte möglichst einfach halten da ich noch blutiger Anfänger im programmieren bin.

    wenn Du 1000 Kreise nebeneinander zeichnest, haben diese zwar eine Art sichtbare Breite, jedoch immer noch keine Höhe.
    Ich bin kein Grafik-Experte, vermute aber, daß es auf Deine Frage keine einfachen Antworten gibt. Die logischen (geometrischen) Daten müssen halt jedesmal beim Zeichnen in eine Pixel-Darstellung umgerechnet werden (rendern) und ich bezweifle stark, daß das ein triviales Problem ist.
    Wenn Du ein spezielles Problem zu lösen hast, gibt es dafür bestimmt Grafik-Bibliotheken. Wenn Dich die Theorie selbst interessiert, mußt Du Zeit in die einschlägige Literatur investieren.
    Auf jeden Fall aber hat das alles nicht unmittelbar etwas mit den CBuilder zu tun.



  • Ich werde den Verdacht nicht los, u willst sowas wie ein CAD- Proggy machen. Das solltest Du lieber lassen, wenn Du 'blutiger Anfaenger' bist!

    Sonst:

    Du speicherst von jedem Objekt die Kenndaten (Mitte + Radius bei Kreis, ...) in einer Liste

    zum Darstellen definierst Du einen 'geeigneten' ZOOM- Faktor, dergestalt, dass Deine Objekte am Bildschirm / Auf DruckerCanvas in geeigneter/ gewuenschter Groesse abgebildet werden.

    beim Zeichnen in Dein Canvas (Image/ Printer ...) multiplizierst Du alle Geometriewerte (Positionen und Abmessungen) mit dem Zoomfaktor und malst.

    Bei geeignetem Wert erscheinen die Kreise in brauchbarer Groesse, ev. auch mit Fuellung, sonst nur als Punkt!!!

    Wenn Du viele ZUUUUUU kleine Kreise nebeneinander machst mommt aber KEINE brauchbare Darstellung heraus, So ist nun mal die Geometrie!

    PS: Falls das mit dem CAD stimmt, dann schau Dir das mal mit z.B. AutoCAD an, da kannste die moeglichen Effekte testen!



  • Also zuersteinmal meinet ich mit nebeneinander nicht das sie nur in einer Reihe nebeneinander liegen sondern rechts und links und oben und unten(also irgendwie).

    Die alternativ Methode von dir "DerAltenburger" habe ich schon versucht nur das dies sehr schnell ungenau wird.

    Ich würde mir also eher eine Vektorgrafik vorstellen (Vielleicht ist das ja auch ein "CAD" Programm ich kenn das nämlich nicht). Die also ganz exakt ist und dann in eine Pixelgrafik umgewandelt wird um sie dann auf den Bildschirm auszugeben.



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum Borland C++ Builder (VCL/CLX) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ktc_supermario schrieb:

    Die alternativ Methode von dir "DerAltenburger" habe ich schon versucht nur das dies sehr schnell ungenau wird.

    Ich würde mir also eher eine Vektorgrafik vorstellen ...

    Da haste mich aber nicht verstanden! Geanau so macht das ne Vektorgraphik!

    Wenn das 'UNGENAU' wird, dann haste falsch berechnet!

    Du solltest Dir Deine Geometrie wirklich mal mit nem CAD Programm anschauen, bei verschiedenen Darstellungsgroessen!

    Eine Ungenauigkeit laesst sich da aber auch NIE vermeiden, nur minimieren:
    Zur Darstellung am Monitor/ Plotter muss die Aufloesung des Ausgebekanals hoch genug sein. Sonst wird alles 'eckig' bzw. ungenau!

    PS: WICHTIG! Berechnungen darfst Du immer nur mit den gespeicherten Daten vornehmen, NIEMALS mit Anzeige- Pixel- Koordinaten!!!
    Anderenfalls wirds vielleich nicht mal ein Malprogramm!



  • Ich würde sagen: Stichwort Anti-Aliasing



  • Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Rund um die Programmierung in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.





  • Also ich hatte dich (DerAltenburger) wirklich falsch verstanden.

    Ich hatte es aber auch so ähnlich gemacht wie du gesagt hast. Ich hatte die Kenndaten in einer Liste gespeichert nur das ich dann in einer Pixelgrafik gezeichnet habe. Dies führte dann wieder zur Ungenauigkeit. (Es wäre nett wenn mir jemand ein gutes CAD Programm für diese Aufgabe nennen könnte)

    Jetzt nochmal um die Problematik klarzumachen.

    Es kann sein das ein Kreis zehnmal so klein ist wie ein Pixel auf dem Monitor.
    Wenn jetzt nun nur ein ausgefüllter Kreis (schwarz) in einem Pixel ligt soll dieser Pixel auf dem Monitor weiß dargestellt werden (Hintergrund weiß).
    Wenn jetzt aber 10 solche kleinen Kreise in einem Pixel (oder halb oder ein Stückchen halt) sind soll dieser dann schwarz sein. Also wenn mehr als die hälfte in einem Pixel schwarz ist soll er schwarz sein und bei weiß natürlich weiß.(nur für diese zwei Farben)
    Diese Berechnung soll aber nicht einfach nur mit einem Bild im Speicher, das einfach eine höhere Auflösung hat, gemacht werden da dies bei noch kleineren Kreisen wieder zum selben Problem führt.
    (entgegen meiner Vermutung im Anfangstext)

    Lieb wäre mir ein Tutorial oder eine Homepage etc. die dieses Thema behandelt.


  • Mod

    naja, ich würde das 2 wegen zur lösung sehen.

    1. du zeichnest ein viel höcher auflösendse bild mit den pixeldaten voll und skalierst es runter.

    2. du berechnest pro pixel wieviel fläche von ihm mit deiner zeichnung bedeckt wird und gibst ihm dann halt derart viel von der farbe.

    probleme bei 1 wären, dass du sehr hoch auflösende bilder im hintergrund erzeugen müßtest, unter umständen müßtest du pro pixel ein vielleicht 1024*1024 großes bild zeichnen um deine qualitätsansprüche zu befriedigen.

    probleme bei 2 wären, dass du nicht nur berechnen müßtest wieviel fläche von einer zeichnung auf einen pixel fällt, sondern auch wieviel von dieser zeichnung wirklich auf den pixel fällt und wieviel nur die alte zeichnung überdeckt. denn 100striche mit 1% deckung eines pixels könnten in nur 1% deckung resultieren.

    deswegen wäre wohl das mit der höcheren auflösung in der du zeichnest und dann runterrechnest auf die normale auflösung wohl das besten, soweit ich das sehe. da gibt es natürlich noch weitere optimierungen die du dann machen kannst. z.b. nur die pixel in höcherer auflösung berechnen auf denen kanten der objekte sind bzw auch deren nachbarpixel.

    rapso->greets();


Log in to reply