using OpenCvSharp;
//using PaintDotNet.Base.DedicatedAnalysis.GrainSize.Model;
using System.Collections.Generic;
using System.Drawing;
namespace PaintDotNet.Base.DedicatedAnalysis.GrainSize
{
///
/// 夹杂物标准
///
public abstract class GrainSizeStandard
{
public static Color[] RAINBOW_COLORS = { Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Blue, Color.Cyan, Color.Purple };
///
/// 设置
///
public GrainSizeGlobalSettings globalSettings = new GrainSizeGlobalSettings();
//#region 识别测量区域中的微粒
/////
///// 识别测量区域中的微粒
/////
///// 视场
///// 识别出的微粒列表
//public virtual List identifyParticles(Mat field)
//{
// Cv2.Threshold(field, field, 175, 255, ThresholdTypes.BinaryInv);
// OpenCvSharp.Point[][] contours;
// HierarchyIndex[] hierarchy;
// Cv2.FindContours(field, out contours, out hierarchy, RetrievalModes.Tree, ContourApproximationModes.ApproxNone);
// List particles = new List();
// for (int i = 0; i < contours.Length; i++)
// {
// if (hierarchy[i].Parent != -1)
// {
// continue;
// }
// OpenCvSharp.Point[] contour = contours[i];
// particles.Add(new Particle(contour, this));
// }
// return particles;
//}
//#endregion
//#region 过滤微粒
/////
///// 过滤微粒
/////
///// 使用minimumLength,minimumWidth最小尺寸来过滤微粒
///// 过滤前的微粒列表
///// 过滤后的微粒列表
//public virtual List filterParticles(List particles)
//{
// for (int i = particles.Count - 1; i >= 0; i--)
// {
// Particle particle = particles[i];
// if (particle.physicalLength < this.globalSettings.minimumLength ||
// particle.physicalWidth < this.globalSettings.minimumWidth)
// {
// particles.Remove(particle);
// }
// }
// return particles;
//}
//#endregion
//#region 划分夹杂物
/////
///// 划分夹杂物
/////
///// 使用distancesBetweenParticles,distancesBetweenStringers划分夹杂物
///// 过滤后的微粒列表
///// 夹杂物列表
//public virtual List divideInclusion(List particles)
//{
// return this.inclusionsDivideInclusion(this.particlesDivideInclusion(particles));
//}
//#endregion
//#region 微粒划分夹杂物
/////
///// 微粒划分夹杂物
/////
///// 过滤后的微粒列表
///// 夹杂物列表
//protected virtual List particlesDivideInclusion(List particles)
//{
// List inclusions = new List();
// // 第一次划分 微粒划分夹杂物
// foreach (Particle particle in particles)
// {
// if (inclusions.Count == 0)
// {
// Inclusion inclusion = new Inclusion(this);
// inclusion.addParticles(particle);
// inclusions.Add(inclusion);
// continue;
// }
// foreach (Inclusion inclusion in inclusions)
// {
// if (inclusion.particles[0].shape != particle.shape)
// {
// continue;
// }
// // 矩形相交
// if (inclusion.rectProfile.IntersectsWith(particle.rectProfile))
// {
// inclusion.addParticles(particle);
// goto particleJump;
// }
// else
// {
// int verticalDistancePx = this.globalSettings.distancesBetweenParticlesE, horizontalDistancePx = this.globalSettings.distancesBetweenParticlesT;
// // 先比较垂直距离
// if (this.globalSettings.rollingDirection == InclusionsGlobalSettings.RollingDirection.PORTRAIT)
// {
// if (particle.rectProfile.Bottom < inclusion.rectProfile.Top)
// {
// verticalDistancePx = inclusion.rectProfile.Top - particle.rectProfile.Bottom;
// }
// if (particle.rectProfile.Top > inclusion.rectProfile.Bottom)
// {
// verticalDistancePx = particle.rectProfile.Top - inclusion.rectProfile.Bottom;
// }
// if (particle.rectProfile.Right < inclusion.rectProfile.Left)
// {
// horizontalDistancePx = inclusion.rectProfile.Left - particle.rectProfile.Right;
// }
// if (particle.rectProfile.Left > inclusion.rectProfile.Right)
// {
// horizontalDistancePx = particle.rectProfile.Left - inclusion.rectProfile.Right;
// }
// }
// else
// {
// if (particle.rectProfile.Bottom < inclusion.rectProfile.Top)
// {
// horizontalDistancePx = inclusion.rectProfile.Top - particle.rectProfile.Bottom;
// }
// if (particle.rectProfile.Top > inclusion.rectProfile.Bottom)
// {
// horizontalDistancePx = particle.rectProfile.Top - inclusion.rectProfile.Bottom;
// }
// if (particle.rectProfile.Right < inclusion.rectProfile.Left)
// {
// verticalDistancePx = inclusion.rectProfile.Left - particle.rectProfile.Right;
// }
// if (particle.rectProfile.Left > inclusion.rectProfile.Right)
// {
// verticalDistancePx = particle.rectProfile.Left - inclusion.rectProfile.Right;
// }
// }
// if (verticalDistancePx * this.globalSettings.pxPerUnit <= this.globalSettings.distancesBetweenParticlesE &&
// horizontalDistancePx * this.globalSettings.pxPerUnit <= this.globalSettings.distancesBetweenParticlesT)
// {
// inclusion.addParticles(particle);
// goto particleJump;
// }
// }
// }
// Inclusion newInclusion = new Inclusion(this);
// newInclusion.addParticles(particle);
// inclusions.Add(newInclusion);
// particleJump:;
// }
// return inclusions;
//}
//#endregion
//#region 夹杂物划分夹杂物(合并)
/////
///// 夹杂物划分夹杂物(合并)
/////
///// 夹杂物列表
///// 夹杂物列表
//protected virtual List inclusionsDivideInclusion(List inclusions)
//{
// // 第二次划分 夹杂物间划分
// for (int i = 0; i < inclusions.Count; i++)
// {
// if (i > inclusions.Count - 1)
// {
// break;
// }
// Inclusion inclusion = inclusions[i];
// for (int o = inclusions.Count - 1; o > i; o--)
// {
// if (o > inclusions.Count - 1)
// {
// break;
// }
// // 矩形相交
// if (inclusion.rectProfile.IntersectsWith(inclusions[o].rectProfile))
// {
// inclusion.addParticles(inclusions[o].particles);
// inclusions.RemoveAt(o);
// }
// else
// {
// if (inclusions[o].particles[0].shape != inclusion.particles[0].shape)
// {
// continue;
// }
// int verticalDistancePx = this.globalSettings.distancesBetweenParticlesE, horizontalDistancePx = this.globalSettings.distancesBetweenParticlesT;
// // 先比较垂直距离
// if (this.globalSettings.rollingDirection == InclusionsGlobalSettings.RollingDirection.PORTRAIT)
// {
// if (inclusions[o].rectProfile.Bottom < inclusion.rectProfile.Top)
// {
// verticalDistancePx = inclusion.rectProfile.Top - inclusions[o].rectProfile.Bottom;
// }
// if (inclusions[o].rectProfile.Top > inclusion.rectProfile.Bottom)
// {
// verticalDistancePx = inclusions[o].rectProfile.Top - inclusion.rectProfile.Bottom;
// }
// if (inclusions[o].rectProfile.Right < inclusion.rectProfile.Left)
// {
// horizontalDistancePx = inclusion.rectProfile.Left - inclusions[o].rectProfile.Right;
// }
// if (inclusions[o].rectProfile.Left > inclusion.rectProfile.Right)
// {
// horizontalDistancePx = inclusions[o].rectProfile.Left - inclusion.rectProfile.Right;
// }
// }
// else
// {
// if (inclusions[o].rectProfile.Bottom < inclusion.rectProfile.Top)
// {
// horizontalDistancePx = inclusion.rectProfile.Top - inclusions[o].rectProfile.Bottom;
// }
// if (inclusions[o].rectProfile.Top > inclusion.rectProfile.Bottom)
// {
// horizontalDistancePx = inclusions[o].rectProfile.Top - inclusion.rectProfile.Bottom;
// }
// if (inclusions[o].rectProfile.Right < inclusion.rectProfile.Left)
// {
// verticalDistancePx = inclusion.rectProfile.Left - inclusions[o].rectProfile.Right;
// }
// if (inclusions[o].rectProfile.Left > inclusion.rectProfile.Right)
// {
// verticalDistancePx = inclusions[o].rectProfile.Left - inclusion.rectProfile.Right;
// }
// }
// if (verticalDistancePx * this.globalSettings.pxPerUnit <= this.globalSettings.distancesBetweenParticlesE &&
// horizontalDistancePx * this.globalSettings.pxPerUnit <= this.globalSettings.distancesBetweenParticlesT)
// {
// inclusion.addParticles(inclusions[o].particles);
// inclusions.RemoveAt(o);
// }
// }
// }
// }
// List tobeCombined = new List();
// foreach (var item in inclusions)
// {
// if (item.particles.Count<3)
// {
// tobeCombined.Add(item);
// }
// }
// inclusionsCombinationSplit(inclusions,tobeCombined);
// return inclusions;
//}
//#endregion
//#region 夹杂物组合
/////
///// 夹杂物组合
/////
///// 全部的夹杂物
///// 待合并的夹杂物
//public virtual List inclusionsCombination(List allInclusions, List tobeCombined)
//{
// Inclusion inclusion = new Inclusion(this);
// foreach (Inclusion item in tobeCombined)
// {
// inclusion.addParticles(item.particles);
// allInclusions.Remove(item);
// }
// allInclusions.Add(inclusion);
// return allInclusions;
//}
//#endregion
//#region 夹杂物组合拆分
/////
///// 夹杂物组合拆分
/////
///// 全部的夹杂物
///// 待拆分的夹杂物
//public virtual List inclusionsCombinationSplit(List allInclusions, List tobeCombined)
//{
// foreach (Inclusion item in tobeCombined)
// {
// foreach (Particle particle in item.particles)
// {
// Inclusion inclusion = new Inclusion(this);
// inclusion.addParticles(particle);
// allInclusions.Add(inclusion);
// }
// allInclusions.Remove(item);
// }
// return allInclusions;
//}
//#endregion
/////
///// 判断夹杂物类型
/////
//public abstract void determineType(Inclusion inclusion);
/////
///// 边缘误差修正
/////
///// 根据视场边界修正所计算的夹杂物
/////
//public abstract void edgeErrorsCorrection(List inclusions);
}
}