Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

[Gelöst] 3D Linie Rastern

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 29.05.2013, 13:09    Titel: [Gelöst] 3D Linie Rastern Antworten mit Zitat

Hi.

ich würde gerne eine 3D Linie (bestehend aus 2 Double Vektoren) in ein UInteger 3D Array hinein rastern. Allerdings ist das verfahren, das ich nutze meines erachtens viel zu umständlich als das man es effektiv bezeichnen könnte.

Beispiel:
Vertex1 (1.0, 1.0, 1.0)
Vertex2(10.0, 10.0, 10.0)
Array(1 to 10, 1 to 10, 1 to 10) as UInteger

Jetzt soll eine Linie bestehend aus Vertex1 bis Vertex2 in das 3D Array gerastert werden.
Ich versuche das gerade ähnlich dem Line-Algo für 2D Linien zu rastern, was allerdings durch die 3. komponente (Z) einen enormen aufwand darstellt. Sehr viele IF verzweigungen.

Ich suche jetzt also einen einfachen und schnellen Algorythmuss welcher durch die parameter: vertex1 & 2, arraygröse x, y & z mir jeweils die X, Y und Z komponente des rasterfelds zurück gibt.

z.B. ala:
Raster(getX(vertex1, vertex2, rasterWidth, rasterHeight, rasterDeept), getY(...), getZ(...)) = InArrayZuSchreibenderWert

oder eine Funktion welche mir das gleich in ein übergebenes Raster schreibt.
DoRaster(Vertex1, Vertex2, RasterWidth, RasterHeight, RasterDeept, Raster(), InArrayZuSchreibenderWert)


Ich bin mir auch unsicher, ob man das mit der Matrizenberechnung überhaupt machen kann, da sie (soweit ich das verstanden habe) mehr für die transformation als für die rasterung geeignet ist.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 02.06.2013, 00:25    Titel: Antworten mit Zitat

[gelöst]

Code:
Sub RasterTrixel3D(R_Raster3D() as UByte, V_ScreenW as UInteger, V_ScreenH as UInteger, V_ScreenD as UInteger, V_RasterW as UInteger, V_RasterH as UInteger, V_RasterD as UInteger, V_V1 as VectorD3D, V_V2 as VectorD3D, V_Color as UByte)
Dim SRW as Double = (V_ScreenW / V_RasterW)
Dim SRH as Double = (V_ScreenH / V_RasterH)
Dim SRD as Double = (V_ScreenD / V_RasterD)
Dim VX as VectorD3D = V_V1
Dim TX as VectorUI3D
Dim VStep as VectorD3D
Dim TLen as VectorD3D
If V_V1.X > V_V2.X Then TLen.X = V_V1.X - V_V2.X Else TLen.X = V_V2.X - V_V1.X
If V_V1.Y > V_V2.Y Then TLen.Y = V_V1.Y - V_V2.Y Else TLen.Y = V_V2.Y - V_V1.Y
If V_V1.Z > V_V2.Z Then TLen.Z = V_V1.Z - V_V2.Z Else TLen.Z = V_V2.Z - V_V1.Z
If (TLen.X >= TLen.Y) and (TLen.X >= TLen.Z) Then
   'X ist am längsten
   VStep.X = 1
   VStep.Y = TLen.Y / TLen.X
   VStep.Z = TLen.Z / TLen.X
   If V_V1.X > V_V2.X Then VStep.X = -VStep.X
   If V_V1.Y > V_V2.Y Then VStep.Y = -VStep.Y
   If V_V1.Z > V_V2.Z Then VStep.Z = -VStep.Z
   Do
      TX.X = Fix(VX.X / SRW) + 1
      TX.Y = Fix(VX.Y / SRH) + 1
      TX.Z = Fix(VX.Z / SRD) + 1
      If (TX.X >= 1) and (TX.X <= V_RasterW) and (TX.Y >= 1) and (TX.Y <= V_RasterH) and (TX.Z >= 1) and (TX.Z <= V_RasterD) Then R_Raster3D(TX.X, TX.Y, TX.Z) = V_Color
      VX.X += VStep.X
      VX.Y += VStep.Y
      VX.Z += VStep.Z
      If V_V1.X > V_V2.X Then
         If VX.X <= V_V2.X Then Exit Do
      Else: If VX.X >= V_V2.X Then Exit Do
      End If
   Loop
ElseIf (TLen.Y >= TLen.X) and (TLen.Y >= TLen.Z) Then
   'Y ist am längsten
   VStep.X = TLen.X / TLen.Y
   VStep.Y = 1
   VStep.Z = TLen.Z / TLen.Y
   If V_V1.X > V_V2.X Then VStep.X = -VStep.X
   If V_V1.Y > V_V2.Y Then VStep.Y = -VStep.Y
   If V_V1.Z > V_V2.Z Then VStep.Z = -VStep.Z
   Do
      TX.X = Fix(VX.X / SRW) + 1
      TX.Y = Fix(VX.Y / SRH) + 1
      TX.Z = Fix(VX.Z / SRD) + 1
      If (TX.X >= 1) and (TX.X <= V_RasterW) and (TX.Y >= 1) and (TX.Y <= V_RasterH) and (TX.Z >= 1) and (TX.Z <= V_RasterD) Then R_Raster3D(TX.X, TX.Y, TX.Z) = V_Color
      VX.X += VStep.X
      VX.Y += VStep.Y
      VX.Z += VStep.Z
      If V_V1.Y > V_V2.Y Then
         If VX.Y <= V_V2.Y Then Exit Do
      Else: If VX.Y >= V_V2.Y Then Exit Do
      End If
   Loop
