SRL Archive - Development

Dtm


Wizzup?

2009-11-30 22:38:29

Hoi,

I've promised to rewrite DTM lib, to make it fast and stable. (It's currently quite slow, and also a bit unstable… I'm still using the code I wrote for fun in SCAR…)

So I am…

There's only one downside to my unfinished algo… It doesn't support more than 32 (64 respectively) subpoints. :)

Do you think the limit of 32 subpoints is an issue?
Should we add CTS support per-point to DTM?

YoHoJo

2009-11-30 22:43:17

I cant even think of a cause where you would need more than 7 subpoints?

Boreas

2009-11-30 23:50:19

Do you think the limit of 32 subpoints is an issue?
No. Rewrite later if you really care, but it's not needed as Yoho said, so not a priority.
Should we add CTS support per-point to DTM?
No, DTM is more about shape anyway. But again, maybe in future version if you get time.

EvilChicken!

2009-12-01 02:14:31

No to both points.
I've never used a DTM with more than 15 subpoints.

And, CTS-per-point is a bit overkill IMO.
As Boreas said, these are the kind of things you can implement later (if ever?).

Wizzup?

2009-12-01 06:04:55

Okay, thanks for the input. :)

R0b0t1

2009-12-01 08:58:12

So, hold on. Why a limit of 32. I didn't think your weird bitwise storage was finite.

Wizzup?

2009-12-01 09:01:37

From: R0b0t1
So, hold on. Why a limit of 32. I didn't think your weird bitwise storage was finite.


Indeed, but it does simplify the algorithm. Which is why I asked. if it really is an issue, I can change it to allow infinite (as far as computer allows) subpoints. Shouldn't be such a performance impact I guess.

Nava2

2009-12-01 09:23:34

The CTS is probably something that could be placed in a completely separate function but will be used very seldomly. As long as CTS can be set per DTM then I don't see any issue!

The points, as long as the speed difference is significant, and accuracy is upheld, I see no issue.

mixster

2009-12-01 13:50:34

I can foresee the limit of 32 points being an issue if people start using real DDTM's, but I don't think it would be an issue for a while.

Nava2

2009-12-01 14:25:52

From: mixster
I can foresee the limit of 32 points being an issue if people start using real DDTM's, but I don't think it would be an issue for a while.


What do you mean by real DDTMs?

mixster

2009-12-01 15:02:46

Well, DTM's generated dynamically during script runtime and not just a static DTM or one that just changes colour. For example, item inventory DTM's are more accurate the more points you use, so using more points would be a better idea of you wanted very high precision inventory item finding.

Nava2

2009-12-01 15:05:49

From: mixster
Well, DTM's generated dynamically during script runtime and not just a static DTM or one that just changes colour. For example, item inventory DTM's are more accurate the more points you use, so using more points would be a better idea of you wanted very high precision inventory item finding.


Okay, I follow what you mean, but 32 points would be very slow seems kind of over kill per point.

mixster

2009-12-01 15:17:13

It's only slow because Scar is silly ;)

Wizzup?

2009-12-01 16:23:20

From: Nava2
Okay, I follow what you mean, but 32 points would be very slow seems kind of over kill per point.


It shouldn't have such a performance impact.
The algorithm is now in alpha-stage I guess… There are probably a bug in it, but I took most out. There's still the 32 bit limit, ATM…


function TMFinder.FindDTMs(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2: Integer): Boolean;
var
// Colours of DTMs
C: Array of Integer;

// Bitwise
b: Array of Array of Integer;

i, xxx,yyy: Integer;
W, H: integer;

MA: TBox;

PtrData: TRetData;
Ptr: PRGB32;
PtrInc: Integer;

clR, clG, clB, xx, yy: Integer;
cd: TPRGB32Array;

label EndOfLoop;
label AnotherLoopEnd;



begin
if not DTMConsistent(dtm) then
begin
raise Exception.CreateFmt('FindDTMs: DTM is not consistent.', []);
Exit;
end;
// Get the area we should search in for the Main Point.
writeln(Format('%d, %d, %d, %d', [x1,y1,x2,y2]));
MA := ValidMainPointBox(DTM, x1, y1, x2, y2);
writeln(Format('%d, %d, %d, %d', [MA.x1,MA.y1,MA.x2,MA.y2]));
// TODO: see if main point box is still a valid area. eg, x1 < x2 and y1 < y2

