 |
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 |
Jan

Anmeldungsdatum: 04.01.2005 Beiträge: 74
|
Verfasst am: 15.05.2005, 21:55 Titel: Dreieck füllen |
|
|
mal ne ganz simple Frage:
wie kann ich ein Dreieck füllen?
mit PAINT hab ich schon ausprobiert, aber das klappt irgendwie nicht. |
|
Nach oben |
|
 |
Devilkevin aka Kerstin

Anmeldungsdatum: 11.11.2004 Beiträge: 2532 Wohnort: nähe Mannheim
|
Verfasst am: 15.05.2005, 22:14 Titel: |
|
|
Warum klapt PAINT nicht ?
Code: |
PAINT (x,y), Ausfüllfarbe, bis Randfarbe
|
Müsste doch gehn! XY sind dei Krodinaten, die Ausfüllfarbe is klar und Randfarbe bedeutet das bis diese Farbe ereicht ist ausgefüllt werden soll. Ist das Dreieck also Balu ist die Rand farbe auch Blau (also 1). _________________ www.piratenpartei.de |
|
Nach oben |
|
 |
Leader4
Anmeldungsdatum: 20.01.2005 Beiträge: 99 Wohnort: Leipzig
|
Verfasst am: 15.05.2005, 22:17 Titel: |
|
|
Kennst du schon den Draw-Befehl? Mit ihm ist es u. a. möglich Dreiecke oder x-beliebige Körper auszufüllen.
Syntax: Draw "Anweisung 1 Anweisung 2 [...] Anweisung N"
Beispiel für das Ausfüllen eines Dreiecks
Color 14
Line (200,200)-(100,100)
Line (100,100)-(300,200)
Line (200,200)-(300,200) 'zeichnet das Dreieck
Draw "BM 150,150" ' rückt den Cursor der Draw-Anweisung an
die Position 150, 150. Wichtig: Diese
Koordinaten müssen innerhalb der
auszufüllenden Fläche liegen!
Draw "P 9, 14" ' Befehl zum Ausfüllen des Dreiecks
P = Anweisung zum Ausfüllen
9 = die Farbe, mit der das Dreieck ausgefüllt werden soll, also dunkelblau
14 = die Umrandungsfarbe des Dreiecks, also die Farbe, bis zu der die Figur von innen heraus ausgefüllt werden soll.
Probiers mal aus, wenn ich nicht grad ein paar sntaktische Fehler reingebaut habe, müsstes funzen.  _________________ Ein richtiger Programmierer muss so richtig faul sein und sich den ganzen Tag mit der Frage beschäftigen, wie man mal wieder etwas einfacher machen kann. |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 15.05.2005, 22:18 Titel: |
|
|
Wieso soll das nicht klappen???
Mach die linien vom dreieck in der gleichen farbe wie das nacher auch gefüllt werden soll
Code: |
SCREEN 12
LINE(10,10)-(100,10)
LINE (10,10)-(10,100)
LINE (10,100)-(100,10)
'kann man weglassen
SLEEP
PAINT(15,15)
|
_________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
 |
Jan

Anmeldungsdatum: 04.01.2005 Beiträge: 74
|
Verfasst am: 16.05.2005, 17:45 Titel: |
|
|
Danke.
Habe beim Paint Befehl immer die Randfarbe vergessen, darum wurde immer der ganze Bildschirm bemalt
kann ja mal passieren
Nun könnte ich eine 2. Frage direkt anschließen:
Wie erhalte ich bei einem beliebigen Dreieck die MItte?
bzw. einen Punkt in dem Inneren.
Da gibst doch bestimmt so ne Formel. Bei 90° WInkel weiß ich, dass man mit Satz des Pythagoras das machen könnte. Aber sonst?
Gegeben sind die Punkte p1, p2, p3.
Jeweils mit x,y
z lassen wa erstmal weg |
|
Nach oben |
|
 |
Quark48

