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:
Bild

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 :lol:

Verfasst: 18.03.2008 23:39
von Riacon

Verfasst: 18.03.2008 23:45
von scholly
Sind für mich böhmische Dörfer :oops:
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
:praise: Ich bin sprachlos :o
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