Школоло / Говнокод #17232 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
function TMFinder.FindDTMs(DTM: TMDTM; out Points: TPointArray; x1, y1, x2, y2, maxToFind: Integer): Boolean;
var
  Len: integer;
  DPoints: PMDTMPoint;
  b: array of array of Integer;
  ch: array of array of integer;
  W, H: integer;
  MA: TBox;
  MaxX, MaxY: integer;
  xx, yy: integer;
  i, xxx, yyy: Integer;
  StartX, StartY, EndX, EndY: integer;
  cd: TPRGB32Array;
  PtrData: TRetData;
  pc: Integer = 0;
  Found: boolean;
  goodPoints: array of Boolean;
  col_arr, tol_arr: array of Integer;
  ctsinfoarray: TCTSInfoArray;
  compare: TCTSCompareFunction;
label
  theEnd;
begin
  MA := ValidMainPointBox(DTM, x1, y1, x2, y2);
  Len := dtm.Count;
  DPoints := dtm.PPoints;
  setlength(goodPoints, Len);
  for i := 0 to Len - 1 do
    goodPoints[i] := not DPoints[i].bp;
  W := x2 - x1;
  H := y2 - y1;
  setlength(b, (W + 1));
  setlength(ch, (W + 1));
  for i := 0 to W do
  begin
    setlength(ch[i], (H + 1));
    FillChar(ch[i][0], SizeOf(Integer) * (H + 1), 0);
    setlength(b[i], (H + 1));
    FillChar(b[i][0], SizeOf(Integer) * (H + 1), 0);
  end;
  PtrData := TClient(Client).IOManager.ReturnData(x1, y1, W + 1, H + 1);
  SetLength(col_arr, Len);
  SetLength(tol_arr, Len);
  for i := 0 to Len - 1 do
  begin
    col_arr[i] := DPoints[i].c;
    tol_arr[i] := DPoints[i].t;
  end;
  ctsinfoarray := Create_CTSInfoArray(col_arr, tol_arr);
  compare := Get_CTSCompare(Self.CTS);
  cd := CalculateRowPtrs(PtrData, h + 1);
  MA.x1 := MA.x1 - x1;
  MA.y1 := MA.y1 - y1;
  MA.x2 := MA.x2 - x1;
  MA.y2 := MA.y2 - y1;
  MaxX := x2 - x1;
  MaxY := y2 - y1;
  for yy := MA.y1 to MA.y2 do
    for xx := MA.x1 to MA.x2 do
    begin
      for i := 0 to Len - 1 do
      begin
        Found := false;
        StartX := max(0, xx - DPoints[i].asz + DPoints[i].x);
        StartY := max(0, yy - DPoints[i].asz + DPoints[i].y);
        EndX := Min(MaxX, xx + DPoints[i].asz + DPoints[i].x);
        EndY := Min(MaxY, yy + DPoints[i].asz + DPoints[i].y);
        for xxx := StartX to EndX do
        begin
          for yyy := StartY to EndY do
          begin
            if ch[xxx][yyy] and (1 shl i) = 0 then
            begin
              ch[xxx][yyy] := ch[xxx][yyy] or (1 shl i);
              if compare(ctsinfoarray[i], @ cd[yyy][xxx]) then
                b[xxx][yyy] := b[xxx][yyy] or (1 shl i);
            end;
            if (b[xxx][yyy] and (1 shl i) <> 0) then
            begin
              if GoodPoints[i] then
              begin
                Found := true;
                break;
              end
              else
                goto AnotherLoopEnd;
            end;
          end;
          if Found then
            Break;
        end;
        if (not found) and (GoodPoints[i]) then
          goto AnotherLoopEnd;
      end;
      ClientTPA[pc] := Point(xx + x1, yy + y1);
      Inc(pc);
      if (pc = maxToFind) then
        goto theEnd;
    end;
  TheEnd: Free_CTSInfoArray(ctsinfoarray);

Охх...читать такое - можно и мозг повредить.

Запостил: Cynicrus Cynicrus, (Updated )

Комментарии (0) RSS

Добавить комментарий

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8