En iOS, estoy tratando de determinar el punto en un rectángulo intersecado por una línea imaginaria desde el punto central hasta el perímetro de el rectángulo en un ángulo predeterminado.Encuentra el CGPoint en un rectángulo UIView intersectado por una línea recta en un ángulo determinado desde el punto central
Digamos que conozco el punto central, el tamaño del rectángulo y el ángulo (comenzando desde 0 grados hacia el este e ir hacia la izquierda 90 hacia el norte y 180 hacia el oeste y 270 hacia el sur hasta 360 grados hacia el este nuevamente) . Necesito saber las coordenadas del punto de intersección.
La respuesta algo confusa (para mí) matemática pero presumiblemente precisa en Finding points on a rectangle at a given angle me llevó a probar el siguiente código, pero no funciona correctamente. Esta pregunta es similar a esa, pero estoy buscando un método corregido de Objective-C/iOS en lugar de una respuesta matemática general.
Creo que una parte del problema del código tiene que ver con el uso del ángulo de 0 a 360 grados (en radianes sin posibilidad de un número negativo) de entrada, pero es probable que haya otros problemas. El siguiente código utiliza principalmente la notación definida en the answer from belisarius, incluido mi intento de calcular los puntos de intersección para cada una de las cuatro regiones definidas allí.
Este código está en mi subclase UIImageView:
- (CGPoint) startingPointGivenAngleInDegrees:(double)angle {
double angleInRads = angle/180.0*M_PI;
float height = self.frame.size.height;
float width = self.frame.size.width;
float x0 = self.center.x;
float y0 = self.center.y;
// region 1
if (angleInRads >= -atan2(height, width) && angleInRads <= atan2(height, width)) {
return CGPointMake(x0 + width/2, y0 + width/2 * tan(angleInRads));
}
// region 2
if (angleInRads >= atan2(height, width) && angleInRads <= M_PI - atan2(height, width)) {
return CGPointMake(x0 + height/(2*tan(angleInRads)),y0+height/2);
}
// region 3
if (angleInRads >= M_PI - atan2(height, width) && angleInRads <= M_PI + atan2(height, width)) {
return CGPointMake(x0 - width/2, y0 + width/2 * tan(angleInRads));
}
// region 4
return CGPointMake(x0 + height/(2*tan(angleInRads)),y0-height/2);
}
fabuloso! Gracias. Tuve un problema con esto porque en mi caso no me di cuenta de que tenía que [self.superview convertPoint: thePoint toView: self] en mi subclase UIImageview (para otros principiantes que vienen aquí). –
¡Fantástica respuesta! – mrvincenzo
Estoy estudiando su código que es excelente, tratando de entender qué hacer si quería rotar la imagen y aún así mantener la detección de bordes. ¿Alguna idea? – flooie