Luxophia

Форк
0
/
LUX.Curve.BSpline.D2.pas 
260 строк · 6.1 Кб
1
unit LUX.Curve.BSpline.D2;
2

3
interface
4

5
uses
6
  LUX,
7
  LUX.D1,
8
  LUX.D2,
9
  LUX.D4,
10
  LUX.M4, // LUX.D4x4,
11
  LUX.Curve, LUX.Curve.BSpline;
12

13
function BSpline4(const X_, Y_: Single): Single; overload;
14
function BSpline4(const X_, Y_: Double): Double; overload;
15
function BSpline4(const X_, Y_: TdSingle): TdSingle; overload;
16
function BSpline4(const X_, Y_: TdDouble): TdDouble; overload;
17

18
procedure BSplin4(const T_: TSingle2D; out Ws_: TSingleM4); overload;
19
procedure BSplin4(const T_: TDouble2D; out Ws_: TDoubleM4); overload;
20
procedure BSplin4(const T_: TdSingle2D; out Ws_: TdSingleM4); overload;
21
procedure BSplin4(const T_: TdDouble2D; out Ws_: TdDoubleM4); overload;
22

23
function BSplin4(const Ps_: TSingleM4; const T_: TSingle2D): Single; overload;
24
function BSplin4(const Ps_: TDoubleM4; const T_: TDouble2D): Double; overload;
25
function BSplin4(const Ps_: TdSingleM4; const T_: TdSingle2D)
26
  : TdSingle; overload;
27
function BSplin4(const Ps_: TdDoubleM4; const T_: TdDouble2D)
28
  : TdDouble; overload;
29

30
implementation
31

32
function BSpline4(const X_, Y_: Single): Single;
33
begin
34
  Result := BSpline4(Y_) * BSpline4(X_);
35
end;
36

37
function BSpline4(const X_, Y_: Double): Double;
38
begin
39
  Result := BSpline4(Y_) * BSpline4(X_);
40
end;
41

42
function BSpline4(const X_, Y_: TdSingle): TdSingle;
43
begin
44
  Result := BSpline4(Y_) * BSpline4(X_);
45
end;
46

47
function BSpline4(const X_, Y_: TdDouble): TdDouble;
48
begin
49
  Result := BSpline4(Y_) * BSpline4(X_);
50
end;
51

52
// ------------------------------------------------------------------------------
53

54
procedure BSplin4(const T_: TSingle2D; out Ws_: TSingleM4);
55
var
56
  WX, WY: TSingle4D;
57
begin
58
  BSpline4(T_.X, WX);
59
  BSpline4(T_.Y, WY);
60

61
  with Ws_ do
62
  begin
63
    _11 := WY._1 * WX._1;
64
    _12 := WY._1 * WX._2;
65
    _13 := WY._1 * WX._3;
66
    _14 := WY._1 * WX._4;
67
    _21 := WY._2 * WX._1;
68
    _22 := WY._2 * WX._2;
69
    _23 := WY._2 * WX._3;
70
    _24 := WY._2 * WX._4;
71
    _31 := WY._3 * WX._1;
72
    _32 := WY._3 * WX._2;
73
    _33 := WY._3 * WX._3;
74
    _34 := WY._3 * WX._4;
75
    _41 := WY._4 * WX._1;
76
    _42 := WY._4 * WX._2;
77
    _43 := WY._4 * WX._3;
78
    _44 := WY._4 * WX._4;
79
  end;
80
end;
81

82
procedure BSplin4(const T_: TDouble2D; out Ws_: TDoubleM4);
83
var
84
  WX, WY: TDouble4D;
85
begin
86
  BSpline4(T_.X, WX);
87
  BSpline4(T_.Y, WY);
88

89
  with Ws_ do
90
  begin
91
    _11 := WY._1 * WX._1;
92
    _12 := WY._1 * WX._2;
93
    _13 := WY._1 * WX._3;
94
    _14 := WY._1 * WX._4;
95
    _21 := WY._2 * WX._1;
96
    _22 := WY._2 * WX._2;
97
    _23 := WY._2 * WX._3;
98
    _24 := WY._2 * WX._4;
99
    _31 := WY._3 * WX._1;
100
    _32 := WY._3 * WX._2;
101
    _33 := WY._3 * WX._3;
102
    _34 := WY._3 * WX._4;
103
    _41 := WY._4 * WX._1;
104
    _42 := WY._4 * WX._2;
105
    _43 := WY._4 * WX._3;
106
    _44 := WY._4 * WX._4;
107
  end;
108
end;
109

110
procedure BSplin4(const T_: TdSingle2D; out Ws_: TdSingleM4);
111
var
112
  WX, WY: TdSingle4D;
113
begin
114
  BSpline4(T_.X, WX);
115
  BSpline4(T_.Y, WY);
116

117
  with Ws_ do
118
  begin
119
    _11 := WY._1 * WX._1;
120
    _12 := WY._1 * WX._2;
121
    _13 := WY._1 * WX._3;
122
    _14 := WY._1 * WX._4;
123
    _21 := WY._2 * WX._1;
124
    _22 := WY._2 * WX._2;
125
    _23 := WY._2 * WX._3;
126
    _24 := WY._2 * WX._4;
127
    _31 := WY._3 * WX._1;
128
    _32 := WY._3 * WX._2;
129
    _33 := WY._3 * WX._3;
130
    _34 := WY._3 * WX._4;
131
    _41 := WY._4 * WX._1;
132
    _42 := WY._4 * WX._2;
133
    _43 := WY._4 * WX._3;
134
    _44 := WY._4 * WX._4;
