MODULE CrossFeatures2D; IMPORT Wr, Thread; IMPORT FeatureMapper2D AS Mapper; FROM Mapper IMPORT NAT, LONG, Nhood, Nhoods, CoNhoods, Features, CoFeatures; REVEAL T = Public BRANDED OBJECT OVERRIDES init := Init; print := Print; eval := Eval; diff := Diff; defined := Defined; END; PROCEDURE Init(s: T; NL: NAT): T = BEGIN s.NL := NL; s.NF := 5*NL; RETURN s END Init; PROCEDURE Print(<*UNUSED*> s: T; wr: Wr.T) = <* FATAL Wr.Failure, Thread.Alerted *> BEGIN Wr.PutText(wr, "Cross: the five nearest neighbors\n"); Wr.Flush(wr) END Print; PROCEDURE Eval(s: T; READONLY n: Nhoods; VAR t: Features) = BEGIN FOR i := 0 TO s.NL-1 DO WITH n = n[i], t = SUBARRAY(t, 5*i, 5) DO t[0] := FLOAT(n[00,00], LONG); t[1] := FLOAT(n[00,-1], LONG); t[2] := FLOAT(n[00,+1], LONG); t[3] := FLOAT(n[-1,00], LONG); t[4] := FLOAT(n[+1,00], LONG) END END END Eval; PROCEDURE Diff( s: T; READONLY dEdt: CoFeatures; <*UNUSED*> READONLY t: Features; <*UNUSED*> READONLY n: Nhoods; VAR dEdn: CoNhoods; ) = BEGIN FOR i := 0 TO s.NL-1 DO WITH dEdt = SUBARRAY(dEdt, 5*i, 5), dEdn = dEdn[i] DO dEdn[00,00] := FLOAT(dEdt[0]); dEdn[-1,00] := FLOAT(dEdt[3]); dEdn[+1,00] := FLOAT(dEdt[4]); dEdn[00,-1] := FLOAT(dEdt[1]); dEdn[00,+1] := FLOAT(dEdt[2]); dEdn[-1,-1] := 0.0; dEdn[+1,-1] := 0.0; dEdn[-1,+1] := 0.0; dEdn[+1,+1] := 0.0; END END END Diff; PROCEDURE Defined( <*UNUSED*> s: T; READONLY m: Nhood ): BOOLEAN = BEGIN RETURN m[00,00] > 0.5 AND m[00,-1] > 0.5 AND m[00,+1] > 0.5 AND m[-1,00] > 0.5 AND m[+1,00] > 0.5 END Defined; BEGIN END CrossFeatures2D.