Blame mono/Contours/ContourFloat.cs

Ivan Mahonin d33d2a
using System;
Ivan Mahonin d33d2a
using System.Collections.Generic;
Ivan Mahonin d33d2a
using System.Linq;
Ivan Mahonin d33d2a
Ivan Mahonin d33d2a
namespace Contours {
Ivan Mahonin d33d2a
    public struct VectorFloat {
Ivan Mahonin d33d2a
        public float x, y;
Ivan Mahonin d33d2a
Ivan Mahonin d33d2a
        public VectorFloat(float x, float y) {
Ivan Mahonin d33d2a
            this.x = x;
Ivan Mahonin d33d2a
            this.y = y;
Ivan Mahonin d33d2a
        }
Ivan Mahonin d33d2a
    }
Ivan Mahonin d33d2a
Ivan Mahonin d33d2a
    public class ContourFloat {
Ivan Mahonin d33d2a
        public readonly List<List<VectorFloat>> contours = new List<List<VectorFloat>>();
Ivan Mahonin d33d2a
Ivan Mahonin d33d2a
        public ContourInt toContourInt(float detalization = 10000f) {
Ivan Mahonin d33d2a
            ContourInt contourInt = new ContourInt();
Ivan Mahonin d33d2a
Ivan Mahonin d33d2a
            bool found = false;
Ivan Mahonin d33d2a
            VectorFloat min = new VectorFloat(0f, 0f);
Ivan Mahonin d33d2a
            VectorFloat max = new VectorFloat(0f, 0f);
Ivan Mahonin d33d2a
            foreach(List<VectorFloat> contour in contours) {
Ivan Mahonin d33d2a
                foreach(VectorFloat point in contour) {
Ivan Mahonin d33d2a
                    if (!found) {
Ivan Mahonin d33d2a
                        min = max = point;
Ivan Mahonin d33d2a
                        found = true;
Ivan Mahonin d33d2a
                    } else {
Ivan Mahonin d33d2a
                        if (min.x > point.x)
Ivan Mahonin d33d2a
                            min.x = point.x;
Ivan Mahonin d33d2a
                        if (min.y > point.y)
Ivan Mahonin d33d2a
                            min.y = point.y;
Ivan Mahonin d33d2a
                        if (max.x > point.x)
Ivan Mahonin d33d2a
                            max.x = point.x;
Ivan Mahonin d33d2a
                        if (max.y > point.y)
Ivan Mahonin d33d2a
                            max.y = point.y;
Ivan Mahonin d33d2a
                    }
Ivan Mahonin d33d2a
                }
Ivan Mahonin d33d2a
            }
Ivan Mahonin d33d2a
Ivan Mahonin d33d2a
            if (found) {
Ivan Mahonin d33d2a
                contourInt.scale = Math.Max(max.x - min.x, max.y - min.y)/detalization;
Ivan Mahonin d33d2a
                foreach(List<VectorFloat> contour in contours) {
Ivan Mahonin d33d2a
                    List<VectorInt> newContour = new List<VectorInt>();
Ivan Mahonin d33d2a
                    foreach(VectorFloat point in contour)
Ivan Mahonin d33d2a
                        newContour.Add(new VectorInt((int)Math.Round(point.x*contourInt.scale), (int)Math.Round(point.y*contourInt.scale)));
Ivan Mahonin d33d2a
                    contourInt.contours.Add(newContour);
Ivan Mahonin d33d2a
                }
Ivan Mahonin d33d2a
            }
Ivan Mahonin d33d2a
Ivan Mahonin d33d2a
            return contourInt;
Ivan Mahonin d33d2a
        }
Ivan Mahonin d33d2a
    }
Ivan Mahonin d33d2a
}
Ivan Mahonin d33d2a