| 
				
					|  | Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
 |  
 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |  
		| Autor | Nachricht |  
		| ThePuppetMaster 
 
  
 Anmeldungsdatum: 18.02.2007
 Beiträge: 1839
 Wohnort: [JN58JR]
 
 | 
			
				|  Verfasst am: 29.05.2013, 13:09    Titel: [Gelöst] 3D Linie Rastern |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| ThePuppetMaster 
 
  
 Anmeldungsdatum: 18.02.2007
 Beiträge: 1839
 Wohnort: [JN58JR]
 
 | 
			
				|  Verfasst am: 02.06.2013, 00:25    Titel: |   |  
				| 
 |  
				| [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 |  |  
		|  |  
		| Muttonhead 
 
  
 Anmeldungsdatum: 26.08.2008
 Beiträge: 570
 Wohnort: Jüterbog
 
 | 
			
				|  Verfasst am: 06.01.2014, 17:16    Titel: |   |  
				| 
 |  
				| 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
   
 Vermutlich Thema verfehlt! 5 (bei mir gabs nur fünfen) setzen
 
   
  	  | 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 |  |  
		|  |  
		| Eternal_pain 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1783
 Wohnort: BW/KA
 
 | 
			
				|  Verfasst am: 01.03.2014, 14:21    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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.
 
 |  |