5. 求二個簽名字元的相似度
Console.Write("Enter filename 1:");
var f1 = Console.ReadLine();
var c1 = File.ReadAllLines(AppDomain.CurrentDomain.BaseDirectory + "/" + f1);
bool[,] d1 = new bool[32, 32]; // x,y, black = 1
for (int y = 0; y < c1.Length; y++)
{
var t = c1[y];
for (global::System.Int32 x = 0; x < t.Length; x++)
{
d1[x, y] = t[x] == '0';
}
Console.WriteLine(t);
}
Console.Write("\nEnter filename 2:");
var f2 = Console.ReadLine();
var c2 = File.ReadAllLines(AppDomain.CurrentDomain.BaseDirectory + "/" + f2);
bool[,] d2 = new bool[32, 32]; // x,y, black = 1
for (int y = 0; y < c2.Length; y++)
{
var t = c2[y];
for (global::System.Int32 x = 0; x < t.Length; x++)
{
d2[x, y] = t[x] == '0';
}
Console.WriteLine(t);
}
Console.WriteLine("\n步驟2,y軸投影 (累計水平)");
int[] ys1 = new int[32];
for (int y = 0; y < 32; y++)
{
int s = 1;
for (int i = 0; i < 32; i++)
{
if (d1[i, y]) s++;
}
ys1[y] = s;
}
Console.WriteLine(f1 + ":(座標元素/投影量)");
for (int i = 0; i < 32; i++)
{
Console.Write(" " + i.ToString().PadLeft(2));
}
Console.WriteLine();
for (int i = 0; i < 32; i++)
{
Console.Write(" " + ys1[i].ToString().PadLeft(2));
}
int[] ys2 = new int[32];
for (int y = 0; y < 32; y++)
{
int s = 1;
for (int i = 0; i < 32; i++)
{
if (d2[i, y]) s++;
}
ys2[y] = s;
}
Console.WriteLine("\n" + f2 + ":(座標元素/投影量)");
for (int i = 0; i < 32; i++)
{
Console.Write(" " + i.ToString().PadLeft(2));
}
Console.WriteLine();
for (int i = 0; i < 32; i++)
{
Console.Write(" " + ys2[i].ToString().PadLeft(2));
}
Console.WriteLine("\n x軸投影 (累計垂直)");
int[] xs1 = new int[32];
for (int x = 0; x < 32; x++)
{
int s = 1;
for (int i = 0; i < 32; i++)
{
if (d1[x, i]) s++;
}
xs1[x] = s;
}
Console.WriteLine(f1 + ":(座標元素/投影量)");
for (int i = 0; i < 32; i++)
{
Console.Write(" " + i.ToString().PadLeft(2));
}
Console.WriteLine();
for (int i = 0; i < 32; i++)
{
Console.Write(" " + xs1[i].ToString().PadLeft(2));
}
int[] xs2 = new int[32];
for (int x = 0; x < 32; x++)
{
int s = 1;
for (int i = 0; i < 32; i++)
{
if (d2[x, i]) s++;
}
xs2[x] = s;
}
Console.WriteLine("\n" + f2 + ":(座標元素/投影量)");
for (int i = 0; i < 32; i++)
{
Console.Write(" " + i.ToString().PadLeft(2));
}
Console.WriteLine();
for (int i = 0; i < 32; i++)
{
Console.Write(" " + xs2[i].ToString().PadLeft(2));
}
Console.WriteLine("\n\n步驟3,y軸之二個圖型各座標元素的相似度:(座標元素/相似度)");
double[] dy = new double[32];
for (int i = 0; i < 32; i++)
{
dy[i] = Math.Min(Math.Min((double)ys1[i] / ys2[i], 1), (double)ys2[i] / ys1[i]);
}
for (int i = 0; i < 16; i++)
{
Console.Write(" " + i.ToString().PadLeft(5));
}
Console.WriteLine();
for (int i = 0; i < 16; i++)
{
Console.Write(" " + dy[i].ToString("f3").PadLeft(5));
}
Console.WriteLine();
for (int i = 16; i < 32; i++)
{
Console.Write(" " + i.ToString().PadLeft(5));
}
Console.WriteLine();
for (int i = 16; i < 32; i++)
{
Console.Write(" " + dy[i].ToString("f3").PadLeft(5));
}
Console.WriteLine("\n x軸之二個圖型各座標元素的相似度:(座標元素/相似度)");
double[] dx = new double[32];
for (int i = 0; i < 32; i++)
{
dx[i] = Math.Min(Math.Min((double)xs1[i] / xs2[i], 1), (double)xs2[i] / xs1[i]);
}
for (int i = 0; i < 16; i++)
{
Console.Write(" " + i.ToString().PadLeft(5));
}
Console.WriteLine();
for (int i = 0; i < 16; i++)
{
Console.Write(" " + dx[i].ToString("f3").PadLeft(5));
}
Console.WriteLine();
for (int i = 16; i < 32; i++)
{
Console.Write(" " + i.ToString().PadLeft(5));
}
Console.WriteLine();
for (int i = 16; i < 32; i++)
{
Console.Write(" " + dx[i].ToString("f3").PadLeft(5));
}
double ax=dx.Average();
double ay=dy.Average();
Console.WriteLine($"\n\n步驟4,求平均相似度:垂直投影:{ax:f3}, 水平投影:{ay:f3}");
Console.WriteLine($"\n步驟5,2字元相似度:{ax * ay:f5}");Last updated