0

私はVB6でJavaで行われたこのギフトラッピングアルゴリズム(yoshihitoyagi!)を実装しようとしています。これを適切に行ったと確信していますが、何らかの理由で機能しません。返された配列には 1 つの要素しかありません。誰かが(新しい目で)見て、あからさまに何かを見逃しているかどうかを知らせてくれることを望んでいました.

これが私のコードです:

Function small(ByVal Current As Integer, ByVal smallest As Integer, ByVal i As Integer) As Boolean
Dim xa, ya, xb, yb, val As Integer

xa = xPoints(smallest) - xPoints(Current)
xb = xPoints(i) - xPoints(Current)
ya = yPoints(smallest) - yPoints(Current)
yb = yPoints(i) - yPoints(Current)

val = xa * yb - xb * ya

If val > 0 Then
    small = True
ElseIf val < 0 Then
    small = False
Else
    If (xa * xb + ya * yb) < 0 Then
        small = False
    Else
        If (xa * xa + ya * ya) > (xb * xb + yb * yb) Then
            small = True
        Else
            small = False
        End If
    End If
End If

End Function

Sub CreateContours1()
Dim Min, i, num, smallest, Current, contourcount2 As Integer
Dim xPoints2(), yPoints2() As Long

'Find leftmost lowest point
Min = 1
For i = 1 To contourCount
    If yPoints(i) = yPoints(Min) Then
        If xPoints(i) < xPoints(Min) Then
            Min = i
        End If
    ElseIf yPoints(i) < yPoints(Min) Then
        Min = i
    End If
Next

Debug.Print "Min: " & Min
Current = Min
num = 1

Do
    contourcount2 = contourcount2 + 1
    ReDim Preserve xPoints2(contourcount2)
    ReDim Preserve yPoints2(contourcount2)
    xPoints2(num) = xPoints(Current)
    yPoints2(num) = yPoints(Current)
    Debug.Print "num: " & num & ", current: " & Current & "(" & xPoints(Current) & ", " & yPoints(Current) & ")"
    num = num + 1
    smallest = 1
    If smallest = Current Then
        smallest = 1
    End If

    For i = 1 To contourCount
        If (Current = i) Or (smallest = i) Then
            GoTo continue_loop
        End If
        If small(Current, smallest, i) Then
            smallest = i
        End If
    Next
    Current = smallest
continue_loop:
Loop While Current <> Min

End Sub

すべての配列は 1 から始まります。したがって、1 と 0 の間に違いがある場合は、それが理由です。

これがたくさんあることは理解していますが、どんな助けでも大歓迎です。

ありがとう!!!!

4

1 に答える 1

2

表示されていないクラス/モジュールスコープにある可能性のある他の変数があるかどうかはわかりませんが、宣言されていない変数が使用されている可能性があるため、言うのは難しいです。

  1. Option Explicitを使用して、コンパイルエラーが表示されるかどうかを確認します。特にcontourCount宣言されていないようです。

  2. 各変数タイプを明示的に宣言する必要があります。

これ:

Dim Min, i, num, smallest, Current, contourcount2 As Integer 
Dim xPoints2(), yPoints2() As Long 

本当にこれですか:

Dim Min As Variant, i As Variant, num As Variant, smallest As Variant, Current As Variant, contourcount2 As Integer 
Dim xPoints2() As Variant, yPoints2() As Long 

したがって、これに変更する必要があります。

Dim Min As Long, i As Long, num As Long, smallest As Long, Current As Long, contourcount2 As Long 
Dim xPoints2() As Long, yPoints2() As Long 

また、それらをすべてLongに変更したことにも注意してください。VB6で整数(2バイト)データ型を使用する理由はほとんどありません。

編集1:

私の配列はすべて1から始まります。したがって、1と0の間に違いが見られる場合は、それが理由です。

明示的に指定しない限り、redim保存では下限1が保存されないことをご存知ですか?したがって、 `ReDim Preserve xPoints2(contourcount2)'は「zeroeth」スロットを割り当てます。その配列を1から開始する場合は、「ReDim Preserve xPoints2(1 tocontourcount2)」を使用できます。

EDIT2:

Doループの外側にありますCurrent = Min

次に、DoLoop内にあります

smallest = 1     
If smallest = Current Then         
   smallest = 1     
End If 

これは、すべての反復で最小が1であることを意味します。

次に、常に1から始まるForループがあります。

For i = 1 To contourCount         
    If (Current = i) Or (smallest = i) Then
        GoTo continue_loop         
    End If
    'the rest ommited because you never get here
Next 

smallは常に1であるため、常に分岐することに注意してください。

そして最後にあなたはこれを分岐します:

continue_loop: 
Loop While Current <> Min

電流はまだ1であり、最小値が計算されたときに位置1になかったポイントである限り、ループ条件をすぐに満たして終了します。

于 2011-10-13T14:38:41.540 に答える