home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programming Tool Box
/
SIMS_2.iso
/
bp_4_94
/
vbwin
/
sirds
/
sirds.txt
< prev
next >
Wrap
Text File
|
1995-02-26
|
10KB
|
269 lines
Option Explicit
Sub Abbruch ()
' Dieses passiert, wenn kein 256-Farbenmodus eingestellt ist.
Dim Text As String, Titel As String
Text = "Leider haben Sie keinen 256-Farbenmodus eingestellt."
Text = Text + " WΣhlen Sie bitte einen Super-VGA-Modus mit 256 Farben aus." + Chr$(13)
Text = Text + " Starten Sie Windows erneut."
Text = Text + " Versuchen Sie es dann nochmal!"
Text = Text + Chr$(13)
Text = Text + Space$(27) + "Viel Spa▀ beim Sirdsen."
MsgBox Text, 0, Titel
End
End Sub
' Die Ausgabe einer Zeile des SIRDS erfolgt hier
Static Sub Ausgabe (Y%, Stereo() As Integer)
Dim X%
For X% = 0 To Form2.bldBild.ScaleWidth
form3.bldSirds.PSet (X%, Y%), QBColor(Stereo(X%)) ' Gibt den endgültigen SIRDS-Pixel aus.
Next X%
End Sub
Sub Form_Load ()
Dim Ergebnis%
' Mit der GDI-Funktion "GetDeviceCaps()" wird ⁿberprⁿft,
' ob ein 256-Farbenmodus eingestellt ist.
' Wenn ein anderer eingestellt ist, wird das Programm
' mit der Prozedur "Abbruch" beendet.
Ergebnis% = GetDeviceCaps(Form1.hDC, 24)
If Ergebnis% <> 20 Then Call Abbruch
' Die Skalierungsart wird auf natⁿrliche Pixel festgelegt.
Form2.bldBild.ScaleMode = 3
form3.bldSirds.ScaleMode = 3
' Die Menuepunkte "Sirds" und "Speichern" werden zunΣchst deaktiviert.
mnuSirds.Enabled = False
mnuSpeichern.Enabled = False
End Sub
' Ermittelt den Blauanteil der RGB-Farbe.
Function GetBlue (FarbWert As Long) As Integer
GetBlue = (FarbWert And &HFF&)
End Function
' Ermittelt den Grⁿnanteil der RGB-Farbe.
Function GetGreen (FarbWert As Long) As Integer
GetGreen = (FarbWert And &HFF00&) \ 256
End Function
' Ermittelt den Rotanteil der RGB-Farbe.
Function GetRed (FarbWert As Long) As Integer
GetRed = (FarbWert And &HFF0000) \ 65536
End Function
' Der Algorithmus fⁿr die Korrelationsberechnung erfolgt mit MacheKorrel(). Dabei wird das von Scannen
' erzeugte Feld Tiefe() umgerechnet
Static Sub MacheKorrel (Tiefe() As Integer, Korrel() As Integer, AugeAbst As Single, Aufloesung As Integer)
Dim l%, S%, Sl%, Sr%, Sichtbar%, X%, dx%, Vor%, zt%, E!, konst!, z!
' Das Feld Korrel() wird auf "nicht korreliert" gesetzt.
For X% = 0 To Form2.bldBild.ScaleWidth
Korrel(X%) = X%
Next X%
E! = AugeAbst! * Aufloesung% ' Der Augenabstand wird in Anzahl der Pixel umgerechnet.
konst! = 2 / (zSkal! * p! * E!)
' Hier beginnt der Algorithmus.
For X% = 0 To Form2.bldBild.ScaleWidth
' Kernberechnung des Algorithmus.
Vor% = Tiefe(X%)
z! = Vor% * zSkal! ' Normierung der Farbwerte zwischen 0 und 1.
S% = (1 - p! * z!) * E! / (2 - p! * z!) ' Die Berechnung von S.
Sl% = X% - S% / 2 ' Berechnung des linken Stereopunktes.
Sr% = Sl% + S% ' Berechnung des rechten Stereopunktes.
' Weiter, wenn Stereopunkte beide im Abbildungsbereich (Bildschirm) liegen.
If 0 <= Sl% And Sr% < Form2.bldBild.ScaleWidth Then
' Teil des Algorithmus, der ⁿberprⁿft, ob der betrachtete Punkt überhaupt fürs Auge sichtbar ist.
' Hidden-Pixel Algorithmus. Siehe dazu Ausfⁿhrung im Text.
dx% = 1
Do
zt% = Vor% + (2 - p! * z!) * dx% * konst!
Sichtbar% = Tiefe(X% - dx%) < zt%
If Sichtbar% Then
Sichtbar% = Tiefe(X% + dx%) < zt%
End If
dx% = dx% + 1
Loop Until Not Sichtbar% Or zt% > zSkal!
' Teil des Algorithmus, der die Randbedingungen berⁿcksichtigt.
' Lesen Sie dazu die Ausfⁿhrungen im Text.
If Sichtbar Then
l% = Korrel(Sl%)
While l% <> Sl% And l% <> Sr%
If l% < Sr% Then
Sl% = l%
l% = Korrel(Sl%)
Else
Korrel(Sl%) = Sr%
Sl% = Sr%
Sr% = l%
l% = Korrel(Sl%)
End If
Wend
Korrel(Sl%) = Sr% ' Hier wird die Kernzuweisung gemacht,
' wobei die Korrelierung festgelegt wird.
End If
End If
Next X%
End Sub
' Diese Procedur setzt die im Feld Korrel() enthaltenen Korrelationsinformationen um und
' setzt die Farbwerte der auszugebenen SIRDS-Zeile in das Feld Stereo() ein.
Static Sub MacheSirds (Stereo() As Integer, Korrel() As Integer)
Dim X%, Farbe%
For X% = Form2.bldBild.ScaleWidth To 0 Step -1
Farbe% = Int(15 * Rnd) ' Die Zufallsfarbe wird generiert.
' Wenn keine Korrelierung vorliegt, dann wird einfach die Zufallsfarbe gesetzt.
If Korrel(X%) = X% Then
Stereo(X%) = Farbe%
Else
' Liegt Korrelierung vor, so setzte die gleiche Farbe wie die des anderen Stereopunktes.
Stereo(X%) = Stereo(Korrel(X%))
End If
Next X%
End Sub
Sub mnuEnde_Click ()
' Das Programm wird hiermit beendet.
End
End Sub
Sub mnuInfo_Click ()
' Was soll noch mehr gesagt werden?
Dim Text As String, Titel As String
Titel = "▄ber das Programm"
Text = Space$(4) + "*** Sirdsbild Version 94 ***" + Chr$(13)
Text = Text + Chr$(13)
Text = Text + " Haben Sie schon Kopfschmerzen?"
Text = Text + Chr$(13)
Text = Text + Space$(4) + "<Jⁿrgen Riedel, 30.11.94>"
Text = Text + Chr$(13)
Text = Text + Space$(4) + "<CompuServe: 100422,1063>"
MsgBox Text, 0, Titel
End Sub
Sub mnu╓ffnen_Click ()
Dim CancelFlag%
On Local Error GoTo ErrorRoutine
' True legt hier fest, da▀ das BetΣtigen der AbbruchflΣche zum Laufzeitfehler
' mit der Nummer 32755 fⁿhrt.
CMDialog1.CancelError = True
' Setzten der Standardflags (Windowsvorgabe).
CMDialog1.Flags = AufDefault
' Festlegen des Titels der Dialogbox.
CMDialog1.DialogTitle = "Bitmap ╓ffnen"
' Es werden nur die Dateien mit der Endung ".bmp" angezeigt.
CMDialog1.Filter = "Bitmaps (*.bmp)|*.bmp"
' Der Commen Dialog wird auf "laden" gesetzt.
CMDialog1.Action = 1
' Wird nichts ausgewΣhlt, dann raus aus der Prozedur.
If CMDialog1.Filename = "" Then Exit Sub
' Es ist kein "Fehler" aufgetreten.
If CancelFlag = 0 Then
' Die Form "Eingabe.frm" wird der Gr÷▀e der geladenen Bitmap
' angeglichen.
Form2.bldBild.AutoSize = True
' Laden des Bitmap ins Bildfenster.
Form2.bldBild.Picture = LoadPicture(CMDialog1.Filename)
Form2.Width = Form2.bldBild.Width
Form2.Height = Form2.bldBild.Height
Form2.Show
' Menuepunkt "Sirds" wird aktiviert.
mnuSirds.Enabled = True
End If
Exit Sub
ErrorRoutine:
' Ist der Laufzeitfehler aufgetreten, dann geschieht folgendes.
If Err = 32755 Then ' Vergleiche oben.
CancelFlag = -1
End If
' Erm÷glicht die verz÷gerte Fehkerbehandlung
' ⁿber die Variable "Err".
Resume Next
End Sub
Sub mnuSirds_Click ()
' Deklarationsteil der Variablen.
Dim Y%, Prozent%
Static FarbWert As Long, Farbe As Long, R As Integer, B As Integer, G As Integer
' Menuepunkt "╓ffnen" wird deaktiviert.
mnu╓ffnen.Enabled = False
' Die Form "Ausgabe.frm" wird verdeckt
Load form3
form3.Hide
' Die Form "Ausgabe.frm" wird dimensioniert.
form3.bldSirds.Left = (form3.Width - Form2.bldBild.Width) / 2
form3.bldSirds.Top = (form3.Height - Form2.bldBild.Height) / 2
form3.bldSirds.Width = Form2.bldBild.Width
form3.bldSirds.Height = Form2.bldBild.Height
' Die folgenden Felder werden dimensioniert.
ReDim Tiefe(Form2.bldBild.ScaleWidth)
ReDim Korrel(Form2.bldBild.ScaleWidth)
ReDim Stereo(Form2.bldBild.ScaleWidth)
Form2.Show
frmLabel.Caption = " Sirdsberechnung: "
' Die Schleife fⁿr die abzuarbeitenden Bildzeilen.
For Y% = 0 To Form2.bldBild.ScaleHeight ' 0 bis Anzahl der Zeilen der geladenden Bitmap
' Reagiere auf Ereignisse.
DoEvents
' Zeigt die schon abgearbeiteten Zeilen in Prozent an.
Prozent% = Y% / Form2.bldBild.ScaleHeight * 100
frmProzent.Caption = Str$(Prozent%) + "%"
' Aufruf der einzelnen Unterroutinen.
Form2.Show
Call Scannen(Y%, Tiefe())
Call MacheKorrel(Tiefe(), Korrel(), 2.5, 72)
Call MacheSirds(Stereo(), Korrel())
Call Ausgabe(Y%, Stereo())
Next Y%
' Zeige das Sirdsbild.
form3.bldSirds.Picture = form3.bldSirds.Image
form3.Show
' Mennuepunkte "╓ffnen" und "Speichern" werden aktiviert.
mnuSpeichern.Enabled = True
mnu╓ffnen.Enabled = True
mnuSirds.Enabled = False
End Sub
Sub mnuSpeichern_Click ()
On Error Resume Next
form3.bldSirds.Picture = form3.bldSirds.Image
' Siehe Kommentare zu "mnu╓ffnen".
CMDialog1.CancelError = True
CMDialog1.Flags = ZuDefault
CMDialog1.DialogTitle = "Datei speichern unter"
CMDialog1.Filter = "Bitmaps (*.bmp)|*.bmp"
CMDialog1.DefaultExt = "bmp"
CMDialog1.Filename = "*.bmp"
' Setzten des Commen Dialog auf "speichern".
CMDialog1.Action = 2
' Ist kein Fehler aufgetren, dann speichere das Bild.
If Err = 0 Then
SavePicture form3.bldSirds.Picture, CMDialog1.Filename
End If
' Die Menuepunkte "Speichern", "╓ffnen" und "Sirds" werden deaktiviert.
mnuSpeichern.Enabled = False
mnu╓ffnen.Enabled = False
mnuSirds.Enabled = False
End Sub
Static Sub Scannen (Y%, Tiefe() As Integer)
Static FarbWert As Long, R As Integer, B As Integer, G As Integer
Dim X%
' Einlesen der RGB-Farbwerte einer Bitmapzeile.
For X% = 0 To Form2.bldBild.ScaleWidth
FarbWert = Form2.bldBild.Point(X%, Y%) ' Farbwert des aktuellen Pixels wird eingelesen.
' Umrechnung der RGB-Farbwerte in 256 Graustufen.
' Tip: Probieren Sie doch andere Gewichtungsfaktoren aus.
' Die Gewichtungsfaktoren sind auf eine durchschnittliche
' Farbempfindlichkeit eingestellt.
Tiefe(X%) = .3 * GetRed(FarbWert) + .59 * GetGreen(FarbWert) + .11 * GetBlue(FarbWert)
Next X%
End Sub