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 rayonradius-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:
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. –
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? –
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