ElseIf (TLen.Z >= TLen.X) and (TLen.Z >= TLen.Y) Then
   'Z ist am längsten
   VStep.X = TLen.X / TLen.Z
   VStep.Y = TLen.Y / TLen.Z
   VStep.Z = 1
   If V_V1.X > V_V2.X Then VStep.X = -VStep.X
   If V_V1.Y > V_V2.Y Then VStep.Y = -VStep.Y
   If V_V1.Z > V_V2.Z Then VStep.Z = -VStep.Z
   Do
      TX.X = Fix(VX.X / SRW) + 1
      TX.Y = Fix(VX.Y / SRH) + 1
      TX.Z = Fix(VX.Z / SRD) + 1
      If (TX.X >= 1) and (TX.X <= V_RasterW) and (TX.Y >= 1) and (TX.Y <= V_RasterH) and (TX.Z >= 1) and (TX.Z <= V_RasterD) Then R_Raster3D(TX.X, TX.Y, TX.Z) = V_Color
      VX.X += VStep.X
      VX.Y += VStep.Y
      VX.Z += VStep.Z
      If V_V1.Z > V_V2.Z Then
         If VX.Z <= V_V2.Z Then Exit Do
      Else: If VX.Z >= V_V2.Z Then Exit Do
      End If
   Loop
End If
End Sub



MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 561
Wohnort: Jüterbog

BeitragVerfasst am: 06.01.2014, 17:16    Titel: Antworten mit Zitat

ich weiß, ich soll nicht als Hobbynekromant und schon garnicht wenn man keine Ahnung hat ...
hab grad zuviel Zeit und fand das Jahr ist noch nicht rum happy

Vermutlich Thema verfehlt! 5 (bei mir gabs nur fünfen) setzen
grinsen
Code:
type vector
  x as single
  y as single
  z as single
end type

dim as vector vstart,vend

vstart.x=0
vstart.y=0
vstart.z=0
vend.x=10
vend.y=-11
vend.z=-21

sub Stepper (vs as vector,ve as vector)

  dim v as vector
  dim as integer steps
  steps=0

  v.x=ve.x - vs.x
  if abs(v.x)>steps then steps=int(abs(v.x))

  v.y=ve.y - vs.y
  if abs(v.y)>steps then steps=int(abs(v.y))

  v.z=ve.z - vs.z
  if abs(v.z)>steps then steps=int(abs(v.z))

  print steps

  v.x /=steps
  v.y /=steps
  v.z /=steps

  'Startvektor
  print vs.x,
  print vs.y,
  print vs.z

  'Twilightzone
  for i as integer=1 to steps-1
    print fix(vs.x + i*v.x + .5*sgn(v.x) ),
    print fix(vs.y + i*v.y + .5*sgn(v.y) ),
    print fix(vs.z + i*v.z + .5*sgn(v.z) )
  next i

  'Endvektor
  print ve.x,
  print ve.y,
  print ve.z
end sub

Stepper(vstart,vend)

sleep


Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 01.03.2014, 14:21    Titel: Antworten mit Zitat

Hatte neulich für irgendwas den Bresenham in 3D gebastelt, sollte eigentlich recht schnell und übersichtlich sein...

Code:

'' -----------------------
'' Bresenham 3D Line
'' -----------------------
#Define MAX(a,b) IIF(a>b,a,b)

Function b3dl (byval x0 as integer, byval y0 as integer, byval z0 as Integer, _
               byval x1 as integer, byval y1 as integer, byval z1 as Integer)
   
    Static as Integer x, y, z, xd, yd, zd, dx, dy, dz, sx, sy, sz, ax, ay, az
   
    dx = (x1-x0) : sx = sgn(dx) : ax = abs(dx) : x = x0
    dy = (y1-y0) : sy = sgn(dy) : ay = abs(dy) : y = y0
    dz = (z1-z0) : sz = sgn(dz) : az = abs(dz) : z = z0
   
    If (ax >= MAX(ay,az)) Then
        yd = ay - ax : zd = az - ax
        do
            Line3D -> AddEntry(x,y,z) ''** Speichern/Pixeln...
            if (x = x1) then exit do
            if (yd >= 0) then y += sy : yd -= ax
            if (zd >= 0) then z += sz : zd -= ax
            x += sx : yd += ay : zd += az
        loop
    elseif (ay >= MAX(ax, az)) then
        xd = ax - ay : zd = az - ay
        do
            Line3D -> AddEntry(x,y,z) ''** Speichern/Pixeln...
            if (y = y1) then exit do
            if (xd >= 0) then x += sx : xd -= ay
            if (zd >= 0) then z += sz : zd -= ay
            y += sy : xd += ax : zd += az
        loop
    elseif (az >= MAX(ax, ay)) then
        xd = ax - az : yd = ay - az
        do
            Line3D -> AddEntry(x,y,z) ''** Speichern/Pixeln...
            if (z = z1) then exit do
            if (xd >= 0) then x += sx : xd -= az
            if (yd >= 0) then y += sy : yd -= az
            z += sz : xd += ax : yd += ay
        loop
    end if
End Function


Hatte bei mir die 'Pixel' in eine Liste geschrieben, das kann man dann hier in ein Array/Raster oder direkt auf den Bildschirm speichern?!

Edit:
Hier ist noch eine etwas erweiterte Funktion die vielversprechend aussieht...
http://www.mathworks.com/matlabcentral/fileexchange/21057-3d-bresenhams-line-generation/content/bresenham_line3d.m
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz