Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
Delphi 11 Alexandria
|
AW: Generic class <T> , wie füge ich konkrete Daten ein ?
12. Jan 2024, 16:50
nur eine limitierte Flexibility erreicht via Vererbung ...
Delphi-Quellcode:
const
Infinity = 10000000;
type
TClusterDataREC = record
DrawingColor: TColor;
x, y: Integer;
chrlabel: char;
// ...
// ..
// .
end;
/// <summary>
/// a bit different pixeldefinition
/// </summary>
TClusterDataREC2 = class
BWColor: Byte;
x, y: Integer;
// tbd.
// ...
// ..
// .
end;
/// <summary>
/// here it can be just a simple pixel description,
/// in general we store the complete orginal data inside this list
/// </summary>
TRawData<T> = class(TList<T>)
end;
/// <summary>
/// store the data now inside a cluster with a Centroid
/// </summary>
TCluster<T> = record
/// <summary>
/// <para>
/// as of today T, but in future some other data type , depending
/// </para>
/// <para>
/// on future research :-)
/// </para>
/// </summary>
Center: T;
/// <summary>
/// the selected elements from out complete raw data
/// </summary>
ClusterElements: TArray<T>;
end;
/// <summary>
/// the cluster list
/// </summary>
TClusterList<T> = class(TList < TCluster < T >> )
private
function GetItem(Aindex: Integer): TCluster<T>;
procedure SetItem(Aindex: Integer; const Value: TCluster<T>);
public
property Items[Aindex: Integer]: TCluster<T> Read GetItem Write SetItem;
end;
type
/// <summary>
/// measure the distance according to this function
/// </summary
TDistanceMetricfunction < T >= reference to
function(const A, B: T): Double;
type
/// <summary>
/// result of this function could be the TColor value , but also
/// coordinates my have some impact in future ....
/// </summary
TCentroidfunction < T >= reference to
function(const A: T): Cardinal;
type
TKMeans<T> = class
private
private
FClusteredData: TClusterList<T>;
FRawData: TArray<T>;
FNumClusters: Integer;
FDistanceMetric: TDistanceMetricfunction<T>;
FCentroidfct: TCentroidfunction<T>;
FMaxIterations: Integer;
public
constructor Create(NumClusters: Integer;
DistanceMetric: TDistanceMetricfunction<T>;
Centroidfct: TCentroidfunction<T>; MaxIterations: Integer = 10);
function FindNewClusterCentroids: Boolean;
procedure GroupData2NearestCluster;
property RawData: TArray<T> read FRawData write FRawData;
end;
type
TImageClusterKMeans = class(TKMeans<TClusterDataREC>)
public
procedure LoadData(SoureBitMap: TBitmap);
procedure SaveData(OutBitMap: TBitmap);
end;
|
|
Zitat
|