Anmeldungsdatum: 16.10.2004 Beiträge: 559 Wohnort: Saltendorf a.d. Naab bzw. Teublitz i.d. Oberpfalz / Bayern
|
Verfasst am: 16.05.2005, 17:52 Titel: |
|
|
Hallo!
Also:
XMitte = Grundline / 2
YMitte = Höhe / 2
/\ <Von der Grundline bis hier ist die Höhe
/ \
/ \
/ \
------- <Grundlinie
Das Text-Dreieck kann ein bisschen verzerrt sein
Die Position an XMitte, YMitte ist dann der Mittelpunkt des Dreiecks. _________________ Grüßle, Stefan
***
Wenn ein Programm auf nem alten Rechner gut läuft, dann läuft´s auf nem neuen erst recht!
Ich habe/hatte keine feste Spange und auch keine Schwester. Der Rest stimmt. Es tut mir leid... :-/ |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 16.05.2005, 18:41 Titel: |
|
|
@Quark:
Das Forum hält folgen von mehr als einem Leerzeichen für Überflüssig, und kürzt sie raus.
Wenn sie trotzdem angezeigt werden sollen, musst du sie als code anzeigen:
Code: |
/\ <Von der Grundline bis hier ist die Höhe
/ \
/ \
/ \
------- <Grundlinie |
Außerdem ein Problem bei der sache: Du gehst dabei davon aus, dass die Grundlinie parallel zur x-achse is.
Die Formel wäre also:
Code: |
'...Code, der die Dreieckskoordinaten x1,y1,x2,y2,x3,y3 ermittelt...
'Mittelpunkt einer Dreiecksseite
tmpX = (x1 + x2) / 2
tmyY = (y1 + y2) / 2
'Mittelpunkt des Dreiecks
MX = (tmpX + x3) / 2
MY = (tmpY + y3) / 2 |
Oder, das ganze als zwei Zeilen ohne Zwischenschritt tmpX/Y:
Code: | MX = ((x1 + x2) / 2 + x3) / 2
MY = ((y1 + y2) / 2 + y3) / 2 |
Ich habe das getestet.
Die errechneten Punkte sind rein optisch nicht gerade die Mitte, liegen aber immer innerhalb des dreiecks. Und das ist ja auch schon alles, was du für PAINT brauchst.
Probleme köntne es geben, wenn die Dreiecke sehr klein sind (Seitenlängen < 5 Pixel)... _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 16.05.2005, 19:17 Titel: |
|
|
Aber der Mittelpunkt eines Dreiecks ist doch der Schnittpunkt der
Winkelhalbierenden, oder irre ich mich jetzt total?
jb |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 16.05.2005, 20:04 Titel: |
|
|
Kommt ganz drauf an...
Der Mittelpunkt des Inkreises ist der Schnittpunkt der Winkelhalbierenden, der MP des Umkreises ist der SP der Seitenhalbierenden. (oder täusche ich mich... )
Den Schnittpunkt der Winkelhalbierenden ermittelst du am besten als Geradenschnittpunkt. Hat aber den nachteil, dass bei der Ermittlung der Steigungen der Error "division by zero" auftreten kann...
Code: | 'x1, y1, ....
m1 = (y1 - y2) / (x1 - x2)
m2 = (y2 - y3) / (x2 - x3)
t1 = m1 * (y1 - x1)
t2 = m2 * (y2 - x2)
xschnit = (t2 - t1) / (m1 - m2)
yschnitt = m1 * xschnitt + t1 |
Wenn du den Inkreis brauchst (oder dem Umkreis...) dann dürfte die Variante wohl die Beste sein, sonst nimmst du lieber die erste, weil diese ziemlich Fehleranfällig ist. Sobalt eine Seite parall. zur x-Achse ist, kanns zur Division durch Null kommen...
Da müsstest dann mit ON ERROR ansetzen, und entsprechende Fehlerbehandler einbauen....
Gesucht ist aber sowiso ein Punkt, der IM Dreieck sein soll, wo genau er da drinnen ist, bleibt doch eigentlich egal
//Anmerkung:
Sieht so aus, als würde das nicht ganz funktionieren... der Gfx-Schnittpunkt ist nicht der errechnete, und ganz abgesehen davon sind die beiden Geraden sowiso keine Winkelhalbierenden... _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
Jan

