// Create a world file using the given coordinate mapper.
// See https://en.wikipedia.org/wiki/World_file
private void CreateWorldFile(string worldFileName, RectangleF rect, float bitmapWidth, float bitmapHeight, CoordinateMapper mapperForWorldFile)
{
double a, b, c, d, e, f;
Matrix transform = Geometry.CreateInvertedRectangleTransform(new RectangleF(0, 0, bitmapWidth, bitmapHeight), rect);
PointF[] transformedPoints = Geometry.TransformPoints(new PointF[] { new PointF(0, 0), new PointF(1, 0), new PointF(0, 1) }, transform);
double[] realX = new double[transformedPoints.Length];
double[] realY = new double[transformedPoints.Length];
for (int i = 0; i < transformedPoints.Length; ++i)
{
mapperForWorldFile.GetRealWorld(transformedPoints[i], out realX[i], out realY[i]);
}
c = realX[0];
f = realY[0];
a = realX[1] - c;
d = realY[1] - f;
b = realX[2] - c;
e = realY[2] - f;
using (TextWriter writer = new StreamWriter(worldFileName)) {
writer.WriteLine(a.ToString("F10", CultureInfo.InvariantCulture));
writer.WriteLine(d.ToString("F10", CultureInfo.InvariantCulture));
writer.WriteLine(b.ToString("F10", CultureInfo.InvariantCulture));
writer.WriteLine(e.ToString("F10", CultureInfo.InvariantCulture));
writer.WriteLine(c.ToString("F5", CultureInfo.InvariantCulture));
writer.WriteLine(f.ToString("F5", CultureInfo.InvariantCulture));
}
}