Koordinatensystem mit 3 Koordinaten zeichnen (?)

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Charlie Parker
Beiträge: 2
Registriert: 18.06.2019 10:15

Koordinatensystem mit 3 Koordinaten zeichnen (?)

Beitrag von Charlie Parker »

Hallo Progarmmierprofis,

ich bin Musiker mit einer gewissen mathematischen Seite.
Ich habe früher in meinen Anfängen noch mit GFA-Basic auf dem Atari ein paar Programme erstellt, die ich ganz gerne wiederbeleben würde (…in erweiterter Form).

Ich habe früher Grafiken erstellt, indem ich x- und y-Werte berechnet und dann diese in einem Koordinatensystem gezeichnet habe.

Ich möchte nun drei Werte x-, y- z-Werte berechnen (kein Problem) und diese dann in einem dreidimensionalen Koordinatnesystem darstellen.
Und wenn möglich würde ich dieses 3-dimensionale Koordinatensystem auch noch drehen! (…sich langsam drehen lassen…) - Also:

1. Wie kreiere ich ein 3-dimensionales Koordinatensystem?
2. Wie kann ich dieses 3-D-Koordinatensystem drehen?


Dann noch etwas anderes:

Bei meinen alten Programmen aus meiner Studentenzeit verwendete ich oft Variablen der Form

x(a)

wobei a selber wieder eine sich verändernde Variable war, die sich bei jedem Schleifendurchlauf veränderte. - Zu meinem Schrecken habe ich festgestellt, dass sich in Pure Basic solche Variablen nicht bilden lassen. Meine alten Programme wimmeln aber davon… also:

3. Wie kann ich dieses Problem umgehen.

Für die Bantwortung dieser Fragen - auch der Teilfragen! - bin ich wirklich sehr dankbar.

All the best - ›Charly Parker‹
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Koordinatensystem mit 3 Koordinaten zeichnen (?)

Beitrag von Nino »

Charlie Parker hat geschrieben:Dann noch etwas anderes:

Bei meinen alten Programmen aus meiner Studentenzeit verwendete ich oft Variablen der Form

x(a)

wobei a selber wieder eine sich verändernde Variable war, die sich bei jedem Schleifendurchlauf veränderte. - Zu meinem Schrecken habe ich festgestellt, dass sich in Pure Basic solche Variablen nicht bilden lassen.
Doch, sowas gibt es auch in PureBasic. :-)
Das nennt sich Array, siehe https://www.purebasic.com/german/documentation/array/index.html
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Koordinatensystem mit 3 Koordinaten zeichnen (?)

Beitrag von ccode_new »

Hallo!
Dann noch etwas anderes:

Bei meinen alten Programmen aus meiner Studentenzeit verwendete ich oft Variablen der Form

x(a)

wobei a selber wieder eine sich verändernde Variable war, die sich bei jedem Schleifendurchlauf veränderte. - Zu meinem Schrecken habe ich festgestellt, dass sich in Pure Basic solche Variablen nicht bilden lassen.
Ich denke du meinst ein Array, oder doch eine Structure ?

Code: Alles auswählen

Structure xa
  x.l
  a.l
EndStructure

Define x.xa ;Variable x mit Zugriff auf x und a

x\x = 2
Debug x\x

For i = 0 To 1000
  x\a + 1
  Debug x\a
Next
Zu deiner 3D Frage:
Schau dir mal diese Include (viewtopic.php?f=10&t=22128) vom "Foren-Physiker": STARGÅTE an.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Charlie Parker
Beiträge: 2
Registriert: 18.06.2019 10:15

Re: Koordinatensystem mit 3 Koordinaten zeichnen (?)

Beitrag von Charlie Parker »

Danke für die Antworten zu den Variablen / Arrays etc. das probiere ich aus!
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: Koordinatensystem mit 3 Koordinaten zeichnen (?)

Beitrag von juergenkulow »

Hallo Charlie Parker,

PureBasic auf einer x64 mit nvidia zig GB ist etwas völlig anderes als GFA auf einem ST mit MIDI Schnittstellen und 1 MB.
Vielleicht hilft Dir der Code weiter:

Code: Alles auswählen

; Plot3D Sin(5*x)*Cos(5*z)/2
;   Zusammengebaut aus 
;   PureBasic - examples/3d/MeshManual2.pb +  
;   https://www.purebasic.fr/english/viewtopic.php?f=36&t=57849

Declare DrawMatrix()
#CameraSpeed = 1
#scale = 3

IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()
  
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/fonts", #PB_3DArchive_FileSystem)
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Scripts", #PB_3DArchive_FileSystem)
  Parse3DScripts()
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    ;- Material
    CreateMaterial(0, LoadTexture(0, "White.jpg"))
    DisableMaterialLighting(0, #True)
    
    ;- Mesh Grid
    CreateMesh(3, #PB_Mesh_LineList, #PB_Mesh_Static)
    DrawMatrix()
    FinishMesh(#False)
    
    SetMeshMaterial(3, MaterialID(0))
    Grid = CreateNode(#PB_Any, 0, 0, 0)
    AttachNodeObject(Grid, MeshID(3))
    
    
    ;-Camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 2, 8, #PB_Absolute)
    CameraFOV(0, 40)
    CameraLookAt(0, NodeX(Grid),  NodeY(Grid),  NodeZ(Grid))
    CameraBackColor(0, RGB(0, 0, 40))
    
    ;-Light
    CreateLight(0, RGB(255,255,255), -10, 60, 10)
    AmbientColor(RGB(90, 90, 90))
    
    Repeat
      Screen3DEvents()
      
      ExamineKeyboard()
      
      RotateNode(Grid, 0.0, 0.3, 0.0, #PB_Relative) 
      RenderWorld()
      
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End

Procedure DrawMatrix()
  Protected.l a, b, Nb
  Protected.w P1, P2, P3, P4
  Protected.f x, z
  NbX=600
  NbZ=600
  NbY=600
  
  ;xMin.f = -1 : yMin.f = -1: zMin.f = -1 : xMax.f = 1: yMax = 1 : zMax = 1
  xMin.f = -3 : yMin.f = -3: zMin.f = -3 : xMax.f = 3: yMax = 3 : zMax = 3
  ;xMin.f = -10 : zMin.f = -10 : xMax.f = 10: zMax = 10
  range = xMax - xMin
  step1.f = range / NbX
  x.f = xMin: z.f = zMin : y.f = yMin
  choice = 4
  For b=0 To NbZ
    
    For a=0 To NbX
      Select choice
        Case 0, 1
          y.f = ((1-Sign(-x-0.9+Abs(z*2)))/3*(Sign(0.9-x)+1)/3)*(Sign(x+0.65)+1)/2 -((1-Sign(-x-0.39+Abs(z*2)))/3*(Sign(0.9-x)+1)/3) + ((1-Sign(-x-0.39+Abs(z*2)))/3*(Sign(0.6-x)+1)/3)*(Sign(x-0.35)+1)/2
          ; text = "((1-Sign(-x-0.9+Abs(z*2)))/3*(Sign(0.9-x)+1)/3)*(Sign(x+0.65)+1)/2 -((1-Sign(-x-0.39+Abs(z*2)))/3*(Sign(0.9-x)+1)/3) + ((1-Sign(-x-0.39+Abs(z*2)))/3*(Sign(0.6-x)+1)/3)*(Sign(x-0.35)+1)/2 "
        Case 2
          y.f = ATan ((z*z*z)/4 - (x*x))
          ; text = "ATan ((z*z*z)/4 - (x*x))"
        Case 3
          y.f = 1/(15*(x*x+z*z))
          ; text = "1/(15*(x*x+z*z))"
        Case 4
          y.f = Sin(5*x)*Cos(5*z)/2
          ; text = "Sin(5*x)*Cos(5*z)/2"
        Case 5
          y.f = 0.75/Exp((x*5)*(x*5)*(z*5)*(z*5))
          ; text = "0.75/Exp((x*5)*(x*5)*(z*5)*(z*5))"
        Case 6
          tmp.f = Log(x*x+z*z)+0.6
          y.f = 0.7/tmp
          If tmp = 0 ; this is only for this equation, since it has a discontuity
                     ;relax
          Else
            y.f = 0.7/tmp
          EndIf
          ; text = "Log(x*x+z*z)+0.6"
        Case 7
          y.f = 0.2
          ; text = "y = 0.2"
        Case 8
          y.f = Sin(10*(x*x+z*z))/10
          ; text = "Sin(10*(x*x+z*z))/10 "
        Case 9
          y.f = x * x
          NbZ = 0 ; for 2D plot to exit the outer Loop
                  ; text = "x ^ 2" 
      EndSelect
      
      MeshVertexPosition(x, y, z)
      MeshVertexNormal(0,1,0)
      MeshVertexTextureCoordinate(a/NbX, b/Nbz)
      x.f + step1
    Next a
    
    x = xMin
    z.f + step1
  Next b
  
  
EndProcedure  

Code: Alles auswählen

; plot 3d f(x,y)=sin x cos y 
Browser$="firefox" ; ggf. anpassen 
RunProgram(Browser$,"https://www.wolframalpha.com/input/?i=plot+sin+x+cos+y","",#PB_Program_Wait)
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Antworten