if MA.x1 >= MA.x2 then
raise exception.CreateFmt('FindDTMs, x1 >= x2', []);
if MA.y1 >= MA.y2 then
raise exception.CreateFmt('FindDTMs, y1 >= y2', []);

// Init data structure B.
W := x2 - x1;
H := y2 - y1;
setlength(b, W + 1);
for i := 0 to W do
begin
setlength(b[i], H + 1);
// does setlength init already? if it doesn't, do we want to init here?
// or do we want to init in the loop, as we loop over every b anyway?
//FillChar(b[i][0], SizeOf(Integer) * H, 0);
end;

// C = DTM.C
C := DTM.c;

// Now, we must find the occurances of all colours.
// This part should be turned into a more general function (for DTM Finding).
// Something like FindColorsMultiBooleanArray (?)

// Retreive Client Data.
PtrData := TClient(Client).MWindow.ReturnData(x1, y1, W + 1, H + 1);

// Do we want to "cache" these vars?
// We will, for now. Easier to type.
Ptr := PtrData.Ptr;
PtrInc := PtrData.IncPtrWith;

cd := CalculateRowPtrs(PtrData, h + 1);
writeln(format('w,h: %d, %d', [w,h]));
for yy := 0 to h do
for xx := 0 to w do
begin
//writeln(format('x,y: %d, %d', [xx,yy]));

// main point
if not TClient(Client).MFinder.SimilarColors(dtm.c[0], RGBToColor(cd[yy][xx].R, cd[yy][xx].G, cd[yy][xx].B), dtm.t[0]) then
goto AnotherLoopEnd;
b[xx][yy] := B[xx][yy] or 1;
for i := 1 to dtm.l - 1 do
begin // use square areashape - it covers all.
for xxx := xx - dtm.asz[i] + dtm.p[i].x to xx + dtm.asz[i] + dtm.p[i].x do
for yyy := yy - dtm.asz[i] + dtm.p[i].y to yy + dtm.asz[i]+ dtm.p[i].y do
// may want to remove this line, but I think it is a good optimisation.
if B[xxx][yyy] and (1 shl i) = 0 then
if TClient(Client).MFinder.SimilarColors(dtm.c[i], RGBToColor(cd[yyy][xxx].R, cd[yyy][xxx].G, cd[yyy][xxx].B), dtm.t[i]) then
b[xxx][yyy] := B[xxx][yyy] or (1 shl i)
else
goto AnotherLoopEnd;
end;

AnotherLoopEnd:
//writeln(format('b[%d][%d]: %d' ,[xx,yy,b[xx][yy]]));
end;

{ Debug only }
{for yy := 0 to h do
for xx := 0 to w do
writeln(format('b[%d][%d]: %d' ,[xx,yy,b[xx][yy]]));}

// Now iterate over the data. (Main Point Bounds)
for yy := MA.y1-y1 to MA.y2-y1 do
for xx := MA.x1-x1 to MA.x2-x1 do
begin
writeln(format('Testing for MP at %d, %d', [xx,yy]));
writeln(format('Testing for MP RealPoints at %d, %d', [xx+x1,yy+y1]));
if (b[xx][yy] and 1) = 0 then
continue;
writeln(format('Got a MP at %d, %d', [xx,yy]));
writeln(format('Got a MP Real Points at %d, %d', [xx+x1,yy+y1]));
for i := 1 to dtm.l - 1 do
begin
writeln(format('i: %d',[i]));
case dtm.ash[i] of

{ Example:
3x3 (AreaSize = 1)
X X X
X X X
X X X }
//areasize and areashape. areasize = 0 is completly valid
dtm_Rectangle:
begin
writeln(Format('X - From, To: %d, %d', [xx - dtm.asz[i]+ dtm.p[i].x, xx + dtm.asz[i]+ dtm.p[i].x]));
for xxx := xx - dtm.asz[i] + dtm.p[i].x to xx + dtm.asz[i] + dtm.p[i].x do
for yyy := yy - dtm.asz[i] + dtm.p[i].y to yy + dtm.asz[i]+ dtm.p[i].y do
if b[xxx][yyy] and (1 shl i) = 0 then
goto EndOfLoop;
end;

