|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
stef
Anmeldungsdatum: 13.01.2005 Beiträge: 102
|
Verfasst am: 05.07.2008, 10:20 Titel: Dreieck ausfüllen |
|
|
Hallo Leute. Ich hoffe ihr könnt mir bei einem Geometrieproblem helfen. Das Programm an dem ich gerade arbeite muss ausgefüllte Dreiecke zeichnen können. Der Einfachheit halber mache ich das zur Zeit auf dem Bildschirm. Das eigentlich Programm soll das später in einer BMP-Datei machen. Daher ist der Befehlssatz zum zeichnen eingeschränkt. Es dürfen nur die Befehle PSET und LINE verwendet werden, die mir später auch bei zeichnen in die BMP-Datei zur Verfügung stehen.
Vielleicht hat ja jemand so etwas schon mal programmiert. Oder wenigstens eine Idee wie man am besten so etwas umsetzt.
Hier schon mal das bisherige Programm. Wie ihr seht fehlt der entscheidende Teil in der Funktion „ZeichneDreieck“ noch.
Code: | '=============================================================================
' DREIECK.BAS
' Programm zum zeichnen von ausgefuellten Dreiecken.
'
' Bedienung:
' ESC -> Programm beenden
' Sonstige Taste -> Neues Dreieck zeichnen
'=============================================================================
TYPE Koordinate
x AS LONG
y AS LONG
END TYPE
DECLARE SUB ZeichneDreieck (Ecke1 AS Koordinate, Ecke2 AS Koordinate, Ecke3 AS Koordinate, Farbe AS INTEGER)
DIM Ecke1 AS Koordinate
DIM Ecke2 AS Koordinate
DIM Ecke3 AS Koordinate
DIM Eingabe AS STRING
SCREEN 12
DO
' Altes Dreick loeschen
LINE (0, 0)-(400, 400), 0, BF
' Eckpunkte zufaellig waehlen
Ecke1.x = INT(400 * RND) + 1
Ecke1.y = INT(400 * RND) + 1
Ecke2.x = INT(400 * RND) + 1
Ecke2.y = INT(400 * RND) + 1
Ecke3.x = INT(400 * RND) + 1
Ecke3.y = INT(400 * RND) + 1
CALL ZeichneDreieck(Ecke1, Ecke2, Ecke3, 12)
' Warten auf Benutzereingabe
DO
Eingabe = INKEY$
LOOP UNTIL LEN(Eingabe)
LOOP UNTIL Eingabe = CHR$(27)
'-----------------------------------------------------------------------------
' ZeichneDreieck
' Funktion zum zeichnen eines ausgefuellten Dreiecks
'
' Parameter:
' Ecke1 - Koordinate des ersten Eckpunktes
' Ecke2 - Koordinate des zweiten Eckpunktes
' Ecke3 - Koordinate des dritten Eckpunktes
' Farbe - Farbe des Dreiecks
'-----------------------------------------------------------------------------
SUB ZeichneDreieck (Ecke1 AS Koordinate, Ecke2 AS Koordinate, Ecke3 AS Koordinate, Farbe AS INTEGER)
' Dreieck zeichnen
LINE (Ecke1.x, Ecke1.y)-(Ecke2.x, Ecke2.y), Farbe
LINE (Ecke1.x, Ecke1.y)-(Ecke3.x, Ecke3.y), Farbe
LINE (Ecke2.x, Ecke2.y)-(Ecke3.x, Ecke3.y), Farbe
' Dreieck ausfuellen
' . . .
END SUB |
|
|
Nach oben |
|
|
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 339
|
Verfasst am: 05.07.2008, 11:11 Titel: |
|
|
Ist zwar Blitzbasic, aber du müsstest nur einen Befehl austauschen:
http://www.blitzforum.de/forum/viewtopic.php?t=6316&highlight=dreieck
Der Rect-Befehl zeichnet ein Rechteck ähnliche wie LINE (x, y)-(a, b),,b
Der Unterschied sind aber die Parameter Rect x, y, breite, höhe. Ersetzen kann man das also durch LINE (x, y) - (x + breite, y + höhe), ,b _________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4609 Wohnort: ~/
|
Verfasst am: 05.07.2008, 12:00 Titel: |
|
|
Es sollte eigentlich reichen, den Eckenschwerpunkt des Dreiecks zu berechnen und diesen als Füll-Mittelpunkt zu verwenden.
Code: | screen 18
dim as short x1, y1, x2, y2, x3, y3, x, y
do
cls
' zufaelliges Dreieck erzeugen
x1 = rnd*640 : y1 = rnd*400
x2 = rnd*640 : y2 = rnd*400
x3 = rnd*640 : y3 = rnd*400
line (x1, y1)-(x2, y2)
line -(x3, y3)
line -(x1, y1)
'berechne Eckenschwerpunkt
x = (x1 + x2 + x3) \ 3
y = (y1 + y2 + y3) \ 3
paint (x, y), 15
loop until input(1) = chr(27)
|
(FreeBASIC-Code)
edit: hätte ich vielleicht genauer lesen sollen, dass nur PSET und LINE verwendet werden sollen ... aber du kannst doch (zumindest in FreeBASIC) auf den Bildschirm zeichnen und diesen als BMP abspeichern? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Ferdi
Anmeldungsdatum: 10.03.2007 Beiträge: 284 Wohnort: Berlin
|
Verfasst am: 05.07.2008, 12:13 Titel: |
|
|
Hallo,
die Welt der Probleme ist klein...
Genau das selbe Problem hab ich auch (nur in 3D)
Wie kann ich das Dreieck mit einer Textur (BMP) füllen bzw. Skalieren, sodass es wie 3D aussieht.
Zum Beispiel bei einer Hauswand mit Fenster und sowas?
Viele Grüße und Danke schon im Vorraus
Ferdi _________________ Dieser Post wurde cum grano salis gewürzt! Na dann: Guten Appetit! |
|
Nach oben |
|
|
stef
Anmeldungsdatum: 13.01.2005 Beiträge: 102
|
Verfasst am: 05.07.2008, 12:25 Titel: |
|
|
Erst mal vielen dank. Ich habe doch gewusst, dass irgend jemand das schon mal programmiert haben muss. Das Prinzip ist ja auch recht einfach. Man muss nur mal drauf kommen. Allerdings sollte jemand im Blitzbasic-Form mal darauf aufmerksam machen, dass die Funktion eine Division durch Null erzeugt, wenn zwei Punkte die gleiche x-Koordinate haben.
Hier mal die Qbasic Version der Funktion von mir (Das Hauptprogramm habe ich diesmal weg gelassen):
Code: | '-----------------------------------------------------------------------------
' ZeichneDreieck
' Funktion zum zeichnen eines ausgefuellten Dreiecks
'
' Parameter:
' Ecke1 - Koordinates des ersten Eckpunktes
' Ecke2 - Koordinates des zweiten Eckpunktes
' Ecke3 - Koordinates des dritten Eckpunktes
' Farbe - Farbe des Dreiecks
'-----------------------------------------------------------------------------
SUB ZeichneDreieck (Ecke1 AS Koordinate, Ecke2 AS Koordinate, Ecke3 AS Koordinate, Farbe AS INTEGER)
DIM x AS INTEGER ' Das Dreieck wird von links nach rechts gezeichnet
DIM m1 AS DOUBLE ' Steigung der Geraden von Ecke1 zur Ecke3
DIM t1 AS DOUBLE ' Y-Achsenabschnitt der Geraden von Ecke1 zur Ecke3
DIM y1 AS INTEGER ' y-Koordinate auf der Geraden 1 zur aktuellen x-Koordinate
DIM m2 AS DOUBLE ' Steigung der zweiten Geraden (erst Ecke1-Ecke2, dann Ecke2-Ecke3)
DIM t2 AS DOUBLE ' Y-Achsenabschnitt der zweiten Geraden
DIM y2 AS INTEGER ' y-Koordinate auf der Geraden 2 zur aktuellen x-Koordinate
' Dreieck zeichnen
LINE (Ecke1.x, Ecke1.y)-(Ecke2.x, Ecke2.y), Farbe
LINE (Ecke1.x, Ecke1.y)-(Ecke3.x, Ecke3.y), Farbe
LINE (Ecke2.x, Ecke2.y)-(Ecke3.x, Ecke3.y), Farbe
' Ecken von links nach rechts sortieren
IF Ecke1.x > Ecke2.x THEN SWAP Ecke1, Ecke2
IF Ecke1.x > Ecke3.x THEN SWAP Ecke1, Ecke3
IF Ecke2.x > Ecke3.x THEN SWAP Ecke2, Ecke3
' Dreieck ausfuellen
IF Ecke1.x <> Ecke3.x THEN
' Geradengleichung aufstellen (Von linken Ecke zur rechten Ecke)
m1 = (Ecke3.y - Ecke1.y) / (Ecke3.x - Ecke1.x)
t1 = Ecke1.y - (m1 * Ecke1.x)
IF Ecke1.x <> Ecke2.x THEN
' Geradengleichung aufstellen (Von linken Ecke zur mittleren Ecke)
m2 = (Ecke2.y - Ecke1.y) / (Ecke2.x - Ecke1.x)
t2 = Ecke1.y - (m2 * Ecke1.x)
'Dreieck von der linken zur mittleren Ecke zeichnen
FOR x = Ecke1.x TO Ecke2.x
y1 = m1 * x + t1
y2 = m2 * x + t2
LINE (x, y1)-(x, y2), Farbe
NEXT x
END IF
IF Ecke2.x <> Ecke3.x THEN
' Geradengleichung aufstellen (Von mittleren Ecke zur rechten Ecke)
m2 = (Ecke3.y - Ecke2.y) / (Ecke3.x - Ecke2.x)
t2 = Ecke2.y - (m2 * Ecke2.x)
'Dreieck von der mittleren zur rechten Ecke zeichnen
FOR x = Ecke2.x + 1 TO Ecke3.x
y1 = m1 * x + t1
y2 = m2 * x + t2
LINE (x, y1)-(x, y2), Farbe
NEXT x
END IF
END IF
END SUB |
|
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2510 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 05.07.2008, 18:47 Titel: |
|
|
Das Beispiel
http://www.dreael.ch/Deutsch/Download/Funktionsdarstellung.html
beinhaltet ebenfalls eine derartige Routine. Für Kreisbogen habe ich ähnlich solche Routinen.
BMP in der unkomprimierten Form ist natürlich hervorragend geeignet, da Du eine Pixelzeile an-SEEK-en kannst und dann direkt Pixel hineinschreiben. Dasselbe gilt natürlich auch für meinen VESA-Artikel.
Der Tipp übrigens für beide Arten von virtuellen SCREEN-Generatoren: Ausschliesslich horizontale Line bzw. Rechteck mit Höhe 1 als Grundprimitv nehmen, da sowohl beim .BMP-File als auch bei VESA PRINT#/PUT-mässig bzw. POKE-mässig die Bytes hintereinanderliegen, was gegenüber irgendwelchem PSET oder gar vertikaler Linie viel bessere Performance gibt. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Ferdi
Anmeldungsdatum: 10.03.2007 Beiträge: 284 Wohnort: Berlin
|
Verfasst am: 06.07.2008, 16:19 Titel: |
|
|
Puh ganz schön komplizierte Matrie...
Gibt es dazu irgendein Tut (für Texturen)??
_________________ Dieser Post wurde cum grano salis gewürzt! Na dann: Guten Appetit! |
|
Nach oben |
|
|
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 06.07.2008, 16:53 Titel: |
|
|
Meine Güte, lern doch einfach Freebasic und openGL oder DirectX! |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 06.07.2008, 17:53 Titel: |
|
|
wenn du wirklich ein 3d-spiel mit texturen in QB programmieren willst, wirst du sowieso nicht um EMS- und XMS-Speicher drumherum kommen, und den unter der ist unter windows XP standardmäßig deaktiviert... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
Ferdi
Anmeldungsdatum: 10.03.2007 Beiträge: 284 Wohnort: Berlin
|
Verfasst am: 09.07.2008, 16:07 Titel: |
|
|
Dann kann man doch ne .PIF - Datei erstellen, inder das Aktiviert wird...
_________________ Dieser Post wurde cum grano salis gewürzt! Na dann: Guten Appetit! |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 09.07.2008, 16:30 Titel: |
|
|
ja siehste mal wie kompliziert das ist... und das muss dann JEDER machen, der das programm benutzen will. Bei einer richtigen FB-Anwedung, die nativ unter windows (auch windows 64bit) läuft und zudem noch schneller ist, hat man keine probleme... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
Ferdi
Anmeldungsdatum: 10.03.2007 Beiträge: 284 Wohnort: Berlin
|
Verfasst am: 10.07.2008, 15:39 Titel: |
|
|
Jojo hat Folgendes geschrieben: | ja siehste mal wie kompliziert das ist... und das muss dann JEDER machen, der das programm benutzen will. Bei einer richtigen FB-Anwedung, die nativ unter windows (auch windows 64bit) läuft und zudem noch schneller ist, hat man keine probleme... |
Nein ich kann doch ne .PIF Datei erstellen und dazulegen... _________________ Dieser Post wurde cum grano salis gewürzt! Na dann: Guten Appetit! |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 10.07.2008, 23:18 Titel: |
|
|
PIF-Dateien erfordern vollständige Pfadangaben. Somit läuft die PIF nur auf deinem Rechner oder alle müssen das Programm im selben Verzeichnis ablegen (diese Zeiten sind VORBEI!). Allein schon das herausfinden des aktuellen verzeichnisses (für das erstellen einer PIF-Datei unter QB) ist unheimlich kompliziert, in FB würde dazu eine Zeile reichen... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
Ferdi
Anmeldungsdatum: 10.03.2007 Beiträge: 284 Wohnort: Berlin
|
Verfasst am: 15.08.2008, 22:24 Titel: |
|
|
na schön...
On Topic:
Gibts zum Thema 3D Texturen ein gutes (deutsches) Tut für:
*QuickBasic
*QuickC 2.5
?? _________________ Dieser Post wurde cum grano salis gewürzt! Na dann: Guten Appetit! |
|
Nach oben |
|
|
darkinsanity aka sts
Anmeldungsdatum: 01.11.2006 Beiträge: 456
|
Verfasst am: 16.08.2008, 14:22 Titel: |
|
|
hi, tutorials kenne ich zwar nicht, aber es gibt Libraries die dir diese Arbeit abnehmen: UGL, DirectQB, FutureLib, ak-lib
Zu finden unter: qbasic.de->download->libraries
texturierte Dreiecke kriegt man auf jeden fall mit der FutureLib hin, aber der Nachteil ist die Geschwindigkeit. UGL hat bei mir nur im modus 320x240x8 funktioniert. die ak-lib scheint da am besten zu sein.
28398 hat Folgendes geschrieben: | Meine Güte, lern doch einfach Freebasic und openGL oder DirectX! |
würde ich auch empfehlen. wenn du fb & OpenGL nutzt, hast du zusätzlich den Vorteil das deine Programme auch unter Linux verwendbar sind. |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 16.08.2008, 15:01 Titel: |
|
|
was kümmert das einen stolzen vista-user? _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
darkinsanity aka sts
Anmeldungsdatum: 01.11.2006 Beiträge: 456
|
Verfasst am: 16.08.2008, 15:35 Titel: |
|
|
stolzer Vista User? *juckreiz krieg*
wie kann man darauf nur stolz sein |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 16.08.2008, 15:40 Titel: |
|
|
keine ahnung, aber schau dir doch einfach seine beiträge an _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
Ferdi
Anmeldungsdatum: 10.03.2007 Beiträge: 284 Wohnort: Berlin
|
Verfasst am: 16.08.2008, 18:52 Titel: |
|
|
Thanx!
Also ich bin stolz auf Vista _________________ Dieser Post wurde cum grano salis gewürzt! Na dann: Guten Appetit! |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 16.08.2008, 19:18 Titel: |
|
|
hast du das jetzt wirklich als lob aufgefasst? O_o _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|