Dreieck zeichnen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

StepTiger

Betreff: Dreieck zeichnen

BeitragDo, Nov 02, 2006 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja hallo mal wieder Smile

Hat eventuell jemand einen Lösungsansatz für mich, wie ich eine Funktion ein Dreieck zeichnen lassen kann? Es muss ein gefülltest Dreieck sein, und da liegt mein Problem. Danke Smile
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Goodjee

BeitragDo, Nov 02, 2006 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
also:
erst mal eine kleine skizze:
Code: [AUSKLAPPEN]

1


2      3


das sein mal das dreieck.

1.)rechnes mit winkelfunktionen alle punkte zwischen 2 und 3
2.)linien malen von den punkten nach punkt 1
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

StepTiger

BeitragDo, Nov 02, 2006 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
ich geh davon aus, dass das ungenau und langsam wird, oder irre ich?

*edit*
Probieren geht über Studieren, deshalb:
Code: [AUSKLAPPEN]
;maldreieck
Graphics 800,600,32,2

Local px[3]
Local py[3]

While Not KeyDown(1)
   
   If MouseHit(1)
      px[x]=MouseX()
      py[x]=MouseY()
      x=x+1
   EndIf
   
   c=0
   For y=0 To 2
      If px[y]>0 And py[y]>0 Then c=c+1
   Next
   
   If c=3
      Line px[0],py[0],px[1],py[1]
      Line px[1],py[1],px[2],py[2]
      Line px[2],py[2],px[0],py[0]
      
      wink#=ATan2(px[2]-px[1],py[2]-py[1])
      
      dis#=Sqr((px[1]-px[2])^2+(py[1]-py[2])^2)
      
      For c=0 To dis#
         tx=px[1]+Sin(wink#)*c
         ty=py[1]+Cos(wink#)*c
         Line tx,ty,px[0],py[0]
      Next
   EndIf
   
   Flip
   
Wend

End


exakt das Problem, welches ich meinte ^^
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.
  • Zuletzt bearbeitet von StepTiger am Do, Nov 02, 2006 21:43, insgesamt einmal bearbeitet
 

Dreamora

BeitragDo, Nov 02, 2006 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Alternativen gibt es mit 2D befehlen nicht, ausser es gäbe auch ein Bresenham Dreieck.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

StepTiger

BeitragDo, Nov 02, 2006 23:49
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hätte da schon eine idee:
wie kann man berechnen, ob ein punkt in einem dreieck liegt?
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

BladeRunner

Moderator

BeitragDo, Nov 02, 2006 23:57
Antworten mit Zitat
Benutzer-Profile anzeigen
-Ermittle den Punkt mit der kleinsten y-Koord.
-beachte den Sonderfall dass 2 Punkte die kleinste haben können.
-von dem niedrigsten y ausgehend setze für jedes y das folgt die Werte in die Steigungsgleichung ein und ermittle so das passende x.
-Zeichne eine Linie (per Rect, das ist schneller) von x1,y nach x2,y.
- Beachte hier den Fall dass ein Eckpunkt erreicht wird und Du von da an eine andere Steigungsgleichung benötigst.

-selbstredend ist darauf zu achten dass es bei den Steigungsgleichungen Sonderformen für Achsenparallelen gibt.

Im Gegensatz zu obigem Vorschlag führt dieser hier nicht zu Winkelbedingten Lücken im Dreieck, Er sollte auch schneller sein. Allerdings für Echtzeit wohl eher immer noch unbrauchbar.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

StepTiger

BeitragFr, Nov 03, 2006 0:15
Antworten mit Zitat
Benutzer-Profile anzeigen
irgendwie ist das sehr kompliziert.

Gibts da keinen einfachen satz für?
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

DerHase

BeitragFr, Nov 03, 2006 2:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Kuck mal >>>HIER<<<. Da hat es unten auch nen Link zu einer anderen Dreieck Funktion, bei der musst Du aber die Punkte im Uhrzeigersinn setzen.
Play Satyr!

Goodjee

BeitragFr, Nov 03, 2006 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
eigentlich sollte es nicht ungenau werden...
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

StepTiger

BeitragFr, Nov 03, 2006 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
sieht nicht ungenau aus Wink

Danke Hase
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Triton

BeitragFr, Nov 03, 2006 18:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Wozu haben wir eigentlich ein heimisches Codearchiv?

https://www.blitzforum.de/foru...php?t=6316
Coding: silizium-net.de | Portfolio: Triton.ch.vu

Goodjee

BeitragFr, Nov 03, 2006 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn du statt auf einer seite alle punkte zu berechnen und zu verbinden auf drei seiten nacheinander die punkte berechnest, gehts auch(getestet bei 350*350 dreieck= ...kann meinen code bei gelegenheit auch mal hochladen

Code: [AUSKLAPPEN]
Graphics 400,400
SetBuffer BackBuffer()
Repeat

Cls

x1=200+Cos(y)*180
y1=200+Sin(y)*-180

x2=200+Cos(y+120)*180
y2=200+Sin(y+120)*-180

x3=200+Cos(y+240)*180
y3=200+Sin(y+240)*-180






Line x1,y1,x2,y2
Line x2,y2,x3,y3
Line x3,y3,x1,y1

Text x1,y1,"1"
Text x2,y2,"2"
Text x3,y3,"3"

winkel=ATan2(x2-x1,y2-y1)+90
For i#=1 To Sqr((X2-X3)^2+(Y2-Y3)^2)-1 Step 1
   
   Line x2+Cos(winkel)*i,y2+Sin(winkel)*-i,x3,y3
Next

winkel=ATan2(x3-x2,y3-y2)+90
For i#=1 To Sqr((X2-X3)^2+(Y2-Y3)^2)-1 Step 1
   
   Line x3+Cos(winkel)*i,y3+Sin(winkel)*-i,x1,y1
Next

winkel=ATan2(x1-x3,y1-y3)+90
For i#=1 To Sqr((X2-X3)^2+(Y2-Y3)^2)-1 Step 1
   
   Line x1+Cos(winkel)*i,y1+Sin(winkel)*-i,x2,y2
Next

r=r+1
r=r Mod 255

g=g-2
If g<0 Then g=255+g


b=b+2
b=b Mod 255

Color r,g,b

Text 0,0,r+","+g+","+b

y=y+2
y=y Mod 360
Flip
Until KeyHit(1)
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Triton

BeitragSa, Nov 04, 2006 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn alle Seiten des Dreiecks die Länge 100 haben, zeichnest du aber 300 Linien.
Bei meinem Verfahren dagegen nur 100.

Bei einem größeren Dreieck kommt es zudem zu leeren Flecken.
Coding: silizium-net.de | Portfolio: Triton.ch.vu

Goodjee

BeitragSa, Nov 04, 2006 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
hast ja recht...dafür berechnest du aber pro linie 2 punkte, das macht dann 200 punkte bei dir und 300 bei mir...mist, deins ist wirklcih besser.. Smile Very Happy Smile Laughing
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

StepTiger

BeitragSa, Nov 04, 2006 19:34
Antworten mit Zitat
Benutzer-Profile anzeigen
najo, hab mich eh schon lange entschieden ^^

aber danke soweit Smile
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMo, Nov 06, 2006 0:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mal die "BladeRunner Theorie" umgesetzt
Und es ist schnell....!
Code: [AUSKLAPPEN]
Dim FPS (3)
Graphics 800 ,600
SetBuffer BackBuffer ()

Repeat
    Cls
   
    x1 = 400 + Cos (y) * 180
    y1 = 300 + Sin (y) * 180
   
    x2 = 400 + Cos (y + 120) * 180
    y2 = 300 + Sin (y + 120) * 180
   
    x3 = 400 + Cos (y + 240) * 180
    y3 = 300 + Sin (y + 240) * 180
    y = y + 1
    y = y Mod 360
   
    Fill_Triangle (x1,y1,x2,y2,x3,y3)
   
    Text 10 ,10,FPS (1) : FPS (2) = FPS (2) + 1 : If MilliSecs () > FPS (3) + 999 Then FPS (1) = FPS (2) : FPS (2) = 0 : FPS (3) = MilliSecs ()
   
    Flip 0
Until KeyHit (1)
End


Function Fill_Triangle(x1,y1,x2,y2,x3,y3)
   ;einsortieren der y_koordinate nach Höhe (kleinste zuerst)
   If y1 > y2 Then x= x1 : x1 = x2 : x2 = x: y= y1 : y1 = y2 : y2 = y
   If y2 > y3 Then x= x2 : x2 = x3 : x3 = x: y= y2 : y2 = y3 : y3 = y
   If y1 > y2 Then x= x1 : x1 = x2 : x2 = x: y= y1 : y1 = y2 : y2 = y
   ;fertig sortiert
   Grad_1x2# =ATan2 (y1-y2,x1-x2)
   Grad_1x3# = ATan2 (y1-y3,x1-x3)
   Grad_3x2# = ATan2(y3-y2,x3-x2)
   If y2<>y1 Then
      For i = 0 To y2 - y1 -1
         Lines ((i / Tan (Grad_1x3) ) + x1,y1 + i, ( i / Tan (Grad_1x2) ) + x1)
      Next
   End If
   If y2<>y3 Then
      For i = y2 - y3  To 0
         Lines ((i / Tan (Grad_1x3) ) + x3,y3 + i, (i / Tan (Grad_3x2) ) + x3)
      Next
   End If
End Function

Function Lines (x1,y1,x2)
   If x1 < x2 Then
      Rect x1,y1,x2-x1,1
   Else
      Rect x2,y1,x1-x2,1
   End If
End Function

Triton

BeitragMo, Nov 06, 2006 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir zwischen 400 und 430 FPS.
Nicht schlecht.


Aber nicht so gut wie meins (420-450 FPS) Wink
Coding: silizium-net.de | Portfolio: Triton.ch.vu

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group