1 pièce(s) jointe(s)
générer une liste de rectangle à partir d'une liste de points
Bonjour à tous,
Je suis bloqué sur un algo qui ce révèle pas évident...
J'ai une liste de points qui correspondent aux valeurs max d'une image.
Code:
1 2
|
public IEnumerable<Point> DetectedPoints { get; private set; } |
Si j'affiche ces points dans un bitmap, ça correspond aux zones rouges:
Pièce jointe 652280
J'aimerais récupérer une liste de Rectangles (l'objet défini par sa position et sa taille de System.Drawing) qui encadre les zones les plus denses de points (avec un paramétrage de densité) pour les afficher dans ma vue en WPF sur l'image.
J'ai tenté une méthode, mais qui je pense est une impasse et un "bouffe ressources"...
Dans une méthode je boucle sur tous mes points:
Code:
1 2 3 4 5 6 7 8 9 10 11
|
List<Rectangle> _zonesRects = new List<Rectangle>();
foreach (var point in DetectedPoints)
{
var rectangle = ComputePoint(DetectedPoints, point);
if (rectangle != null)
_zonesRects.Add((Rectangle)rectangle);
}
_onDetectionRectanglesComputed?.Invoke(_zonesRects); |
Et je recherche des zones:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
private List<Rectangle> _zoneDetected = new List<Rectangle>();
private Rectangle? ComputePoint(IEnumerable<Point> detectionPoints, Point originPoint, int minSize = 6)
{
foreach (var zoneDetected in _zoneDetected)
if (zoneDetected.Contains(originPoint))
return null;
int rectHeight = int.MaxValue;
int xDelta = 0;
while (true)
{
int yDelta = 0;
bool processYLine = true;
while (processYLine)
{
bool pointExist = detectionPoints.Any(point => point.X == originPoint.X + xDelta && point.Y == originPoint.Y + yDelta);
if(!pointExist && yDelta >= minSize && yDelta < rectHeight)
{
rectHeight = yDelta+1;
}
if (!pointExist && yDelta < minSize && xDelta < minSize)
{
return null;
}
else if(!pointExist && yDelta >= minSize && xDelta >= minSize)
{
var rect = new Rectangle(originPoint.X, originPoint.Y, xDelta+1, rectHeight);
_zoneDetected.Add(rect);
return rect;
}
processYLine = pointExist;
yDelta++;
}
xDelta++;
}
} |
Mais ça ne fonctionne pas, et c'est pour moi une impasse...
J'espère être clair, si certains peuvent m'aiguiller c'est super !