{ Example:
3x3 (AreaSize = 1)
X
X X X
X }
dtm_Cross:
begin
for xxx := xx - dtm.asz[i] + dtm.p[i].x to xx + dtm.asz[i] + dtm.p[i].x do
begin
writeln(format('Cross - One. %d, %d', [xxx,dtm.p[i].y + yy]));
if b[xxx][dtm.p[i].y + yy] and (1 shl i) = 0 then
goto EndOfLoop;

end;
for yyy := yy - dtm.asz[i] + dtm.p[i].y to yy + dtm.asz[i]+ dtm.p[i].y do
begin
writeln(format('Cross - One. %d, %d', [dtm.p[i].x + xx,yyy]));
if b[dtm.p[i].x + xx][yyy] and (1 shl i) = 0 then
goto EndOfLoop;
end;
end;

{ Example:
3x3 (AreaSize = 1)
X X
X
X X }
dtm_DiagonalCross:
begin
for xxx := -dtm.asz[i] to dtm.asz[i] do
begin
if b[xx + dtm.p[i].x + xxx][yy + dtm.p[i].y + xxx] and (1 shl i) = 0 then
goto EndOfLoop;
if b[xx + dtm.p[i].x + xxx][yy + dtm.p[i].y + xxx] and (1 shl i) = 0 then
goto EndOfLoop;
end;
end

else
begin
raise exception.createFMT('FindDTMs: Invalid Areashape!', []);
Exit;
end;
end;
// point [xx,yy] found if we make it to here
writeln(Format('Wat (Real Points): %d, %d', [xx+x1, yy+y1])); //Good old wat!
end;
writeln(Format('Found a Point: %d, %d', [xx+x1, yy+y1]));
EndOfLoop:
end;
TClient(Client).MWindow.FreeReturnData;
end;

The areashapes annoy me, as I've never really used them. (Except for Square/Rectangle)
I feel like removing them, and make it just use a Square…

Most of it is quite optimal, except for the SimilarColors thing… I just used that to test the algorithm. It will be replaced by a fast comparison soon.

mixster

2009-12-01 17:19:40

I don't think I've known anyone to use anything other than rectangle, though I do think a 45 deg rotated square should be used as default (possibly is cross, but I'm unsure if the cross expands the same way - I think it doesn't except for the given example in the code) for as it makes more sense for point finding than rectangles. Rectangles are quite wasteful and inaccurate if you think about it - in case I explained it badly, (ignore _'s - ensuring silly vb doesn't remove spaces):
__x
_xxx
xxxxx
_xxx
__x

I don't foresee the algorithm for running through these points being taxing compared to others, but it has less points than rectangle and is a more sensible area to check in my opinion :)

Wizzup?

2009-12-02 14:10:07


function TMFinder.FindDTMs(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2, maxToFind: Integer): Boolean;
var
// Colours of DTMs
C: Array of Integer;

// Bitwise
b: Array of Array of Integer;

// bounds
W, H: integer;
MA: TBox;

// for loops, etc
xx, yy: integer;
i, xxx,yyy: Integer;

// for comparions.
clR, clG, clB: Integer;

//clientdata
cd: TPRGB32Array;

PtrData: TRetData;
Ptr: PRGB32;
PtrInc: Integer;

// point count
pc: Integer = 0;

label theEnd;
label AnotherLoopEnd;



begin
if not DTMConsistent(dtm) then
begin
raise Exception.CreateFmt('FindDTMs: DTM is not consistent.', []);
Exit;
end;

// Get the area we should search in for the Main Point.
writeln(Format('%d, %d, %d, %d', [x1,y1,x2,y2]));
MA := ValidMainPointBox(DTM, x1, y1, x2, y2);
writeln(Format('%d, %d, %d, %d', [MA.x1,MA.y1,MA.x2,MA.y2]));

DefaultOperations(MA.x1, MA.y1, MA.x2, MA.y2);

// Init data structure B.
W := x2 - x1;
H := y2 - y1;
setlength(b, W + 1);
for i := 0 to W do
begin
setlength(b[i], H + 1);
// does setlength init already? if it doesn't, do we want to init here?
// or do we want to init in the loop, as we loop over every b anyway?
//FillChar(b[i][0], SizeOf(Integer) * H, 0);
end;

// C = DTM.C
C := DTM.c;

// Now, we must find the occurances of all colours.
// This part should be turned into a more general function (for DTM Finding).
// Something like FindColorsMultiBooleanArray (?)

