Как перетащить вид по окружности овала? - PullRequest
0 голосов
/ 22 ноября 2011

У меня есть овал и вид на окружность овала. При попытке перетащить вид, вид следует перемещать только по окружности овала. Как мне этого добиться? Любое примерное уравнение будет полезным. Спасибо.

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011
CGPoint ovalCenter;
CGSize ovalSize;

- (CGPoint)constrainPointToOval:(CGPoint)point
{
    float angle = atan2(point.y - ovalCenter.y, point.x - ovalCenter.x);

    return CGPointMake(ovalSize.width * cosf(angle), ovalSize.height * sinf(angle));
}

Вам нужно будет установить ovalCenter и ovalSize в другом месте. Затем проведите позицию касания через это перед установкой местоположения представления.

0 голосов
/ 25 ноября 2011

Я нашел решение для получения ограниченного сопротивления по сторонам квадрата.Если кто-то может улучшить код или найти лучшее решение, добро пожаловать.

- (CGPoint) constrainPointToSquare:(CGPoint) point
{
float pi = 3.14159265;
float s1,s2;
CGPoint squareDragPoint;

float squareSize = 200.0;
float angle;

angle = atan2 (point.y - mCenter.y, point.x - mCenter.x);

float x1 = point.x;
float x2 = mCenter.x;
float y1 = point.y;
float y2 = mCenter.y;

if (((3*(pi/4) <= angle && pi >= angle) || (-pi <= angle  && -3*(pi/4) >= angle)))//left
{
    s1 = y2 - squareSize;
    s2 = x2 - squareSize * ((y1-y2)/(x1-x2));
    squareDragPoint = CGPointMake(s1, s2);
}
else if (((-(pi/4) <= angle  && 0.0 >= angle) || (0.0 <= angle  && (pi/4) >= angle))) //right
{
    s1 = y2 + squareSize;
    s2 = x2 + squareSize * ((y1-y2)/(x1-x2));
    squareDragPoint = CGPointMake(s1, s2);
}
else if (((-3*(pi/4) <= angle && -(pi/2) >= angle) || (-(pi/4) >= angle  && -(pi/2) <= angle))) //top
{
    s1 = x2 - squareSize;
    s2 = y2 - squareSize * ((x1-x2)/(y1-y2));
    squareDragPoint = CGPointMake(s2, s1);
}
else if (((3*(pi/4) >= angle && (pi/2) <= angle) || (pi/4 <= angle && (pi/2) >= angle))) //bottom
{
    s1 = x2 + squareSize;
    s2 = y2 + squareSize * ((x1-x2)/(y1-y2));
    squareDragPoint = CGPointMake (s2, s1);
}
return squareDragPoint;
}
...