Durchgehende Ellipse

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

totonak5

Betreff: Durchgehende Ellipse

BeitragDi, Nov 29, 2005 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!


Ich habe da jetzt schon einige zeit herumprobiert, mit den verschiedensten methoden, aber es kommt nichts dabei heraus!

Nur, wenn in folgendem code der rote punkt links oberhalb von dem des grünen ist, wird eine durchgehende ellipse gezeichnet, sonst nur punkte! wie kann ich das ändern?

Code: [AUSKLAPPEN]
Graphics 640,480
SetBuffer BackBuffer()

.Neu
Cls
SeedRnd MilliSecs()
XV = 0 : YV = 0

X = Rand(640)
Y = Rand(480)

EndeX = Rand(640)
EndeY = Rand(480)

T# = ATan2((EndeY - Y), (EndeX - X))

Color 255,00,0
Rect X-5,Y-5,10,10
Color 0,255,0
Rect EndeX-5,EndeY-5,10,10
Color 255,255,255

linieZ = CreateImage(200,200)

Repeat

If KeyDown(203) Then Goto Neu

t# = t# + 2

YV = Y
XV = X

Y = Y + Sin(t#) * 48
X = X + Cos(t#) * 48

SetBuffer ImageBuffer(linieZ)
 Cls
 Line 0,0,X-XV,Y-YV
SetBuffer BackBuffer()
DrawImage LinieZ,XV,YV

Flip
Until KeyHit(1)



Danke im voraus!


PS: Dass die Ellipse den grünen Punkt nicht schneidet ist absicht!
Just for Fun!
Jesus loves U!

SpionAtom

BeitragDi, Nov 29, 2005 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist vielleicht nicht die sauberste Methode, aber prüfe doch einfach, welcher deiner Punkte der obere ist, und tausche ihn gegebenenfalls. Wink

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Nov 30, 2005 2:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo totonak, der Grund für die gepunktete Linie ist das du die Linie über das Image auf dem Bildschirm bringst. Wenn also die Linie negative Werte hat, dann zeichnest du aus dem Imagebereich hinaus und nur der Startpunkt bleibt in der linken oberen Ecke des Images. Das einfangen der Linie geht also schief! Nimm das Image-getue weg und zeichne auf direktem Wege auf dem Bildschirm oder tausche die Start-End-Punkte wenn sie negative Werte haben sollten. Die leztere Methode wird allerdings nicht ganz schön zu proggen sein, da dann auch die Darstellung bedacht werden sollte. Eine Möglichkeit währe das Image doppelt so breit und doppelt so hoch zu machen um alle Bewegungsbereiche einfangen zu können, du hast dann ein Mittelpunkt von wo aus die Linie startet. Muß es denn über das Image sein?

Benutze bitte nie wieder den Goto -Befehl. Der ist böse. Twisted Evil Nimm dafür einfache If-Abfragen mit einem anschliessendem EndIf oder Funktionen!

Eine Nebensächlichkeit: Rect X-5,Y-5,10,10 zeichnet nicht in der 'Mitte'. Dieser Rect ist 10 Pixel breit und hoch aber Startposition ist für X und Y jeweils -5. Also muß um den 'Mittelpunkt' darstellen zu können der Rect 11 Pixel breit und hoch sein! Also: Rect X-5,Y-5,11,11

Erstelle nicht immer neue Images. Benutze auch mal wieder FreeImage um den Speicher wieder mal zu entlasten.

Hier mal ein Beispielcode mit Images:Code: [AUSKLAPPEN]
Graphics 640,480,0,2
SetBuffer BackBuffer()

Global X%=0 ;X-Startposition
Global Y%=0 ;Y-Startposition
Global EndeX%=0 ;X-Endposition
Global EndeY%=0 ;Y-Endposition
Global T#=0 ;Atan2-Winkel
linieZ=CreateImage(401,401)

SeedRnd MilliSecs()
FLinieZ




;Hauptschleife
Repeat
 If KeyDown(203) Then FLinieZ

 T=T+2

 YV=Y
 XV=X

 Y=Y+Sin(T)*48
 X=X+Cos(T)*48

 SetBuffer ImageBuffer(linieZ)
  Cls
  Line 200,200,200+X-XV,200+Y-YV
 SetBuffer BackBuffer()

 DrawImage LinieZ,XV-200,YV-200

 Flip
Until KeyHit(1)
FreeImage linieZ
End




;Neue LinieZ erstellen
Function FLinieZ()
 Cls
 XV=0
 YV=0

 X=Rand(640)
 Y=Rand(480)

 EndeX=Rand(640)
 EndeY=Rand(480)

 T=ATan2((EndeY-Y),(EndeX-X))

 Color 255,00,0
 Rect X-5,Y-5,11,11

 Color 0,255,0
 Rect EndeX-5,EndeY-5,11,11

 Color 255,255,255
End Function

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Nov 30, 2005 2:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier nochmal ein Beispiel... Vielleicht hilft es dir ja. Ich weiß nicht warum die andere Läsung so langsam ist, die hier ist aber sehr schnell. Mit Cursor hoch/runter kannst du den Radius verändern.Code: [AUSKLAPPEN]
Graphics 640,480,0,2
SetBuffer BackBuffer()

Global xa%=0 ;X-Anfangsposition
Global ya%=0 ;Y-Anfangsposition
Global xe%=0 ;X-Endposition
Global ye%=0 ;Y-Endposition
Global wk#=0 ;Winkel
Global ra%=1000 ;Radius

SeedRnd MilliSecs()




While Not KeyHit(1)

 If KeyDown(200) Then ra=ra+10
 If KeyDown(208) Then ra=ra-10:If ra<0 Then ra=0

 If KeyDown(203) Then
  Cls
  xa=Rand(640):ya=Rand(480)
  xe=Rand(640):ye=Rand(480)
  wk=ATan2(ye-ya,xe-xa)
 EndIf

 ;Oval zeichnen
 Color 96,96,96
 Oval xa-ra+Cos(wk+90)*ra,ya-ra+Sin(wk+90)*ra,2*ra,2*ra,0

 ;Start-End-Punkte zeichnen
 Color 255,0,0:Oval xa-6,ya-6,13,13
 Color 0,255,0:Oval xe-6,ye-6,13,13

 ;Pfeil zeichnen
 Color 255,255,255
 Line xa,ya,xa+Cos(wk)*32,ya+Sin(wk)*32
 Line xa+Cos(wk)*32,ya+Sin(wk)*32,xa+Cos(wk-20)*24,ya+Sin(wk-20)*24
 Line xa+Cos(wk)*32,ya+Sin(wk)*32,xa+Cos(wk+20)*24,ya+Sin(wk+20)*24

 ;Textausgabe
 Text 0,0,"Radius    :"+ra
 Text 0,16,"Winkel    :"+Int(wk)

 Flip
 Cls
Wend
End

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group