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 |
|