Seite 1 von 3
[gelöst] Sowas wie ein Lithium-Atom coden...
Verfasst: 18.03.2008 21:40
von scholly
moin, moin...
Für meine About-Requester-Sammlung möchte ich etwas ähnliches wie ein
Lithium-Atom für einen WindowedSceren mit Schwarzem Hintergrund machen:
Wenn ich die 2DDrawing-Befehle richtig verstehe, geht das nur mit
Plot(x, y [, Farbe]) und entsprechenden Trigonometrischen Formeln. Letzteres ist bei mir aber >30 Jahre her - kein Schimmer, wie ich die Ellipsen-Punkte berechnen soll.
In die Mitte soll statt dem Atomkerngeknubbel ein Sprite und statt der Elektronen auf schwarzen Bahnen will ich kleinere Sprites kreisen lassen.
Das realisier ich wohl am Besten mit Transparent-Sprites, richtig?
Mag mir jemand mit Code für die Ellipsen-Berechnungen unter die Arme greifen?
Mein Dank wird ihn ewig verfolgen
aber erst im Tod erreichen 
Verfasst: 18.03.2008 23:39
von Riacon
Verfasst: 18.03.2008 23:45
von scholly
Sind für mich böhmische Dörfer
Ich hab nicht die geringste Idee, was ich davon wie in PB umsetzen soll

