2017-10-19 19 views
2

Je veux itérer sur les pixels le long d'un arc de cercle pixellisée, compte tenu de son rayon, de début et angles d'extrémité en radians, par exemple:itérer sur les pixels le long d'un arc de cercle pixellisée

template<typename Functor> 
void arc(float startRadians, float endRadians, int radius, Functor f); 

Pour être utilisés comme:

arc(0.f, M_PI, 10, [](int x, int y) { 
    std::cout << "got: " << x << " " << y << "\n"; 
}); 

Il y a quelques prises:

  • pixels ont coordon entier nates
  • radius est également donnée à un nombre entier
  • l'arc à balayage tramé est effectivement chaque pixel dans un secteur compris entre l'arc de rayon radius et l'arc de rayon radius-1

Dans le tableau ci-dessous:

  • les pixels bleus ont été visités, le pixel rouge est le prochain à être visité
  • l'arc est confiné par les deux lignes radiales définies par les angles de début/fin, et le secteur entre les deux arcs radius, radius-1.
  • Enfin, si tous les arcs de rayon 0 à 100 devaient être dessinés, angles 0 à 2 * PI, nous obtiendrions un disque/cercle rempli de rayon 100 et aucun pixel ne serait visité deux fois.

Je pense que Bresenham's circle algorithm ne s'applique pas directement à ce problème, en raison des contraintes d'angle et de l'ordre de visite.

En StackOverflow, je crois que c'est la question la plus étroitement liée:

Enfin, OpenCV a quelque chose de similaire/lié à l'esprit, mais seulement pour les lignes:

enter image description here

+4

Er, non, l'algorithme de Bresenham est exactement ce que vous voulez ... il vous suffit d'ajouter une logique à l'algorithme de base qui: Saute la 8- l'optimisation des quadrants (dessinez chaque quadrant individuellement avec une sous-fonction dans l'ordre que vous désirez), et observez les angles d'entrée/de sortie dans les quadrants où cela compte. L'autre option consiste à utiliser directement les calculs à virgule flottante. –

+0

Oh, alors votre idée est de générer tous les points en utilisant Bresenham standard et filtrer juste ceux qui tombent hors de l'angle/quadrants requis? Est-ce que Bresenham a les propriétés requises pour visiter tous les pixels (remplir un disque quand chaque rayon entier est pixellisé) et ne pas visiter les pixels deux fois? –

+0

Non, générer seulement la partie nécessaire du quadrant (arrêter quand y/x ou x/y atteint la limite tan (angle) – MBo

Répondre

0

Jetez un coup d'œil à cvLinearPolar().

Il mappe l'image du système de coordonnées x, y sur polaire. L'image résultante est les lignes -> angle et colonnes-> rayon. Votre rastering à ce moment-là serait en boucle sur la ligne de la colonne, pas de rastering fonctionnel spécial.

Cela signifie que toutes les lignes est donc dtheta = 2*Pi/(rowNum) votre arc serait être startAngle = angle1/dtheta et même endAngle = angle2/dtheta.

De même votre calcul de rayon drad = maxRad/(columnNum).

afin d'obtenir votre arc de l'image polaire:

for(int i = maxRad; i > 0; i--) // start at longest radius spiral in 
{ 
for(int j = startAngle; j < endAngle;j++) angle 
{ 
    // do action on polarImage[i,j]; 
} 

}