PositionTrackingBarcode/CameraPositionTrackingCreat.../PositionPatternCreator/MainWindow.xaml.cs

315 lines
10 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Xps;
using System.Windows.Xps.Packaging;
using System.IO;
namespace PositionPatternCreator
{
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
static double mmw = 96 / 24.5;
static double ratio = 0.866025403784438;
static double MarkerStrokeSize = 5;
static double Dist = MarkerStrokeSize * 4.5 * 2;
bool swCount = true;
private struct DataListEntr
{
private int[] data;
private int centPositionX;
private int centPositionY;
private int rot;
public int GetData(int i)
{
return data[i];
}
public void SetData(int i, int Data)
{
if (data == null) data = new int[7];
data[i] = Data;
}
public int GetArrayEntr(int[,] DataArray)
{
return DataArray[centPositionX, centPositionY];
}
public void SetArrayEntr(ref int[,] DataArray, int Data)
{
DataArray[centPositionX, centPositionY] = Data;
//System.Diagnostics.Debug.WriteLine(centPositionX + " " + centPositionY + " -- > " + Data);
}
public void SetPos(int PosX, int PosY)
{
centPositionX = PosX;
centPositionY = PosY;
}
public int X { get { return centPositionX; } }
public int Y { get { return centPositionY; } }
public int Rotation {
get { return rot; }
set { rot = value; }
}
public int CompareTo(DataListEntr Entr)
{
for (int i = 0; i < 7; i++)
{
if (this.data[i] > Entr.data[i]) return 1;
if (this.data[i] < Entr.data[i]) return -1;
}
return 0;
}
}
private double AddOffs(double xVal, int index)
{
if ((index & 1) > 0)
return xVal;
else
return xVal + Dist / 2;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
string containerName = @"C:\Users\Nicolas\Documents\Visual Studio 2013\Projects\CameraPositionTrackingCreatorHex\PositionPatternCreator\bin\Debug\output.xps";
string binListName = @"C:\Users\Nicolas\Documents\Visual Studio 2013\Projects\CameraPositionTrackingCreatorHex\PositionPatternCreator\bin\Debug\output.dat";
File.Delete(containerName);
/*LocalPrintServer ps = new LocalPrintServer();
PrintQueue pq = ps.DefaultPrintQueue;
XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq);
PrintTicket pt = pq.UserPrintTicket;
pt.PageOrientation = PageOrientation.Portrait;
PageMediaSize pageMediaSize = new PageMediaSize(DrawCanvas.ActualWidth, DrawCanvas.ActualHeight);
pt.PageMediaSize = pageMediaSize;
xpsdw.Write(DrawCanvas);*/
FixedPage fp = new FixedPage();
//Canvas fp = DrawCanvas;
fp.Background = new SolidColorBrush(Color.FromRgb(0xFF, 0xFF, 0xFF));
//Din A4
fp.Height = 297 * mmw;
fp.Width = 210 * mmw;
//Din A3
//fp.Height = 594 * mmw;
//fp.Width = 297 * mmw;
int sizex = (int)((fp.Width - 30) / Dist);
int sizey = (int)((fp.Height - 30) / Dist / ratio);
int[,] dat = new int[sizex+2, sizey+2];
int[,] xm = { { -1, -1, 0, 1, 0, -1 }, { -1, 0, 1, 0, -1, -1 }, { 0, 1, 0, -1, -1, -1 }, { 1, 0, -1, -1, -1, 0 }, { 0, -1, -1, -1, 0, 1 }, { -1, -1, -1, 0, 1, 0 } };
int[,] ym = { { 0, -1, -1, 0, 1, 1 }, { -1, -1, 0, 1, 1, 0 }, { -1, 0, 1, 1, 0, -1 }, { 0, 1, 1, 0, -1, -1 }, { 1, 1, 0, -1, -1, 0 }, { 1, 0, -1, -1, 0, 1 } };
List<DataListEntr> sList = new List<DataListEntr>();
int SymCount = 0;
int dubCount = 1;
Random rnd = new Random(SymCount);
for (int ix = 1; ix < sizex + 1; ix++)
{
for (int iy = 1; iy < sizey + 1; iy++)
{
dat[ix, iy] = (rnd.Next() & 0x7) | 0x8; // (rnd.Next() & 0x7) | 0x8;
}
}
int lc = 0;
int mx = 0;
while (dubCount > 0)
{
lc++;
sList.Clear();
for (int ix = 1; ix < sizex + 1; ix++)
{
for (int iy = 1; iy < sizey + 1; iy++)
{
if (ix == 15 && iy == 4 && lc == 136)
{
iy = iy;
}
for (int i = 0; i < 6; i++)
{
DataListEntr sl = new DataListEntr();
sl.SetPos(ix, iy);
sl.SetData(0, dat[ix, iy]);
sl.Rotation = i;
bool nonNull = true;
for (int j = 0; j < 6; j++)
{
if (ym[j, i] != 0 && iy % 2 == 0)
mx = 1;
else
mx = 0;
int tmpd = dat[ix + xm[j, i] + mx, iy + ym[j, i]];
sl.SetData(j+1, tmpd);
if (tmpd == 0) nonNull = false;
}
if (nonNull) sList.Add(sl);
}
}
}
sList.Sort(delegate(DataListEntr X, DataListEntr Y)
{
return X.CompareTo(Y);
});
dubCount = 0;
for (int i = 1; i < sList.Count; i++)
{
if (sList[i].CompareTo(sList[i - 1]) == 0)
{
//System.Diagnostics.Debug.WriteLine("XY: " + sList[i+1].X + " " + sList[i+1].Y);
dubCount++;
}
}
if (dubCount > 0)
{
for (int i = 1; i < sList.Count; i++)
{
if (sList[i].CompareTo(sList[i - 1]) == 0)
{
sList[i].SetArrayEntr(ref dat, (rnd.Next() & 0x7) | 0x8);
}
}
int iz = rnd.Next() % sList.Count;
sList[iz].SetArrayEntr(ref dat, (rnd.Next() & 0x7) | 0x8);
}
System.Diagnostics.Debug.WriteLine(dubCount +" " + lc);
}
sList.Sort(delegate(DataListEntr X, DataListEntr Y)
{
return X.CompareTo(Y);
});
var ListOutFile = File.OpenWrite(binListName);
byte[] wBytes = new byte[sList.Count * 9];
for (int i = 0; i < sList.Count; i++)
{
int i2 = i * 9;
int xpos = (int)((sList[i].X * Dist + AddOffs(0, sList[i].Y)) / mmw * 10); //in 1/10 mm
int ypos = (int)(sList[i].Y * Dist * ratio / mmw) * 10; //in 1/10 mm
wBytes[i2 + 0] = (byte)(sList[i].GetData(0));
wBytes[i2 + 1] = (byte)((sList[i].GetData(1) << 4) | sList[i].GetData(2));
wBytes[i2 + 2] = (byte)((sList[i].GetData(3) << 4) | sList[i].GetData(4));
wBytes[i2 + 3] = (byte)((sList[i].GetData(5) << 4) | sList[i].GetData(6));
wBytes[i2 + 4] = (byte)sList[i].Rotation;
wBytes[i2 + 5] = (byte)(xpos >> 8);
wBytes[i2 + 6] = (byte)xpos;
wBytes[i2 + 7] = (byte)(ypos >> 8);
wBytes[i2 + 8] = (byte)ypos;
}
ListOutFile.Write(wBytes, 0, wBytes.Length);
ListOutFile.Close();
XpsDocument xpsDoc = new XpsDocument(containerName, FileAccess.ReadWrite);
for (int iy = 1; iy < sizey; iy++)
{
for (int ix = 1; ix < sizex; ix++)
{
int data = dat[ix, iy];
for (int n = 0; n < 4; n++)
{
bool bit = ((data >> n) & 1) == 1;
if (bit) fp.Children.Add(GetCircle(ix * Dist + AddOffs(12, iy), iy * Dist * ratio + 20, MarkerStrokeSize * (n + 1)));
}
//fp.Children.Add(GetCircle(ix, iy, MarkerStrokeSize * 5));
SymCount++;
}
}
XpsDocumentWriter xpsdw = XpsDocument.CreateXpsDocumentWriter(xpsDoc);
xpsdw.Write(fp);
xpsDoc.Close();
}
private Ellipse GetCircle(double xPosition, double yPosition, double Radius)
{
Ellipse el = new Ellipse();
el.Margin = new Thickness(xPosition - Radius, yPosition - Radius, 0, 0);
el.Height = 2 * Radius;
el.Width = 2 * Radius;
el.StrokeThickness = MarkerStrokeSize * 1.1;
el.Stroke = new SolidColorBrush(Colors.Black);
if (Radius <= MarkerStrokeSize) el.Fill = new SolidColorBrush(Colors.Black);
return el;
}
}
}