// Retreive Client Data.
PtrData := TClient(Client).MWindow.ReturnData(x1, y1, W + 1, H + 1);

// Do we want to "cache" these vars?
// We will, for now. Easier to type.
Ptr := PtrData.Ptr;
PtrInc := PtrData.IncPtrWith;

cd := CalculateRowPtrs(PtrData, h + 1);
writeln(format('w,h: %d, %d', [w,h]));

for yy := MA.y1 to MA.y2 do
for xx := MA.x1 to MA.x2 do
begin
// main point
if not SimilarColors(dtm.c[0], RGBToColor(cd[yy][xx].R, cd[yy][xx].G, cd[yy][xx].B), dtm.t[0]) then
goto AnotherLoopEnd;
b[xx][yy] := B[xx][yy] or 1;
for i := 1 to dtm.l - 1 do
begin //change to use other areashapes too.
for xxx := xx - dtm.asz[i] + dtm.p[i].x to xx + dtm.asz[i] + dtm.p[i].x do
for yyy := yy - dtm.asz[i] + dtm.p[i].y to yy + dtm.asz[i]+ dtm.p[i].y do
begin
// may want to remove this line, but I think it is a good optimisation.
if B[xxx][yyy] and (1 shl i) = 0 then
begin
if SimilarColors(dtm.c[i], RGBToColor(cd[yyy][xxx].R, cd[yyy][xxx].G, cd[yyy][xxx].B), dtm.t[i]) then
b[xxx][yyy] := B[xxx][yyy] or (1 shl i)
else
goto AnotherLoopEnd;
end;
end;
end;
//writeln(Format('Found point: (%d, %d)', [xx,yy]));
ClientTPA[pc] := Point(xx, yy);
Inc(pc);
if(pc = maxToFind) then
goto theEnd;
AnotherLoopEnd:
//writeln(format('b[%d][%d]: %d' ,[xx,yy,b[xx][yy]]));
end;

TheEnd:
TClient(Client).MWindow.FreeReturnData;

SetLength(Points, pc);
if pc > 0 then
Move(ClientTPA[0], Points[0], pc * SizeOf(TPoint));
end;

<8 ms for 800x600.
<100ms for 5000x5000.

Wizzup?

2009-12-02 21:05:41

Stress test. Client Width = 5000, Height = 5000.
Random generated DTM with 15 points. Random offset points, random tolerance and random areashape.

956ms, including initializing data that only has to be done once, so it would probably a bit faster.

