Wed 28 Aug 21:38:52 CEST 2024
This commit is contained in:
parent
fee153c9e1
commit
c20f3e689a
230
src/SimNDT/core/concreteModel.py
Normal file
230
src/SimNDT/core/concreteModel.py
Normal file
|
@ -0,0 +1,230 @@
|
|||
from PySide.QtGui import *
|
||||
from PySide.QtCore import *
|
||||
|
||||
import time
|
||||
import random
|
||||
import numpy as np
|
||||
|
||||
from SimNDT.core.packing import Ellipse, Quadtree, ellipseMatrix, Rect, ellipseDiscard, circleMatrix
|
||||
|
||||
|
||||
class Granulometry:
|
||||
def __init__(self, MI, NI, Pixel_mm, Dmin, Dmax, nG, AspectMin, AspectMax, Fraction, Label):
|
||||
self.AspectMax = AspectMax
|
||||
self.AspectMin = AspectMin
|
||||
self.Label = Label
|
||||
|
||||
d = np.logspace(np.log10(Dmin), np.log10(Dmax), 12, endpoint=True).astype('float')
|
||||
A = np.zeros_like(d)
|
||||
A = 1. / (1.0 - ((Dmin) / Dmax) ** nG)
|
||||
A *= ((d / Dmax) ** nG - (Dmin / Dmax) ** nG)
|
||||
|
||||
a = np.around((d[0:] / 2.) * 1000. * Pixel_mm)
|
||||
c = np.zeros((np.size(a),), dtype=np.float32)
|
||||
c = (A[1:] - A[:-1]) * Fraction / 100.
|
||||
self.a_reversed = a[::-1]
|
||||
self.c_reversed = c[::-1] * MI * NI
|
||||
|
||||
def getB(self, a):
|
||||
return ((self.AspectMin) + (self.AspectMax - self.AspectMin) * random.random()) * a
|
||||
|
||||
|
||||
class TwoPhaseModel:
|
||||
def __init__(self, MI, NI, granulometry, matrixLabel):
|
||||
|
||||
self.MI = MI
|
||||
self.NI = NI
|
||||
self.granulometry = granulometry
|
||||
self.matrixLabel = matrixLabel
|
||||
|
||||
xv = np.linspace(0, self.MI - 1, self.MI, endpoint=True).astype(np.int32)
|
||||
yv = np.linspace(0, self.NI - 1, self.NI, endpoint=True).astype(np.int32)
|
||||
X, Y = np.meshgrid(xv, yv)
|
||||
|
||||
self.coords = {(x, y) for x, y in zip(X.ravel(), Y.ravel())}
|
||||
|
||||
depth = 5
|
||||
self.qtree = Quadtree(depth, Rect(0, 0, self.MI, self.NI))
|
||||
(self.XX, self.YY) = np.meshgrid(range(0, self.NI), range(0, self.MI))
|
||||
|
||||
def compute(self, progressBar):
|
||||
|
||||
Objs = []
|
||||
Image = np.ones((self.MI, self.NI), np.float32) * self.matrixLabel
|
||||
# mask = np.zeros((self.MI,self.NI), np.float32)
|
||||
|
||||
|
||||
start = time.time()
|
||||
|
||||
progressBar.setVisible(True)
|
||||
progressBar.setValue(0)
|
||||
QApplication.processEvents()
|
||||
|
||||
total = len(self.granulometry.a_reversed)
|
||||
|
||||
for ix, value in enumerate(zip(self.granulometry.a_reversed, self.granulometry.c_reversed)):
|
||||
print(ix, value[0], value[1])
|
||||
progressBar.setValue(100 * ix / float(total))
|
||||
QApplication.processEvents()
|
||||
|
||||
area_set = 0
|
||||
while area_set < value[1]:
|
||||
|
||||
cy, cx = self.coords.pop()
|
||||
if Image[cy, cx] == self.matrixLabel:
|
||||
|
||||
b = self.granulometry.getB(value[0])
|
||||
theta = random.uniform(0, 2 * np.pi)
|
||||
|
||||
c = Ellipse(cy, cx, value[0], b, theta)
|
||||
objs = self.qtree.query(c)
|
||||
if len(objs) == 0:
|
||||
self.qtree.insert(c)
|
||||
Objs.append(c)
|
||||
area_set += np.floor(c.area())
|
||||
ellipseDiscard(c.y, c.x, c.a, c.b, c.theta, self.XX, self.YY, self.coords, Image,
|
||||
self.granulometry.Label)
|
||||
|
||||
else:
|
||||
self.coords.add((cy, cx))
|
||||
|
||||
print("draw")
|
||||
print(time.time() - start)
|
||||
|
||||
"""
|
||||
total = len(Objs)
|
||||
for idx, item in enumerate(Objs):
|
||||
if idx % 100 == 0:
|
||||
progressBar.setValue(100*idx/float(total))
|
||||
QApplication.processEvents()
|
||||
Image = ellipseMatrix(item.y, item.x, item.a, item.b, item.theta, Image, self.granulometry.Label, self.XX, self.YY)
|
||||
|
||||
print time.time()-start
|
||||
"""
|
||||
|
||||
progressBar.setVisible(False)
|
||||
return Image
|
||||
|
||||
def toDict(self):
|
||||
pass
|
||||
|
||||
|
||||
class ThreePhaseModel:
|
||||
def __init__(self, MI, NI, granulometry, granulometry2, matrixLabel):
|
||||
|
||||
self.MI = MI
|
||||
self.NI = NI
|
||||
self.granulometry = granulometry
|
||||
self.granulometry2 = granulometry2
|
||||
self.matrixLabel = matrixLabel
|
||||
|
||||
xv = np.linspace(0, self.MI - 1, self.MI, endpoint=True).astype(np.int32)
|
||||
yv = np.linspace(0, self.NI - 1, self.NI, endpoint=True).astype(np.int32)
|
||||
X, Y = np.meshgrid(xv, yv)
|
||||
|
||||
self.coords = {(x, y) for x, y in zip(X.ravel(), Y.ravel())}
|
||||
|
||||
depth = 5
|
||||
self.qtree = Quadtree(depth, Rect(0, 0, self.MI, self.NI))
|
||||
(self.XX, self.YY) = np.meshgrid(range(0, self.NI), range(0, self.MI))
|
||||
|
||||
def compute(self, progressBar):
|
||||
|
||||
Objs1 = []
|
||||
Objs2 = []
|
||||
Image = np.ones((self.MI, self.NI), np.float32) * self.matrixLabel
|
||||
# mask = np.zeros((self.MI,self.NI), np.float32)
|
||||
|
||||
start = time.time()
|
||||
|
||||
progressBar.setVisible(True)
|
||||
progressBar.setValue(0)
|
||||
QApplication.processEvents()
|
||||
|
||||
total = len(self.granulometry.a_reversed)
|
||||
|
||||
for ix, value in enumerate(zip(self.granulometry.a_reversed, self.granulometry.c_reversed)):
|
||||
print(ix, value[0], value[1])
|
||||
progressBar.setValue(100 * ix / float(total))
|
||||
QApplication.processEvents()
|
||||
|
||||
area_set = 0
|
||||
while area_set < value[1]:
|
||||
|
||||
cy, cx = self.coords.pop()
|
||||
if Image[cy, cx] == self.matrixLabel:
|
||||
|
||||
b = self.granulometry.getB(value[0])
|
||||
theta = random.uniform(0, 2 * np.pi)
|
||||
|
||||
c = Ellipse(cy, cx, value[0], b, theta)
|
||||
objs = self.qtree.query(c)
|
||||
|
||||
if len(objs) == 0:
|
||||
self.qtree.insert(c)
|
||||
Objs1.append(c)
|
||||
area_set += np.floor(c.area())
|
||||
ellipseDiscard(c.y, c.x, c.a, c.b, c.theta, self.XX, self.YY, self.coords, Image,
|
||||
self.granulometry.Label)
|
||||
|
||||
else:
|
||||
self.coords.add((cy, cx))
|
||||
|
||||
print("draw")
|
||||
print(time.time() - start)
|
||||
|
||||
"""
|
||||
total = len(Objs1)
|
||||
for idx, item in enumerate(Objs1):
|
||||
if idx % 100 == 0:
|
||||
progressBar.setValue(100*idx/float(total))
|
||||
QApplication.processEvents()
|
||||
Image = ellipseMatrix(item.y, item.x, item.a, item.b, item.theta, Image, self.granulometry.Label, self.XX, self.YY)
|
||||
|
||||
print time.time()-start
|
||||
"""
|
||||
|
||||
progressBar.setValue(0)
|
||||
QApplication.processEvents()
|
||||
|
||||
total = len(self.granulometry2.a_reversed)
|
||||
|
||||
for ix, value in enumerate(zip(self.granulometry2.a_reversed, self.granulometry2.c_reversed)):
|
||||
print(ix, value[0], value[1])
|
||||
progressBar.setValue(100 * ix / float(total))
|
||||
QApplication.processEvents()
|
||||
|
||||
area_set = 0
|
||||
while area_set < value[1]:
|
||||
|
||||
cy, cx = self.coords.pop()
|
||||
if Image[cy, cx] == self.matrixLabel:
|
||||
|
||||
c = Ellipse(cy, cx, value[0], value[0], 0)
|
||||
objs = self.qtree.query(c)
|
||||
if len(objs) == 0:
|
||||
self.qtree.insert(c)
|
||||
Objs2.append(c)
|
||||
area_set += np.floor(c.area())
|
||||
ellipseDiscard(c.y, c.x, c.a, c.b, c.theta, self.XX, self.YY, self.coords, Image,
|
||||
self.granulometry2.Label)
|
||||
|
||||
else:
|
||||
self.coords.add((cy, cx))
|
||||
|
||||
print("draw")
|
||||
print(time.time() - start)
|
||||
|
||||
"""
|
||||
total = len(Objs2)
|
||||
for idx, item in enumerate(Objs2):
|
||||
if idx % 20 == 0:
|
||||
progressBar.setValue(100*idx/float(total))
|
||||
QApplication.processEvents()
|
||||
Image = circleMatrix(item.y, item.x, item.a, Image, self.granulometry2.Label, self.XX, self.YY)
|
||||
|
||||
print time.time()-start
|
||||
"""
|
||||
|
||||
progressBar.setVisible(False)
|
||||
return Image
|
Loading…
Reference in New Issue
Block a user