10
votes

Normalisation CGRECT entre 0 et 1

Quelle est la meilleure façon de normaliser les valeurs CGRRRE de manière à être comprise entre 0 et 1 (système de coordonnées unitaire)?


5 commentaires

@Codafi Ce n'est rien à voir avec CGRectIntegral. Il s'agit de la conversion d'un système de coordonnées «unité» pour travailler avec diverses méthodes de Calayer.


Pour tous les examinateurs ou mods, les deux votes rapprochés sont totalement invalides.


Elles sont. Je n'ai pas tout lu la question. Je ne suis pas sûr des autres, cependant.


Voulez-vous dire que vous souhaitez considérer la largeur existante comme 1 et la hauteur existante comme 1, ou voulez-vous dire que vous souhaitez tout le recttacle, avec ses proportions actuelles, de s'inscrire dans une coordonnée 1x1 "Boîte"?


Bonjour, cela peut faire un peu plus de sens, ce sont les instructions du filtre "CropRegion: une zone rectangulaire pour récolter de l'image, normalisée pour coordonner de 0,0 à 1,0. La position (0,0, 0,0) est en haut à gauche de l'image. "


3 Réponses :


12
votes

Cela devrait faire l'affaire. Vous avez juste besoin de tout diviser par la largeur / la hauteur de la vue ou de la couche parent.

CGFloat parentWidth = parentView.bounds.size.width;
CGFloat parentHeight = parentView.bounds.size.height;

CGRect rectToConvert = ...;

rectToConvert.origin.x /= parentWidth;
rectToConvert.origin.y /= parentHeight;
rectToConvert.size.width /= parentWidth;
rectToConvert.size.height /= parentHeight;


4 commentaires

Pourquoi divisez-vous les coordonnées d'origine par la taille?


@Samuscambell peut-être parce que c'est nécessaire?


Cela reviendra un cgfloat entre 0 et 1 - qui est ce que l'utilisateur a demandé ..


@Seamuscambell Je vous suggère de lire sur "Coordonnées de l'unité": développeur.apple.com/Library/mac/documentation/cocoa/conceptu al / ...



0
votes

Que diriez-vous:

CGRect rectToConvert;
NSAffineTransform *n = [NSAffineTransform transform];
[n scaleXBy:rectToConvert.size.width 
        yBy:rectToConvert.size.height];
[n invert];

CGRect normalizedRect;
normalizedRect.origin = [n transformPoint:rectToConvert.origin];
normalizedRect.size   = [n transformSize: rectToConvert.size];

CGPoint anyPointINeedToConvert;
CGPoint convertedPoint = [n transformPoint:anyPointINeedToConvert];


0 commentaires

17
votes

Une manière très concise de faire cela serait: xxx


0 commentaires