//Delphi function TTopoGrid.InvDistProc(APow: double; ALines: TPoint; AStep: TPoint2D; AMin: TPoint3D): integer; var row, col, pnt: integer; pow2: double; Grow, Diff: TPoint2D; zval, wg2, wg1: double; begin Result := -1; pow2 := APow/2.0; for row:=0 to ALines.Y-1 do begin if Assigned(FOnCalcProgress) then FOnCalcProgress(row, ALines.Y); Grow.Y := AMin.Y + row*AStep.Y; for col:=0 to ALines.X-1 do begin if Assigned(FOnCalcCancel) then if FOnCalcCancel then Exit; Grow.X := AMin.X + col*AStep.X; // FindNearPoints(Grow); case FSearchMethod of smNorm: FindPoints0(Grow); smQuad: FindPointsN(4, Grow); smOct: FindPointsN(8, Grow); smAll: FNearPoints := FTopoData.Count; end; zval := 0.0; wg2 := 0.0; for pnt:=0 to FNearPoints-1 do begin // Diff.X := Grow.X - PPoint3D(FTopoData.Items[FPointsPtr[pnt]])^.X; // Diff.Y := Grow.Y - PPoint3D(FTopoData.Items[FPointsPtr[pnt]])^.Y; Diff.X := Grow.X - TopoData[FPointsPtr[pnt]].X; Diff.Y := Grow.Y - TopoData[FPointsPtr[pnt]].Y; wg1 := Power(Diff.X*Diff.X + Diff.Y*Diff.Y, pow2); if wg1 < MinDouble then wg1 := MinDouble; // zval := zval + PPoint3D(FTopoData.Items[FPointsPtr[pnt]])^.Z/wg1; zval := zval + TopoData[FPointsPtr[pnt]].Z/wg1; wg2 := wg2 + 1.0/wg1; end; if wg2 > 0.0 then FGrid[col][row] := zval/wg2 else FGrid[col][row] := MaxDouble; end; end; Result := ALines.Y; end; //C# private int InvDistProc(double APow, Point ALines, Point2D AStep, Point3D AMin) { int row, col, pnt; double pow2; double GrowX, GrowY, DiffX, DiffY; double zval, wg2, wg1; pow2 = APow / 2.0; for (row = 0; row < ALines.Y; row++) { CalcEvent.CalcProgressHandler(row + 1, ALines.Y); GrowY = AMin.Y + row * AStep.Y; for (col = 0; col < ALines.X; col++) { // if (CalcEvent.CalcCancelHandler()) return -2; GrowX = AMin.X + col * AStep.X; // FindNearPoints(Grow); switch (FSearchMethod) { case TSearchMethod.smNorm: FindPoints0(GrowX, GrowY); break; case TSearchMethod.smQuad: FindPointsN(4, GrowX, GrowY); break; case TSearchMethod.smOct: FindPointsN(8, GrowX, GrowY); break; case TSearchMethod.smAll: FNearPoints = FTopoData.Count; break; } zval = 0.0; wg2 = 0.0; for (pnt = 0; pnt < FNearPoints; pnt++) { DiffX = GrowX - FTopoData[FPointsPtr[pnt]].X; DiffY = GrowY - FTopoData[FPointsPtr[pnt]].Y; wg1 = Math.Pow(DiffX * DiffX + DiffY * DiffY, pow2); if (wg1 < double.MinValue) wg1 = double.MinValue; zval = zval + FTopoData[FPointsPtr[pnt]].Z / wg1; wg2 = wg2 + 1.0 / wg1; } if (wg2 > 0.0) FGrid[col, row] = zval / wg2; else FGrid[col, row] = double.MaxValue; } } return ALines.Y; } |