135
  end;
136
end;
137

138
procedure BSplin4(const T_: TdDouble2D; out Ws_: TdDoubleM4);
139
var
140
  WX, WY: TdDouble4D;
141
begin
142
  BSpline4(T_.X, WX);
143
  BSpline4(T_.Y, WY);
144

145
  with Ws_ do
146
  begin
147
    _11 := WY._1 * WX._1;
148
    _12 := WY._1 * WX._2;
149
    _13 := WY._1 * WX._3;
150
    _14 := WY._1 * WX._4;
151
    _21 := WY._2 * WX._1;
152
    _22 := WY._2 * WX._2;
153
    _23 := WY._2 * WX._3;
154
    _24 := WY._2 * WX._4;
155
    _31 := WY._3 * WX._1;
156
    _32 := WY._3 * WX._2;
157
    _33 := WY._3 * WX._3;
158
    _34 := WY._3 * WX._4;
159
    _41 := WY._4 * WX._1;
160
    _42 := WY._4 * WX._2;
161
    _43 := WY._4 * WX._3;
162
    _44 := WY._4 * WX._4;
163
  end;
164
end;
165

166
// ------------------------------------------------------------------------------
167

168
function BSplin4(const Ps_: TSingleM4; const T_: TSingle2D): Single;
169
var
170
  WX, WY: TSingle4D;
171
  P1, P2, P3, P4: Single;
172
begin
173
  BSpline4(T_.X, WX);
174
  BSpline4(T_.Y, WY);
175

176
  with WX do
177
  begin
178
    P1 := _1 * Ps_._11 + _2 * Ps_._12 + _3 * Ps_._13 + _4 * Ps_._14;
179
    P2 := _1 * Ps_._21 + _2 * Ps_._22 + _3 * Ps_._23 + _4 * Ps_._24;
180
    P3 := _1 * Ps_._31 + _2 * Ps_._32 + _3 * Ps_._33 + _4 * Ps_._34;
181
    P4 := _1 * Ps_._41 + _2 * Ps_._42 + _3 * Ps_._43 + _4 * Ps_._44;
182
  end;
183

184
  with WY do
185
  begin
186
    Result := _1 * P1 + _2 * P2 + _3 * P3 + _4 * P4;
187
  end;
188
end;
189

190
function BSplin4(const Ps_: TDoubleM4; const T_: TDouble2D): Double;
191
var
192
  WX, WY: TDouble4D;
193
  P1, P2, P3, P4: Double;
194
begin
195
  BSpline4(T_.X, WX);
196
  BSpline4(T_.Y, WY);
197

198
  with WX do
199
  begin
200
    P1 := _1 * Ps_._11 + _2 * Ps_._12 + _3 * Ps_._13 + _4 * Ps_._14;
201
    P2 := _1 * Ps_._21 + _2 * Ps_._22 + _3 * Ps_._23 + _4 * Ps_._24;
202
    P3 := _1 * Ps_._31 + _2 * Ps_._32 + _3 * Ps_._33 + _4 * Ps_._34;
203
    P4 := _1 * Ps_._41 + _2 * Ps_._42 + _3 * Ps_._43 + _4 * Ps_._44;
204
  end;
205

206
  with WY do
207
  begin
208
    Result := _1 * P1 + _2 * P2 + _3 * P3 + _4 * P4;
209
  end;
210
end;
211

212
function BSplin4(const Ps_: TdSingleM4; const T_: TdSingle2D): TdSingle;
213
var
214
  WX, WY: TdSingle4D;
215
  P1, P2, P3, P4: TdSingle;
216
begin
217
  BSpline4(T_.X, WX);
218
  BSpline4(T_.Y, WY);
219

220
  with WX do
221
  begin
222
    P1 := _1 * Ps_._11 + _2 * Ps_._12 + _3 * Ps_._13 + _4 * Ps_._14;
223
    P2 := _1 * Ps_._21 + _2 * Ps_._22 + _3 * Ps_._23 + _4 * Ps_._24;
224
    P3 := _1 * Ps_._31 + _2 * Ps_._32 + _3 * Ps_._33 + _4 * Ps_._34;
225
    P4 := _1 * Ps_._41 + _2 * Ps_._42 + _3 * Ps_._43 + _4 * Ps_._44;
226
  end;
227

228
  with WY do
229
  begin
230
    Result := _1 * P1 + _2 * P2 + _3 * P3 + _4 * P4;
231
  end;
232
end;
233

234
function BSplin4(const Ps_: TdDoubleM4; const T_: TdDouble2D): TdDouble;
235
var
236
  WX, WY: TdDouble4D;
237
  P1, P2, P3, P4: TdDouble;
238
begin
239
  BSpline4(T_.X, WX);
240
  BSpline4(T_.Y, WY);
241

242
  with WX do
243
  begin
244
    P1 := _1 * Ps_._11 + _2 * Ps_._12 + _3 * Ps_._13 + _4 * Ps_._14;
245
    P2 := _1 * Ps_._21 + _2 * Ps_._22 + _3 * Ps_._23 + _4 * Ps_._24;
246
    P3 := _1 * Ps_._31 + _2 * Ps_._32 + _3 * Ps_._33 + _4 * Ps_._34;
247
    P4 := _1 * Ps_._41 + _2 * Ps_._42 + _3 * Ps_._43 + _4 * Ps_._44;
248
  end;
249

250
  with WY do
251
  begin
252
    Result := _1 * P1 + _2 * P2 + _3 * P3 + _4 * P4;
253
  end;
254
end;
255

256
initialization
257

258
finalization
259

260
end.
261

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.