-
Notifications
You must be signed in to change notification settings - Fork 12
/
RigidTransformation.pas
122 lines (98 loc) · 3.47 KB
/
RigidTransformation.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// ###################################################################
// #### This file is part of the mrimageutils project, depends on
// #### the mathematics library project and is
// #### offered under the licence agreement described on
// #### http://www.mrsoft.org/
// ####
// #### Copyright:(c) 2012, Michael R. . All rights reserved.
// ####
// #### Unless required by applicable law or agreed to in writing, software
// #### distributed under the License is distributed on an "AS IS" BASIS,
// #### WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// #### See the License for the specific language governing permissions and
// #### limitations under the License.
// ###################################################################
unit RigidTransformation;
// #######################################################
// #### Base rigid object transformations
// #######################################################
interface
uses Classes, Registration, Matrix, BaseMathPersistence;
// #######################################################
// #### Common properties for rigid mappings
// a rigid mapping is defined by an afine transformation:
type
TBaseRigidPtsRegistration = class(TBasePtsFromToMapping)
private
fMapping : TDoubleMatrix;
protected
property Mapping : TDoubleMatrix read fMapping;
procedure DefineProps; override;
function PropTypeOfName(const Name : string) : TPropType; override;
function OnLoadObject(const Name : String; obj : TBaseMathPersistence) : boolean; override;
public
function MapPoints(const pts : TPtsMappingObj) : TPtsMappingObj; override;
constructor Create;
destructor Destroy; override;
end;
implementation
uses SysUtils, Types;
{ TBaseRigidPtsRegistration }
const cRigidRegMapping = 'RigidMapping';
constructor TBaseRigidPtsRegistration.Create;
begin
inherited Create;
fMapping := TDoubleMatrix.Create;
end;
procedure TBaseRigidPtsRegistration.DefineProps;
begin
if Assigned(fMapping) then
AddObject(cRigidRegMapping, fMapping);
end;
function TBaseRigidPtsRegistration.PropTypeOfName(
const Name: string): TPropType;
begin
if CompareText(Name, cRigidRegMapping) = 0
then
Result := ptObject
else
Result := inherited PropTypeOfName(Name);
end;
destructor TBaseRigidPtsRegistration.Destroy;
begin
fMapping.Free;
inherited;
end;
function TBaseRigidPtsRegistration.MapPoints(
const pts: TPtsMappingObj): TPtsMappingObj;
var ptsMtx : TDoubleMatrix;
resMtx : TDoubleMatrix;
begin
Result := nil;
if not Assigned(fMapping) then
exit;
// #######################################################
// #### Map points in two steps
ptsMtx := pts.HmgPtsAsMtx;
try
ptsMtx.TransposeInPlace;
resMtx := fMapping.Mult(ptsMtx);
resMtx.TransposeInPlace;
resMtx.SetSubMatrix(0, 0, ptsMtx.Height - 1, resMtx.Height);
Result := TPtsMappingObj.Create(resMtx, True);
finally
fMapping.UseFullMatrix;
ptsMtx.Free;
end;
end;
function TBaseRigidPtsRegistration.OnLoadObject(const Name: String;
obj: TBaseMathPersistence): boolean;
begin
Result := True;
if CompareText(Name, cRigidRegMapping) = 0
then
fMapping := obj as TDoubleMatrix
else
Result := inherited OnLoadObject(Name, Obj);
end;
end.