 |
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: 1836 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: 1836 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: 560 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.
|
|