Verfasst: 18.03.2008 23:45
von Kaeru Gaman
@Riacon
eine senkrechte oder waagerechte ellipse ist ja auch nicht so sehr das problem...
aber erklär mal, wie man eine schräge ellipse mit ner schleife plottet...
Verfasst: 18.03.2008 23:55
von Riacon
ich fürchte code hab ich keinen. ich wollte nur einen tipp geben, wo man ein paar mathematische formeln herkriegt.
ich bilde mir ein hier im forum schon mal was über drehen von sprites gesehen zu haben. wenn man eine ellipse hinkriegt, dürften die drehungen auch machbar sein
Verfasst: 19.03.2008 00:04
von Kaeru Gaman
das problem is ja nicht das sprite zu drehen, das ginge mit RotateSprite3D,
dann kriegt man aber probleme mit den frames, weil man viele bräuchte.
> statt der Elektronen auf schwarzen Bahnen will ich kleinere Sprites kreisen lassen.
im endeffekt braucht man also die punktkoordinaten für die elliptische bahn.
...is mir jetzt zu spät das auszutüfteln, außerdem guck ich Monk, is nur werbepause....
Verfasst: 19.03.2008 00:26
von Kaeru Gaman
so, hier is mal die einfache ellipse.
die drehung hab ich noch nich eingebaut.
Code: Alles auswählen
Structure PointFull
StructureUnion
Val.l
Cord.COORD
EndStructureUnion
EndStructure
InitSprite()
InitKeyboard()
Procedure ElipsPoint( CX.l, CY.l, XR.l, YR.l, Angle.l, Rotate.l )
Protected OutPoint.PointFull
MX = CX + XR * Sin(Angle*#PI/180.0)
MY = CY - YR * Cos(Angle*#PI/180.0)
OutPoint\Cord\X = MX
OutPoint\Cord\Y = MY
ProcedureReturn OutPoint\Val
EndProcedure
Define DrawPoint.PointFull
OpenScreen(800,600,32,"test")
StartDrawing(ScreenOutput())
For a=0 To 359
DrawPoint\Val = ElipsPoint( 400,300, 200,100, a, 0 )
Plot(DrawPoint\Cord\X, DrawPoint\Cord\Y, $FFFF00)
Next
StopDrawing()
FlipBuffers()
Repeat
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
Verfasst: 19.03.2008 01:04
von tobe
hi scholly,
ich hab mal etwas rumgebastelt und das ist dabei herausgekommen:
Code: Alles auswählen
EnableExplicit
Define Window, Width, Height, Flag, Event, Quit, n, f.f
Width = 800
Height = 600
Macro gSin(angle)
Sin(angle*#PI/180)
EndMacro
Macro gCos(angle)
Cos(angle*#PI/180)
EndMacro
Flag = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered
Window = OpenWindow(#PB_Any, 0, 0, Width, Height, "atom", Flag)
If Window And InitSprite()
If OpenWindowedScreen(WindowID(Window), 0, 0, Width, Height, 1, 0, 0)
;LoadSprite(0, "Stylised_Lithium_Atom.bmp")
CreateSprite(1, 32, 32)
StartDrawing(SpriteOutput(1))
For n = 1 To 10
Circle(16,16,15-n, RGB(n * 10, n * 10, n * 10))
Next n
StopDrawing()
Repeat
Event = WindowEvent()
While Event
If Event = #PB_Event_CloseWindow
Quit = 1
EndIf
Event = WindowEvent()
Wend
ClearScreen($FFFFFF)
If f >= 359.9
f = 0
Else
f + 2
EndIf
;DisplaySprite(0, 285, 164)
DisplayTransparentSprite(1, 400 + gSin(f)*45, 300 + gCos(f)*145)
DisplayTransparentSprite(1, 400 + gSin(f)*70 + gCos(f)*100, 300 + gCos(f)*80)
DisplayTransparentSprite(1, 400 + gSin(f)*125, 300 + gCos(f)*50 - gSin(f)*70)
StartDrawing(ScreenOutput())
For n = 0 To 359
Plot(416 + gSin(n)*45, 316 + gCos(n)*145, $FF0000)
Plot(416 + gSin(n)*70 + gCos(n)*100, 316 + gCos(n)*80, $FF)
Plot(416 + gSin(n)*125, 316 + gCos(n)*50 - gSin(n)*70, $FF00)
Next
StopDrawing()
Delay(1)
FlipBuffers()
Until Quit
EndIf
EndIf
edit: hatte beim sin&cos das *#pi/180 vergessen
mfG
tobe
Verfasst: 19.03.2008 01:15
von scholly
@KG
hm...
sieht arg schwierig aus...
würde es irgendwas vereinfacht, wenn als Ziel ein/mehrere Sprite(s) von 256x256 zu definieren und das/die hinterher per DisplayTransparentSprite() im Screen zu positionieren?
Und was kann man gegen den "dünne Strichdicke" machen ?
Statt Plot(x,y) ein Box(x,y,2.2)?
@tobe

Ich bin sprachlos
Da hab ich aber mor^^^nachher heftig was zum 'rumprobieren...
Verfasst: 19.03.2008 02:34
von STARGÅTE
Ich habe mal n Procedure geschrieben, mit der es möglich ist eine Ellipse die gedreht ist, zu Zeichnen.
Code: Alles auswählen
Procedure EllipseAngle(x, y, RadiusX, RadiusY, Angle.f=0, Farbe=-1)
Protected x1.l, y1.l, x2.l, y2.l, dx.f, dy,f, j.f
Angle = Angle * #PI/180
x1 = x + Cos(Angle)*RadiusX - Sin(Angle)*RadiusY
y1 = y + Sin(Angle)*RadiusX + Cos(Angle)*RadiusY
For n = 5 To 360 Step 5
j = n * #PI/180
dx = Cos(j)*RadiusX - Sin(j)*RadiusX
dy = Sin(j)*RadiusY + Cos(j)*RadiusY
x2 = x + Cos(Angle)*dx - Sin(Angle)*dy
y2 = y + Sin(Angle)*dx + Cos(Angle)*dy
If Farbe = -1
LineXY(x1, y1, x2, y2)
Else
LineXY(x1, y1, x2, y2, Farbe)
EndIf
x1 = x2
y1 = y2
Next n
EndProcedure
OpenWindow(0, 0, 0, 800, 600, "E", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
Repeat
If WindowEvent() = #PB_Event_CloseWindow : End : EndIf
StartDrawing(WindowOutput(0))
DrawingMode(1)
EllipseAngle(200, 200, 100, 30, 90, $FF0000)
EllipseAngle(200, 200, 100, 30, 30, $FF0000)
EllipseAngle(200, 200, 100, 30, 150, $FF0000)
EllipseAngle(400, 300, 200, 150, 45, $00FF00)
EllipseAngle(600, 200, 300, 100, 80, $0000FF)
StopDrawing()
ForEver