Kilon

I can probably help you as it was in a Smalltalk application that I developed in the early 1990s, ObjectiveFM, for my doctoral dissertation and later was a commercial product. The method is below and it is for a cubic Bezier spline. I am considering add a GIS package to Pharo and would like to have assistance. I would also note that you should look at the series of books called Graphics Gems (5 books) that are a great resource.

Bob Williams


correlatesTo: testPoint within: correlationDistance

    | dz index point return singleSpline aPoint testReturn |
"self halt."
    aPoint := testPoint.
    return := nil.
    dz := self controlPoints first - aPoint.
    ((dz dotProduct: dz) < self minimumDistance)
        ifTrue: [
            ^ self controlPoints first ].

    dz := self controlPoints last - aPoint.
    ((dz dotProduct: dz) < self minimumDistance)
        ifTrue: [
            ^ self controlPoints last].

    index := -2.
    ((controlPoints size) // 3) timesRepeat: [
        index := index + 3.
"eliminate segments from consideration if the bounding box about them does not contain aPoint"
        singleSpline := OFMSingleBezierSpline createFrom:
            (Array     with: (controlPoints at: index)
            with: (controlPoints at: index +1)
            with: (controlPoints at: index +2)
            with: (controlPoints at: index +3)

        point := singleSpline nearestPointOnCurveFor: aPoint.
        (point notNil)
            ifTrue: [
                ((point distanceFrom: aPoint) <= correlationDistance)
                    ifTrue: [ testReturn := true ]
                    ifFalse: [ testReturn := false ] ]
            ifFalse: [
point := ((singleSpline z1 distanceFrom: aPoint) < (singleSpline z2 distanceFrom: aPoint))
                ifTrue: [ singleSpline z1 ] ifFalse: [singleSpline z2 ].
                    ((point distanceFrom: aPoint) < correlationDistance)
                    ifTrue: [ testReturn := true ]
                    ifFalse: [ testReturn := false ] ].
        (testReturn)
            ifTrue: [
                (return isNil)
                    ifTrue: [
                        return := point ]
                    ifFalse: [
((point distanceFrom: aPoint) < (return distanceFrom: aPoint))
                            ifTrue: [return := point] ]]].
    ^return

Reply via email to