Announcement

Collapse
No announcement yet.

Vergleichsoperation mit IComparer

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Vergleichsoperation mit IComparer

    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

  • #2
    Sehe den Wald wieder trotz der Bäume ;-)

    Hallo Leute,

    ich habe das Problem selbst gelöst. Manchmal hilft es schon mal das Problem niederzuschreiben.

    Gruß

    Freshman

    Comment

    Working...
    X