Anmeldungsdatum: 04.01.2005 Beiträge: 74
|
Verfasst am: 16.05.2005, 20:18 Titel: |
|
|
Kann es sein, das bei der Bibliothek UGL der Befehl PAINT ersetzt wurde, durch irgend einen internen Befehl.
Denn immer kommt beim AUfruf mit PAINT ein Fehler. |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 16.05.2005, 20:40 Titel: |
|
|
Die meisten GFX-Lib's verwenden eigene Grafikbefehle. Im Falle von UGL ist das sogar notwendig, da diese LIB den Grafikspeicher anders verwaltet als QB; nur so ist es überhaupt möglich, höhere Auflösungen als 640x480 zu erreichen.
Die Andere Frage ist, ob die LIB einen solchen Befehl überhaupt mitbringt; PAINT ist nicht sehr leicht zu implementieren...
Am besten, du schaust dir einfach mal die Dokumentation an, da wirst du sicher was finden.
Ich habe mich mit den verschiedenen LIBs nicht besonders auseinander gesetzt, und weiß nicht welche LIB welche Funktionen bringt... UGL hat aber einen recht guten Ruf (soweit ich weiß), und wird wahrscheinlich schon einen PAINT-Befehl mitbringen.
Wenn du aber nur die höhere Bildschirmauflösung brauchst, und evtl die höheren Farbtiefen, kann ich dir nur zu freeBASIC raten.
BMP-Loader sind schnell zu schreiben, und wenns komplexer werden soll, kannst du ohne Probleme auf DLLs zurückgreifen, z.B. freeImage (=>google).
Mit ein bisschen Glück findest du eine DLL, die in etwa den Befehlssatz der UGL-Lib hat, und dir so die kleinen, so zeitaufwändigen Aufgaben abnimmt
Generell kann ich freeBASIC nur empfehlen. Es ist schneller und auf mehr Systemen kompatibel, trotzdem musst du dich nicht besonders umstellen; der Befehlssatz und die Syntax von FB ist fast die selbe wie die von QB. _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 17.05.2005, 22:44 Titel: Mittelpunkt Dreieck für PAINT |
|
|
Grundsätzlich ist es vollkommen korrekt, dass die Lage nicht so stark eine Rolle spielt. Allerdings macht eine Optimierung durchaus Sinn, damit man bei einem extrem flachen Dreieck nicht ein Linienpunkt trifft und so das Dreieck nicht gefüllt wird.
Mein Vorschlag: Verwendung des Schwerpunkts. Geometrisch: Man halbiert Strecke P1P2 (=> Punkt D) und teilt P3D im Verhältnis 2:1. Auf den ersten Blick tönt es recht kompliziert, ergibt aber eine extrem einfache Formel:
xs=(x1+x2+x3)/3
ys=(y1+y2+y3)/3
Die mathematische Herleitung wird hier dem Leser überlassen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
marzec
Anmeldungsdatum: 13.10.2004 Beiträge: 267
|
Verfasst am: 18.05.2005, 02:31 Titel: |
|
|
@ugl + paint: beides zusammen kann zu bösen überraschungen führen. sobald du ugl initialisiert hast solltest du keinen qb eigenen grafikbefehl mehr verwenden. gründe dafür erspar ich mir jetzt... lies die doku zu ugl es bietet mehrer arten von polygon rasterizern, darunter auch für texturierte, gouraud shaded und p-correct textured triangles
@dreieck füllen: dazu werden meist scanline algorthmen verwendet. google nach triangle rasterization, scanline triangle u.Ä. _________________ Yagl - yet another gameprogramming library |
|
Nach oben |
|
 |
Jan

Anmeldungsdatum: 04.01.2005 Beiträge: 74
|
Verfasst am: 18.05.2005, 14:41 Titel: |
|
|
Jo, danke.
Hab jetzt einen Befehl gefunden. uglPolyF
der reicht für den Anfang erstmal.
Ps.: Das Tutorial von dir is echt hammer. Wenn man das gelesen hat, kann man das alles. Voll geil. |
|
Nach oben |
|
 |
Triton

Anmeldungsdatum: 10.09.2004 Beiträge: 155 Wohnort: Berlin
|
|
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.
|
|