/// <summary>
        /// Reduce image to half its size.
        /// </summary>
        private void btnReduceHalf_Click(object sender, EventArgs e)
        {
            CustomImage img = GetImageToTransform();

            img.Transform(new AffineTransformation(
                              new DoubleMatrix[]
            {
                new double[, ] {
                    { 0.5, 0 }, { 0, 0.5 }
                }
            },
                              new DoubleMatrix[] {
                new double[, ] {
                    { 0 }, { 0 }
                }
            }));
            Matrix <Pixel> cropped = new Matrix <Pixel>(img.Width / 2, img.Height / 2);

            for (int x = 0; x < cropped.DimensionX; x++)
            {
                for (int y = 0; y < cropped.DimensionY; y++)
                {
                    cropped[x, y] = img.ImageData[x, y];
                }
            }

            img.ImageData = cropped;
            imgComparison.TransformedImage = img;
        }
        /// <summary>
        /// Make the Vent fractal from image.
        /// </summary>
        private void Vent_Fractal_Click(object sender, EventArgs e)
        {
            CustomImage img = GetImageToTransform();

            img.Transform(new AffineTransformation(
                              new DoubleMatrix[]
            {
                new double[, ] {
                    { 0, -0.5 }, { 0.5, 0 }
                }, new double[, ] {
                    { 0.5, 0 }, { 0, 0.5 }
                }, new double[, ] {
                    { 0.5, 0 },
                    { 0, 0.5 }
                }
            },

                              new DoubleMatrix[]
            {
                new double[, ] {
                    { img.Width / 2 }, { 0 }
                }, new double[, ] {
                    { 0 }, { img.Height / 2 }
                }, new double[, ] {
                    { img.Width / 2 }, { img.Height / 2 }
                }
            }
                              ));
            imgComparison.TransformedImage = img;
        }
        /// <summary>
        /// Transform image using greyscale.
        /// </summary>
        private void btnGreyscale_Click(object sender, EventArgs e)
        {
            CustomImage img = GetImageToTransform();

            img.Transform(new GreyscaleTransformation());
            imgComparison.TransformedImage = img;
        }
        /// <summary>
        /// Test button to do an Affine transformation on an image.
        /// </summary>
        private void btnAffineTransformation_Click(object sender, EventArgs e)
        {
            CustomImage img = GetImageToTransform();

            img.Transform(new AffineTransformation(
                              new DoubleMatrix[] {
                new double[, ] {
                    { -1, 0 }, { 0, 1 }
                },                                         //Reflection on Y axis
            },
                              new DoubleMatrix[] {
                new double[, ] {
                    { 511 }, { 0 }
                },
            }));
            imgComparison.TransformedImage = img;
        }
        /// <summary>
        /// Test button.
        /// </summary>
        private void btnReduceTransformation_Click(object sender, EventArgs e)
        {
            CustomImage img = GetImageToTransform();

            img.Transform(new AffineTransformation(
                              new DoubleMatrix[] {
                new double[, ] {
                    { 1d / img.Height, 0 }, { 0, 1d / img.Height }
                },
            },
                              new DoubleMatrix[] {
                new double[, ] {
                    { 200 }, { 200 }
                },
            }));
            imgComparison.TransformedImage = img;
        }
        /// <summary>
        /// Attempt to transform image to make a Fractal Fern.
        /// </summary>
        private void btnFractalFernTransformation_Click(object sender, EventArgs e)
        {
            CustomImage img            = GetImageToTransform();
            var         transformation = new AffineTransformation(
                new DoubleMatrix[] {
                new double[, ] {
                    { 0, 0 }, { 0, 0.16 }
                },
                new double[, ] {
                    { 0.3, 0.4 }, { 0.4, 0.3 }
                },
                new double[, ] {
                    { 0.4, 0.2 }, { 0.2, 0.4 }
                },
                new double[, ] {
                    { 0.4, 0.2 }, { 0.2, 0.4 }
                }
            },
                new DoubleMatrix[] {
                new double[, ] {
                    { img.Width / 2 }, { img.Height *(1 - 0.16) }
                },
                new double[, ] {
                    { 0 }, { 1.6 }
                },
                new double[, ] {
                    { 0 }, { 1.6 }
                },
                new double[, ] {
                    { 0 }, { 0.44 }
                }
            },
                new double[] { 0.01, 0.85, 0.07, 0.07 });

            img.Transform(transformation);

            //for (int i = 0; i < 1000; i++)
            // img.Transform(transformation, true);

            imgComparison.TransformedImage = img;
        }
        /// <summary>
        /// Attempt to make Koch Snowflake with image.
        /// </summary>
        private void btnKochSnowflakeTransformation_Click(object sender, EventArgs e)
        {
            CustomImage img            = GetImageToTransform();
            var         transformation = new AffineTransformation(
                new DoubleMatrix[] {
                new double[, ] {
                    { 1d / 3d, 0 }, { 0, 1d / 3d }
                },
                new double[, ] {
                    { 1 / 3d * Math.Cos(3.1416 / 3d), 1 / 3d * Math.Sin(3.1416 / 3d) }, { -1 / 3d * Math.Sin(3.1416 / 3d), 1 / 3d * Math.Cos(3.1416 / 3d) }
                },
                new double[, ] {
                    { 1 / 3d * Math.Cos(3.1416 / 3d), -1 / 3d * Math.Sin(3.1416 / 3d) }, { 1 / 3d * Math.Sin(3.1416 / 3d), 1 / 3d * Math.Cos(3.1416 / 3d) }
                },
                new double[, ] {
                    { 1d / 3d, 0 }, { 0, 1d / 3d }
                }
            },
                new DoubleMatrix[] {
                new double[, ] {
                    { 0 }, { 2 * img.Height / 3 }
                },
                new double[, ] {
                    { img.Width *(1 - Math.Sin(3.1416 / 3d)) / 3d }, { img.Height *(1 - (Math.Cos(3.1416 / 3d)) / 3d) }
                },
                new double[, ] {
                    { 2 * img.Width / 3 - (img.Width / 3d * Math.Cos(3.1416 / 3d) - img.Height / 3d * Math.Sin(3.1416 / 3d)) },
                    { img.Height - (img.Width / 3d * Math.Sin(3.1416 / 3d) + img.Height / 3d * Math.Cos(3.1416 / 3d)) }
                },
                new double[, ] {
                    { 2 * img.Width / 3 }, { 2 * img.Height / 3 }
                }
            });

            img.Transform(transformation);

            imgComparison.TransformedImage = img;
        }