dreiecke in bildern programmieren ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kloed
User
Beiträge: 8
Registriert: Sonntag 29. April 2012, 22:12

Weiß jemand, wie ich zum Beispiel die Staatsflagge von den Bahamas programmieren kann ? Ich habe da nämlich so meine Probleme mit dem erstellen eines Dreiecks.
Müsste man nicht eine while- oder for-Schleife verwenden ? Oder hat es irgendwas mit dem Satz des Pythagoras zu tun ? Bitte helft mir weiter ! :K
danke im voraus :)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Wie sieht denn dein bisheriger Code aus?

Sebastian

Und da jetzt eh schon alle an den selben Thread denken, hier der Link. Edit: Und wie konnte ich das vergessen?!
Zuletzt geändert von EyDu am Sonntag 29. April 2012, 22:52, insgesamt 2-mal geändert.
Das Leben ist wie ein Tennisball.
kloed
User
Beiträge: 8
Registriert: Sonntag 29. April 2012, 22:12

ich würde mal sagen, es ist noch kein richtiger code vorhanden,
ich überlege die ganze zeit das irgendwie hinzubekommen, aber ich komme einfach nicht auf die richtige Lösung.
Das Blid bzw. die Flagge soll das ppm Format haben und 80*50 Pixel groß sein. -ich dachte ich kann das irgendwie mit einer while- oder for-schleife hinbekommen, aber ich weiß nicht genau, wie ich das am günstigsten programmieren soll. :?: :(
BlackJack

@kloed: Wie sieht denn Dein *grundsätzliches* Vorgehen aus? Erzeugst Du die Pixel der Reihe nach wie sie im PPM-Format geschrieben werden? Oder legst Du eine Datenstruktur im Speicher an, in der Du wahlfrei auf Pixel zugreifen kannst? Hast Du schon Quelltext der ein einfacheres Bild erzeugt, zum Beispiel ein Einfarbiges oder Eines mit Streifen?
kloed
User
Beiträge: 8
Registriert: Sonntag 29. April 2012, 22:12

hier mal ein beispiel eines gestreiften bildes, wie bekomme ich da ein dreieck rein ? :K

hier ist die python datei :

Code: Alles auswählen

#Dateikopf des Bildes
def kopf():
    print "P1"
    print "#bild3a.pbm"
    print "30 20"
#Zeile Schwarz
def zeile_s():
    for i in range(30):
        print "1 ",
#Zeile Weiß
def zeile_w():
    for i in range(30):
        print "0 ",

#Codierung des Bildes
def code1():
    for i in range(10):
        zeile_s()
        print

def code2():
    for i in range(10):
        zeile_w()
        print

#Zusammenbau des Bildes
def bild():
    kopf()
    code1()
    code2()

#Hauptprogramm
bild()
Zuletzt geändert von Anonymous am Montag 30. April 2012, 18:46, insgesamt 1-mal geändert.
Grund: Syntax-Hervorhebung aktiviert
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Die Programm-Ausgabe sieht weniger nach Pixeln aus. Skizziere doch mal auf einem Blatt Papier ein solches Dreieck aus einzelnen "Punkten" und zähl mal nach wie viele Zeichen pro Zeile vorhanden sind. Vielleicht fällt dir ja eine Regelmäßigkeit auf, die du dann in einem einfachen Algorithmus umsetzen kannst.
lunar

@kloed: Bitte verwende in Zukunft Python-Tags, um den Quelltext hervorzuheben, und die Einrückung zu bewahren. Einrückung ist in Python wichtig, und ohne korrekte Einrückung ist Dein Quelltext nicht zu verstehen.
kloed
User
Beiträge: 8
Registriert: Sonntag 29. April 2012, 22:12

ich habe es gerade mal folgender maßen probiert, aber irgendwie kommt da nichts außer zwei striche raus :(

Code: Alles auswählen

#Dateikopf des Bildes
def kopf():
    print "P1"
    print "#dreieckflagge.pbm"
    print "80 50"
#Dreieck
def dreieck():
    x=1
    y=79
    while x<=27:
        print y*("1")
        print x*("0")
        x=x+1
        y=y-1

def drei():
    a=27
    b=53
    while a<=1:
        print a*("1")
        print b*("0")
        a=a-1
        b=b+1


#Zusammenbau des Bildes
def bild():
    kopf()
    dreieck()
    drei()
    

#Hauptprogramm
bild()


  
BlackJack

@kloed: Nimm Dir Kästchenpapier und mal Dir das einfach mal für ein kleines Beispiel auf. Beispielsweise für 10×5 Kästchen mit 1en und 0en darin. Dann schreibst Du Dir die Spaltennummern darüber und Zeilennummern davor. Damit fängst Du bei 0 wie das bei `xrange()` ja auch der Fall ist. Danach überlegst Du Dir wie die Anzahl der 1en und 0en in einer Zeile mathematisch mit der Nummer der Zeile zusammenhängt. Und schon kannst Du in einer Schleife — und dafür nimmst Du bitte eine ``for``-Schleife — die Zeilen anhand der Zeilennummer erzeugen. Wenn Du mit Mathe nicht so klar kommst, kannst Du auch die obere und die untere Hälfte der Flagge in zwei getrennten Schleifen erzeugen, dann wird es einfacher.
kloed
User
Beiträge: 8
Registriert: Sonntag 29. April 2012, 22:12

@BlackJack-könntest du mir vielleicht mal so eine for-schleife aufzeigen ? :)
BlackJack

@kloed: Äh, Du hast doch etwas weiter oben selber welche im Quelltext gezeigt.
kloed
User
Beiträge: 8
Registriert: Sonntag 29. April 2012, 22:12

spezifisch auf das thema, meinte ich. :)
man hat ja parktisch die erste zeile mit einem schwarzen pixel und 79 weißen,
mein problem ist, dass ich nicht weiß, wie ich es mit der for-schleife so programmiere, dass die anzahl von schwarzen pixeln zu- und die von den weißen abnimmt.
nur so kann ja ein dreieck entstehen.
BlackJack

