I have below code that needs to be recoded into Python for use in ESRI ArcGIS software. I would greatly appreciate any assistance. Thanks Sheri

/* The Inner Loop of the Douglas-Peucker line generalization algorithm is the process of finding, for a section of a polyline, the vertex that is furthest from the line segment joining the two endpoints. The method coded below in C (or C++) is the most efficient, in terms of operation counts, that I have seen. */ /* _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ */

long FurthestFromSegment ( /* Return index of furthest point. */ long startindex, /* Index of start vertex in arrays. */ long endindex, /* Index of end vertex in arrays. */ double *x , /* Array, abscissae of polyline vertices. */ double *y , /* Array, ordinates of polyline vertices. */ double *distMaxSquare /* Return square of maximum distance. */ ) /* This function, given a section of a polyline in arrays, will return the index of the intermediate node that is furthest from the segment joining the two endpoints of the section, and the square of the distance from the segment.

If no intermediate point exists, then the returned index will be the index of the start vertex and the returned distance squared will be -1.0 . Caution: Do not calculate the square root of this returned value without ruling out the possibility that it may have defaulted to -1.0 . In a normal Douglas-Peucker application, you should never have to calculate the square root of this output value, and you should never need to invoke this function without intermediate points. */ { /* The variable names below assume we find the distance of point "A" from segment "BC" . */ long index, outindex ; double distSquare, bcSquare ; double cx, cy, bx, by, ax, ay ; double bcx, bcy, bax, bay, cax, cay ;

*distMaxSquare = -1.0 ; if ( endindex < startindex + 2 ) return startindex ; outindex = startindex ; bx = x[startindex] ; by = y[startindex] ; cx = x[endindex] ; cy = y[endindex] ; /* Find vector BC and the Square of its length. */ bcx = cx - bx ; bcy = cy - by ; bcSquare = bcx * bcx + bcy * bcy ; /* The inner loop: */ for ( index = startindex + 1 ; index < endindex ; index++ ) { /* Find vector BA . */ ax = x[index] ; ay = y[index] ; bax = ax - bx ; bay = ay - by ; /* Do scalar product and check sign. */ if ( bcx * bax + bcy * bay <= 0.0 ) { /* Closest point on segment is B; */ /* find its distance (squared) from A . */ distSquare = bax * bax + bay * bay ; } else { /* Find vector CA . */ cax = ax - cx ; cay = ay - cy ; /* Do scalar product and check sign. */ if ( bcx * cax + bcy * cay >= 0.0 ) { /* Closest point on segment is C; */ /* find its distance (squared) from A . */ distSquare = cax * cax + cay * cay ; } else { /* Closest point on segment is between B and C; */ /* Use perpendicular distance formula. */ distSquare = cax * bay - cay * bax ; distSquare = distSquare * distSquare / bcSquare ; /* Note that if bcSquare be zero, the first of the three branches will be selected, so division by zero will not occur here. */ } }

if ( distSquare > *distMaxSquare ) { outindex = index ; *distMaxSquare = distSquare ; } } /* Note that in the inner loop above, if we follow the most common path where the perpendicular distance is the one to calculate, then for each intermediate vertex the float operation count is 1 divide, 7 multiplies, 5 subtracts, 1 add, and 2 compares. */

return outindex ; }

--------------------------------- Need a quick answer? Get one in minutes from people who know. Ask your question on Yahoo! Answers.