Hallo Leute,
ich habe ein kleines Problem und sehe mittlerweile den Wald vor lauter Bäumen nicht.
Im Rahmen einer Entwicklung für ein CAD-System, lese ich die Flächenparameter eines 3D-Modells aus und schreibe sie in eine ArrayList. Danach sortiere ich die ArrayList absteigend nach Flächengröße.
Das Ergebnis sieht z.B. für einen Würfel mit Bohrungen wie folgt aus (sehr einfacher Fall):
Ebenen-Fläche = 412,9024 mm^2
Flächennormale = (0,1,0)
Ebenen-Fläche = 412,9024 mm^2
Flächennormale = (0,-1,0)
Ebenen-Fläche = 312,9024 mm^2
Flächennormale = (1,0,0)
Ebenen-Fläche = 312,9024 mm^2
Flächennormale = (-1,0,0)
Ebenen-Fläche = 312,9024 mm^2
Flächennormale = (0,0,1)
Ebenen-Fläche = 312,9024 mm^2
Flächennormale = (0,0,-1)
Jetzt möchte ich die Anzahl der gleichen Flächen mit der "gleichen" Flächennormalen zählen (die Flächennormale ist natürlich nicht direkt gleich, da sie entgegengesetzt zeigen). Hierfür prozessiere ich mit einer Schleife über die ArrayList und übergebe die Werte an eine Funktion, damit der Vergleich mit den vorgegebenen Bedingungen durchgeführt wird. In der Vergleichsfunktion ermittele ich noch das Vektorprodukt der übergebenen Normalvektoren und nutze das Ergebnis als Vergleichsparameter. Die Vektoren sind Arrays, wie Ihr aus dem Codefragment sehen könnt..
Hier die Code-Fragmente:
Wertübergabe an Vergleichsfunktion:
For j = 0 To EbenenAL.Count - 1
k = 0
Do
k = k + 1
If k > j Then
If EbenenAL.Compare(EbenenAL.Item(j), EbenenAL.Item(k)) = 0 Then
gleicheFl += 1
End If
ErgebnisForm1.RichTextBox1.Text += (Chr(10) & "Rückgabewert = " & _
EbenenAL.Compare(EbenenAL.Item(j), EbenenAL.Item(k)) & Chr(10))
End If
Loop Until k = EbenenAL.Count - 1
Next
...
Vergleichsfunktion:
Public Function Compare(ByVal FEB1 As Object, ByVal FEB2 As Object) As Integer Implements System.Collections.IComparer.Compare
FEB1 = CType(FEB1, CEbenen)
FEB2 = CType(FEB2, CEbenen)
Dim vFeb1(3) As Integer
vFeb1(0) = Convert.ToInt32(FEB1.vFaceNorm(1)) * Convert.ToInt32(FEB2.vFaceNorm(2)) - Convert.ToInt32(FEB1.vFaceNorm(2)) * Convert.ToInt32(FEB2.vFaceNorm(1))
vFeb1(1) = Convert.ToInt32(FEB1.vFaceNorm(2)) * Convert.ToInt32(FEB2.vFaceNorm(0)) - Convert.ToInt32(FEB1.vFaceNorm(0)) * Convert.ToInt32(FEB2.vFaceNorm(2))
vFeb1(2) = Convert.ToInt32(FEB1.vFaceNorm(0)) * Convert.ToInt32(FEB2.vFaceNorm(1)) - Convert.ToInt32(FEB1.vFaceNorm(1)) * Convert.ToInt32(FEB2.vFaceNorm(0))
If (vFeb1(0) > 0 Or vFeb1(1) > 0 Or vFeb1(2) > 0) And (Math.Round((FEB1.vFaceAreaEb * 1000000.0#), 4) > Math.Round((FEB2.vFaceAreaEb * 1000000.0#), 4)) Then
Return -1
ElseIf (vFeb1(0) < 0 Or vFeb1(1) < 0 Or vFeb1(2) < 0) And (Math.Round((FEB1.vFaceAreaEb * 1000000.0#), 4) < Math.Round((FEB2.vFaceAreaEb * 1000000.0#), 4)) Then
Return 1
ElseIf (vFeb1(0) = 0 And vFeb1(1) = 0 And vFeb1(2) = 0) And (Math.Round((FEB1.vFaceAreaEb * 1000000.0#), 4) = Math.Round((FEB2.vFaceAreaEb * 1000000.0#), 4)) Then
Return 0
End If
End Function
End Class
Aus irgendwelchen Gründen ist das Ergebnis 11 und nicht 3 wie man unter den angegebenen Bedingungen eigentlich erwarten sollte. So ganz kann ich mir dieses Ergebnis nicht erklären. Ist da ein Denkfehler bei mir ? Ich habe viel mit den Bedingungen rumgespielt, mit <> 0 oder And anstatt Or...Das Ergebnis ist leider nie richtig. Habe ich da etwas falsch programmiert?
Ich hoffe, daß Ihr mir ein kleinen Tip geben könnt.
Vielen Dank für Eure Antworten im Voraus!
Gruß
Freshman
ich habe ein kleines Problem und sehe mittlerweile den Wald vor lauter Bäumen nicht.
Im Rahmen einer Entwicklung für ein CAD-System, lese ich die Flächenparameter eines 3D-Modells aus und schreibe sie in eine ArrayList. Danach sortiere ich die ArrayList absteigend nach Flächengröße.
Das Ergebnis sieht z.B. für einen Würfel mit Bohrungen wie folgt aus (sehr einfacher Fall):
Ebenen-Fläche = 412,9024 mm^2
Flächennormale = (0,1,0)
Ebenen-Fläche = 412,9024 mm^2
Flächennormale = (0,-1,0)
Ebenen-Fläche = 312,9024 mm^2
Flächennormale = (1,0,0)
Ebenen-Fläche = 312,9024 mm^2
Flächennormale = (-1,0,0)
Ebenen-Fläche = 312,9024 mm^2
Flächennormale = (0,0,1)
Ebenen-Fläche = 312,9024 mm^2
Flächennormale = (0,0,-1)
Jetzt möchte ich die Anzahl der gleichen Flächen mit der "gleichen" Flächennormalen zählen (die Flächennormale ist natürlich nicht direkt gleich, da sie entgegengesetzt zeigen). Hierfür prozessiere ich mit einer Schleife über die ArrayList und übergebe die Werte an eine Funktion, damit der Vergleich mit den vorgegebenen Bedingungen durchgeführt wird. In der Vergleichsfunktion ermittele ich noch das Vektorprodukt der übergebenen Normalvektoren und nutze das Ergebnis als Vergleichsparameter. Die Vektoren sind Arrays, wie Ihr aus dem Codefragment sehen könnt..
Hier die Code-Fragmente:
Wertübergabe an Vergleichsfunktion:
For j = 0 To EbenenAL.Count - 1
k = 0
Do
k = k + 1
If k > j Then
If EbenenAL.Compare(EbenenAL.Item(j), EbenenAL.Item(k)) = 0 Then
gleicheFl += 1
End If
ErgebnisForm1.RichTextBox1.Text += (Chr(10) & "Rückgabewert = " & _
EbenenAL.Compare(EbenenAL.Item(j), EbenenAL.Item(k)) & Chr(10))
End If
Loop Until k = EbenenAL.Count - 1
Next
...
Vergleichsfunktion:
Public Function Compare(ByVal FEB1 As Object, ByVal FEB2 As Object) As Integer Implements System.Collections.IComparer.Compare
FEB1 = CType(FEB1, CEbenen)
FEB2 = CType(FEB2, CEbenen)
Dim vFeb1(3) As Integer
vFeb1(0) = Convert.ToInt32(FEB1.vFaceNorm(1)) * Convert.ToInt32(FEB2.vFaceNorm(2)) - Convert.ToInt32(FEB1.vFaceNorm(2)) * Convert.ToInt32(FEB2.vFaceNorm(1))
vFeb1(1) = Convert.ToInt32(FEB1.vFaceNorm(2)) * Convert.ToInt32(FEB2.vFaceNorm(0)) - Convert.ToInt32(FEB1.vFaceNorm(0)) * Convert.ToInt32(FEB2.vFaceNorm(2))
vFeb1(2) = Convert.ToInt32(FEB1.vFaceNorm(0)) * Convert.ToInt32(FEB2.vFaceNorm(1)) - Convert.ToInt32(FEB1.vFaceNorm(1)) * Convert.ToInt32(FEB2.vFaceNorm(0))
If (vFeb1(0) > 0 Or vFeb1(1) > 0 Or vFeb1(2) > 0) And (Math.Round((FEB1.vFaceAreaEb * 1000000.0#), 4) > Math.Round((FEB2.vFaceAreaEb * 1000000.0#), 4)) Then
Return -1
ElseIf (vFeb1(0) < 0 Or vFeb1(1) < 0 Or vFeb1(2) < 0) And (Math.Round((FEB1.vFaceAreaEb * 1000000.0#), 4) < Math.Round((FEB2.vFaceAreaEb * 1000000.0#), 4)) Then
Return 1
ElseIf (vFeb1(0) = 0 And vFeb1(1) = 0 And vFeb1(2) = 0) And (Math.Round((FEB1.vFaceAreaEb * 1000000.0#), 4) = Math.Round((FEB2.vFaceAreaEb * 1000000.0#), 4)) Then
Return 0
End If
End Function
End Class
Aus irgendwelchen Gründen ist das Ergebnis 11 und nicht 3 wie man unter den angegebenen Bedingungen eigentlich erwarten sollte. So ganz kann ich mir dieses Ergebnis nicht erklären. Ist da ein Denkfehler bei mir ? Ich habe viel mit den Bedingungen rumgespielt, mit <> 0 oder And anstatt Or...Das Ergebnis ist leider nie richtig. Habe ich da etwas falsch programmiert?
Ich hoffe, daß Ihr mir ein kleinen Tip geben könnt.
Vielen Dank für Eure Antworten im Voraus!
Gruß
Freshman
Comment