You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
2.1 KiB

using System;
using Pores.Interfaces;
using System.Collections.ObjectModel;
using System.Collections.Generic;
namespace Pores.Models.Localizations
{
public class NormalLocalization : IPoreLocalization
{
private double mu, sigma;
private double maxR;
private Material Material { get; }
public double GaussFunction (double x, double sigma, double mu)
{
double part1 = 1.0/ (sigma * Math.Sqrt(2 * 3.14));
double part2 = Math.Exp(-Math.Pow(x - mu, 2) / (2.0 * Math.Pow(sigma, 2)));
return part1 * part2;
}
public double GaussFunctionByHeight (Coordinate c)
{
return GaussFunction(c.Z, sigma, mu);
}
public IList<Pore> GetLocalization()
{
sigma = 4;
mu = Material.Height - Material.Height / 4;
maxR = Math.Sqrt(Material.NumberOfPores / (Material.Height * Material.Width * Material.Depth) / 3.14);
var r = new Random();
var result = new ObservableCollection<Pore>();
for (int i = 0; i <= Material.NumberOfPores; i++)
for (int j = 0; j <= Material.NumberOfPores; j++)
for (int k = 0; k <= Material.NumberOfPores; k++)
{
var c = new Coordinate()
{
X = (double) i / Material.NumberOfPores * Material.Width,
Y = (double) j / Material.NumberOfPores * Material.Depth,
Z = (double) k / Material.NumberOfPores * Material.Height,
};
var randomDouble = r.NextDouble();
var gaussResult = GaussFunctionByHeight(c);
if (randomDouble < gaussResult)
result.Add(new Pore() { GetCoordinate = c, Radius = maxR });
}
return result;
}
public NormalLocalization(Material material)
{
Material = material;
}
}
}