@kloed: Spezifisch zum Thema bleibt der Teil der Schleife gleich. Wobei Du bei Deinen Schleifen `i` nie genutzt hast. Dir ist schon klar an welchen Wert der Name zwischen ``for`` und ``in`` in jedem Schleifendurchlauf gebunden ist? Falls nicht, probiert das einfach mal aus in dem Du ihn Dir innerhalb einer Schleife ausgeben lässt. Mit dem Wert musst Du in jeder Zeile Rechnen. Es gibt drei Grössen: Anzahl der Pixel in einer Zeile (`w`). Anzahl der schwarzen Pixel (`b`). Anzahl der weissen Pixel (`w`). Ein Wert davon ist fest und zwei Variabel. Und alle drei müssen eine Gleichung der Form `a = b + c` erfüllen. Jetzt musst Du nur noch heraus finden was in der Gleichung der fest vorgegebene Wert ist und wie man die beiden anderen aus diesem Wert und der Laufvariablen der ``for``-Schleife berechnen kann. Schon hättest Du ein halbes Dreieck. Wenn Du das hast, ist die andere Hälfte nicht mehr so schwer. Dann bleibt nur noch das man keine weissen Pixel nach den schwarzen haben möchte, sondern je nach Zeile Aquamarin oder Gold. Was man da jeweils haben möchte kann man auch über die Schleifenvariable bestimmen.

Die etwas allgemeinere Variante für so etwas ist es übrigens zwei verschachtelte Schleifen zu schreiben (oder eine mit `itertools.product()`) um in der innersten Schleife die Koordinaten für jeden Punkt zu haben und anhand der Koordinaten zu bestimmen welche Farbe der Punkt haben soll.

Du solltest auf jeden Fall ein paar Konstanten definieren und davon abgeleitete Zahlen berechnen und nicht über all magische Zahlen im Quelltext stehen haben. Schau Dir mal Deinen Quelltext für ein Streifen-Bild an und ändere das mal auf ein 80 mal 30 Bild. Da müsstest Du über das ganze Programm verteilt Zahlen ändern. Und nicht nur einfach 30 und 20 ersetzen, sondern auch die 10er, die ja eigentlich aus der Höhe des Bildes abgeleitet sind. So etwas ist fehleranfällig und unübersichtlich.
kloed
User
Beiträge: 8
Registriert: Sonntag 29. April 2012, 22:12

so, jetzt habe ich was ;)
als ich noch keine fraben eingesetzt habe und es nur mit schwarz und weiß gemacht habe, hat es noch funktioniert, aber jetzt ist da was falsch nur was ? :/

Code: Alles auswählen

#Dateikopf des Bildes
def kopf():
    print "P3"
    print "#tschechien_katharina.ppm"
    print "80 50"
    print "255"
#Dreieck
def zeile_o():
    a="58 95 205 "
    b="0 "
    k=1
    f=79
    while k<=27 and f>=53:
        print k*a+f*b
        k=k+1
        f=f-1
def zeile_u():
    a="58 95 205 "
    b="205 0 0 "
    k=27
    f=53
    while k>=1 and f<=79:
        print k*a+f*b
        k=k-1
        f=f+1

#Zusammenbau des Bildes
def bild():
    kopf()
    zeile_o()
    zeile_u()
    

#Hauptprogramm
bild()
BlackJack

@kloed: `b` dürfte falsch sein. Oder Du müsstest den Wert von `f` ändern beziehungsweise in der Berechnung noch einen Faktor einbauen.
kloed
User
Beiträge: 8
Registriert: Sonntag 29. April 2012, 22:12

danke schön ! :)

ich habe es jetzt endlich hinbekommen juhuuu!
BlackJack

@kloed: Glückwunsch! :-)

Ich hatte das zwischenzeitlich mal in Forth implementiert:

Code: Alles auswählen

\ Flag of the Bahamas as PPM.

800 constant width
width 2/  constant height

: black ( -- ) ." 0 0 0" ;
: aquamarine ( -- ) ." 102 205 170" ;
: gold ( -- ) ." 255 215 0" ;

: main ( -- )
    ." P3 " width . height . ." 255" cr
    height 6 /  height 2/
    height 0 ?do
        width 0 ?do
            dup j - abs         \ distance to horziontal middle
            2dup -  dup 2/ +  i >=
                if black
                else dup 3 pick <=  if gold else aquamarine then
                then space drop
        loop cr
    loop 2drop ;

main
bye
Die Breite des Dreiecks stimmt nicht ganz weil ich es einfach/ganzzahlig belassen wollte.
Antworten