根据触摸位置在屏幕上放置图像,将图像的位置限制为一个圆形
问题描述:
我在根据触摸位置定位图像时遇到问题,但仅限于圆形。根据触摸位置在屏幕上放置图像,将图像的位置限制为一个圆形
它适用于大多数情况,但如果角度(从触摸位置到所需位置)小于0,则会将图像定位在圆圈的错误一侧。
也许这是我做错了一些数学。
总之,这里的代码:
float newHeight, newWidth, centerPointX, centerPointY;
newHeight = -(invertedY.y - (view.frame.origin.y+view.frame.size.height/2));
newWidth = -(invertedY.x - (view.frame.origin.x+view.frame.size.width/2));
float tangent = newHeight/newWidth;
float calculatedAngle = atanf(tangent);
float s, c, d, fX, fY;
d = view.frame.size.width/2+30;
if (calculatedAngle < 0) {
s = sinf(calculatedAngle) * d;
c = cosf(calculatedAngle) * d;
} else {
s = -sinf(calculatedAngle) * d;
c = -cosf(calculatedAngle) * d;
}
fX = view.center.x + c;
fY = view.center.y + s;
[delegate setPoint:CGPointMake(fX, fY)];
NSLog(@"angle = %.2f", calculatedAngle);
任何帮助表示赞赏。
答
我认为将位置限制为圆的最佳方法是从中心到触摸位置计算矢量。计算矢量长度,然后将其除以该长度,以便将其标准化。然后将归一化矢量乘以圆的半径,最后将此矢量添加到中心以计算新位置。
CGPoint touch, center;
CGPoint vector = CGPointMake(touch.x-center.x, touch.y-center.y);
float length = sqrtf(vector.x*vector.x + vector.y*vector.y);
// Normalize and multiply by radius (r)
vector.x = r * vector.x/length;
vector.y = r * vector.y/length;
[delegate setPoint:CGPointMake(center.x + vector.x, center.y + vector.y)];
它完美的工作,谢谢。 –