Client W/H: 5000, 5000
dtm: (-9, 12) c: 0, t: 126, asz: 2
dtm: (13, -2) c: 0, t: 126, asz: 3
dtm: (-9, 13) c: 0, t: 5, asz: 3
dtm: (-10, 4) c: 0, t: 140, asz: 0
dtm: (5, 5) c: 0, t: 180, asz: 1
dtm: (7, -5) c: 0, t: 225, asz: 3
dtm: (14, 8) c: 0, t: 203, asz: 2
dtm: (-6, -9) c: 0, t: 99, asz: 2
dtm: (-9, 8) c: 0, t: 220, asz: 4
dtm: (-3, 12) c: 0, t: 183, asz: 1
dtm: (-12, -6) c: 0, t: 61, asz: 3
dtm: (-9, -15) c: 0, t: 244, asz: 4
dtm: (-2, -6) c: 0, t: 188, asz: 2
dtm: (6, -6) c: 0, t: 7, asz: 0
dtm: (10, 4) c: 0, t: 123, asz: 3
dtm: (-5, -5) c: 0, t: 240, asz: 3
dtm: (-8, 8) c: 0, t: 107, asz: 1
dtm: (-13, 0) c: 0, t: 203, asz: 4
dtm: (1, -14) c: 0, t: 90, asz: 4
956ms
482 points found
0: (3948, 45)
1: (666, 57)
2: (2003, 57)
3: (732, 71)
4: (1530, 81)
5: (3280, 89)
6: (1383, 108)
7: (4480, 114)
8: (490, 124)
9: (4427, 143)
10: (2775, 146)
11: (4234, 159)
12: (3229, 182)
13: (4909, 188)
14: (3931, 191)
15: (4800, 192)
16: (1521, 211)
17: (3590, 213)
18: (1063, 217)
19: (4844, 233)
20: (1805, 234)
21: (3660, 238)
22: (721, 261)
23: (469, 272)
24: (3691, 276)
25: (4889, 280)
26: (2955, 282)
27: (3866, 295)
28: (4347, 295)
29: (3661, 303)
30: (3779, 311)
31: (372, 320)
32: (3449, 326)
33: (145, 353)
34: (354, 362)
35: (3799, 370)
36: (1833, 376)
37: (566, 384)
38: (3439, 403)
39: (431, 426)
40: (3380, 446)
41: (1069, 452)
42: (4822, 475)
43: (1228, 479)
44: (424, 481)
45: (1512, 483)
46: (1654, 483)
47: (3261, 495)
48: (4636, 497)
49: (4514, 500)
50: (4609, 507)
51: (3483, 513)
52: (1688, 526)
53: (757, 546)
54: (1309, 568)
55: (4922, 568)
56: (341, 574)
57: (3436, 574)
58: (3789, 578)
59: (139, 590)
60: (4467, 594)
61: (1747, 595)
62: (1344, 609)
63: (2445, 609)
64: (4705, 623)
65: (3415, 658)
66: (129, 664)
67: (4472, 678)
68: (2301, 679)
69: (2400, 688)
70: (927, 712)
71: (3394, 716)
72: (1449, 720)
73: (2180, 720)
74: (241, 726)
75: (4927, 731)
76: (3694, 738)
77: (4826, 741)
78: (4902, 741)
79: (4710, 746)
80: (4896, 773)
81: (2848, 784)
82: (2126, 785)
83: (2264, 786)
84: (3742, 788)
85: (97, 796)
86: (564, 827)
87: (4250, 845)
88: (1446, 868)
89: (2305, 892)
90: (4488, 895)
91: (753, 926)
92: (484, 932)
93: (247, 952)
94: (3479, 958)
95: (2177, 968)
96: (4346, 970)
97: (1580, 987)
98: (458, 991)
99: (565, 1009)
100: (1849, 1009)
101: (253, 1018)
102: (1941, 1018)
103: (2091, 1037)
104: (4359, 1039)
105: (2567, 1064)
106: (2927, 1075)
107: (4532, 1080)
108: (510, 1107)
109: (4503, 1108)
110: (4912, 1110)
111: (3375, 1115)
112: (653, 1134)
113: (1667, 1151)
114: (3623, 1186)
115: (3529, 1205)
116: (217, 1208)
117: (2028, 1214)
118: (716, 1221)
119: (1826, 1229)
120: (1829, 1229)
121: (3693, 1229)
122: (1619, 1233)
123: (426, 1260)
124: (2556, 1272)
125: (3564, 1272)
126: (4867, 1295)
127: (753, 1300)
128: (4638, 1331)
129: (2649, 1333)
130: (4393, 1349)
131: (477, 1353)
132: (3094, 1391)
133: (1300, 1392)
134: (1648, 1397)
135: (1396, 1413)
136: (1021, 1417)
137: (4895, 1433)
138: (1419, 1456)
139: (2164, 1510)
140: (1564, 1520)
141: (1027, 1532)
142: (627, 1534)
143: (3279, 1559)
144: (315, 1571)
145: (2998, 1613)
146: (4794, 1638)
147: (3534, 1644)
148: (1725, 1648)
149: (3967, 1679)
150: (491, 1692)
151: (2087, 1697)
152: (1939, 1700)
153: (432, 1701)
154: (3008, 1703)
155: (2353, 1706)
156: (1812, 1708)
157: (2406, 1712)
158: (936, 1719)
159: (2825, 1722)
160: (1240, 1725)
161: (2305, 1734)
162: (3403, 1739)
163: (1635, 1741)
164: (1908, 1745)
165: (897, 1756)
166: (513, 1764)
167: (116, 1769)
168: (1748, 1799)
169: (3639, 1813)
170: (2078, 1827)
171: (47, 1842)
172: (3750, 1847)
173: (1539, 1850)
174: (3376, 1864)
175: (3506, 1865)
176: (4778, 1899)
177: (3696, 1905)
178: (3546, 1906)
179: (1277, 1912)
180: (1236, 1917)
181: (2631, 1936)
182: (1123, 1938)
183: (4966, 1975)
184: (707, 1977)
185: (2520, 1989)
186: (4209, 1995)
187: (104, 1999)
188: (4957, 2001)
189: (1943, 2016)
190: (791, 2024)
191: (1060, 2026)
192: (2899, 2033)
193: (3814, 2042)
194: (2784, 2067)
195: (4263, 2068)
196: (1668, 2069)
197: (978, 2070)
198: (444, 2080)
199: (2749, 2084)
200: (2074, 2086)
201: (655, 2094)
202: (2411, 2102)
203: (2541, 2109)
204: (353, 2111)
205: (2143, 2118)
206: (2121, 2131)
207: (3114, 2134)
208: (157, 2144)
209: (3168, 2154)
210: (2766, 2161)
211: (695, 2162)
212: (2053, 2176)
213: (583, 2186)
214: (1235, 2189)
215: (1889, 2212)
216: (1127, 2219)
217: (2785, 2224)
218: (1903, 2235)
219: (3104, 2265)
220: (4724, 2287)
221: (1228, 2310)
222: (2858, 2311)
223: (2271, 2322)
224: (3337, 2324)
225: (4200, 2325)
226: (1533, 2328)
227: (1687, 2337)
228: (4421, 2347)
229: (3396, 2352)
230: (4571, 2361)
231: (1002, 2362)
232: (518, 2363)
233: (1153, 2365)
234: (4917, 2365)
235: (2298, 2380)
236: (1530, 2393)
237: (575, 2404)
238: (686, 2404)
239: (2327, 2407)
240: (521, 2408)
241: (4619, 2408)
242: (503, 2409)
243: (3243, 2418)
244: (4567, 2421)
245: (3382, 2436)
246: (285, 2450)
247: (1755, 2510)
248: (4071, 2517)
249: (1325, 2545)
250: (2225, 2549)
251: (3094, 2561)
252: (2928, 2585)
253: (3254, 2598)
254: (152, 2617)
255: (2744, 2652)
256: (1388, 2667)
257: (2555, 2677)
258: (205, 2698)
259: (1146, 2729)
260: (812, 2733)
261: (2897, 2759)
262: (2030, 2771)
263: (2525, 2772)
264: (4147, 2786)
265: (2808, 2789)
266: (2508, 2826)
267: (2331, 2829)
268: (1412, 2831)
269: (1771, 2832)
270: (158, 2851)
271: (1282, 2853)
272: (3383, 2855)
273: (4869, 2860)
274: (641, 2863)
275: (3881, 2866)
276: (2436, 2870)
277: (2620, 2877)
278: (4695, 2877)
279: (4485, 2881)
280: (1484, 2899)
281: (2694, 2900)
282: (1707, 2901)
283: (1594, 2921)
284: (1270, 2932)
285: (2682, 2937)
286: (4270, 2939)
287: (3679, 2949)
288: (2820, 2951)
289: (554, 2973)
290: (2052, 2973)
291: (87, 2995)
292: (2996, 3009)
293: (1886, 3022)
294: (18, 3024)
295: (928, 3025)
296: (601, 3026)
297: (3020, 3035)
298: (2962, 3042)
299: (417, 3076)
300: (1093, 3086)
301: (3772, 3086)
302: (2980, 3090)
303: (4555, 3104)
304: (4398, 3108)
305: (4977, 3113)
306: (3938, 3117)
307: (1597, 3126)
308: (1956, 3126)
309: (2982, 3126)
310: (2589, 3164)
311: (851, 3170)
312: (3966, 3182)
313: (4531, 3195)
314: (1477, 3228)
315: (180, 3244)
316: (400, 3248)
317: (4842, 3274)
318: (4726, 3283)
319: (3300, 3289)
320: (434, 3293)
321: (1681, 3294)
322: (228, 3309)
323: (4177, 3328)
324: (1845, 3333)
325: (3492, 3347)
326: (3372, 3380)
327: (3728, 3381)
328: (2118, 3401)
329: (4800, 3419)
330: (1053, 3426)
331: (280, 3450)
332: (863, 3455)
333: (2653, 3479)
334: (4256, 3479)
335: (21, 3483)
336: (3928, 3487)
337: (3888, 3488)
338: (3678, 3490)
339: (2160, 3492)
340: (325, 3500)
341: (1346, 3501)
342: (3385, 3503)
343: (4573, 3572)
344: (3599, 3583)
345: (1238, 3585)
346: (1140, 3601)
347: (1510, 3605)
348: (132, 3614)
349: (2514, 3615)
350: (4510, 3620)
351: (1115, 3658)
352: (1434, 3715)
353: (1152, 3746)
354: (3390, 3759)
355: (4210, 3762)
356: (4766, 3780)
357: (2848, 3800)
358: (2362, 3810)
359: (2752, 3810)
360: (416, 3817)
361: (487, 3820)
362: (1326, 3848)
363: (2407, 3863)
364: (34, 3889)
365: (2939, 3889)
366: (4218, 3902)
367: (4672, 3902)
368: (813, 3903)
369: (2837, 3904)
370: (1952, 3910)
371: (3010, 3920)
372: (3204, 3920)
373: (4078, 3922)
374: (253, 3926)
375: (4796, 3928)
376: (3859, 3934)
377: (2333, 3938)
378: (2048, 3941)
379: (3859, 3956)
380: (3185, 3975)
381: (1273, 3983)
382: (2428, 3985)
383: (4179, 3994)
384: (2623, 4009)
385: (853, 4017)
386: (4626, 4029)
387: (3360, 4043)
388: (3858, 4046)
389: (1445, 4050)
390: (500, 4055)
391: (613, 4056)
392: (4395, 4057)
393: (3081, 4063)
394: (1746, 4071)
395: (1612, 4072)
396: (1452, 4082)
397: (4727, 4096)
398: (613, 4108)
399: (4279, 4114)
400: (1102, 4151)
401: (2045, 4161)
402: (3362, 4163)
403: (4311, 4169)
404: (3469, 4175)
405: (272, 4177)
406: (4105, 4186)
407: (1633, 4196)
408: (844, 4205)
409: (512, 4212)
410: (3015, 4220)
411: (2315, 4227)
412: (315, 4243)
413: (1714, 4250)
414: (3856, 4253)
415: (4428, 4254)
416: (1553, 4262)
417: (712, 4266)
418: (352, 4268)
419: (2024, 4289)
420: (3507, 4291)
421: (3454, 4302)
422: (1463, 4307)
423: (342, 4331)
424: (4973, 4334)
425: (2217, 4342)
426: (1828, 4351)
427: (220, 4352)
428: (4671, 4358)
429: (4444, 4389)
430: (2208, 4392)
431: (3545, 4423)
432: (100, 4424)
433: (3704, 4437)
434: (4800, 4442)
435: (345, 4444)
436: (3638, 4445)
437: (4772, 4463)
438: (3269, 4474)
439: (3090, 4495)
440: (2693, 4505)
441: (1001, 4518)
442: (3624, 4524)
443: (423, 4532)
444: (192, 4540)
445: (3768, 4542)
446: (3979, 4545)
447: (1285, 4568)
448: (3666, 4572)
449: (4111, 4595)
450: (3212, 4606)
451: (116, 4609)
452: (2254, 4635)
453: (3639, 4652)
454: (808, 4661)
455: (1623, 4669)
456: (2579, 4684)
457: (2995, 4714)
458: (2969, 4716)
459: (1943, 4725)
460: (4549, 4742)
461: (4786, 4746)
462: (844, 4753)
463: (3185, 4761)
464: (3151, 4766)
465: (4819, 4768)
466: (1732, 4772)
467: (3283, 4795)
468: (2750, 4801)
469: (4768, 4810)
470: (401, 4815)
471: (2674, 4861)
472: (3452, 4908)
473: (4389, 4913)
474: (1722, 4920)
475: (1541, 4923)
476: (3386, 4934)
477: (1100, 4947)
478: (1161, 4961)
479: (4249, 4966)
480: (2105, 4975)
481: (2157, 4978)
Our current bitmap is being freed! Defaulting to Desktop.

R0b0t1

2009-12-02 21:10:06

What are SCAR's times?

Wizzup?

2009-12-02 21:10:51

From: R0b0t1
What are SCAR's times?


SCAR has no FindDTMs. Only FindDTM. I'm pretty sure my FindDTM is faster than SCAR's too, though. :)

Nava2

2009-12-02 21:40:23

From: Wizzup?
SCAR has no FindDTMs. Only FindDTM. I'm pretty sure my FindDTM is faster than SCAR's too, though. :)


Can you prove it? :)