[gelöst] Sowas wie ein Lithium-Atom coden...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

[gelöst] Sowas wie ein Lithium-Atom coden...

Beitrag 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:
Zuletzt geändert von scholly am 17.05.2008 14:41, insgesamt 1-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Riacon
Beiträge: 61
Registriert: 21.01.2008 09:40

Beitrag von Riacon »

Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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 :(
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Riacon
Beiträge: 61
Registriert: 21.01.2008 09:40

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag 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
Zuletzt geändert von tobe am 19.03.2008 01:22, insgesamt 1-mal geändert.
PureBasic 4.40 (Windows - x86)
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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...
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten