1

Line rotation around specific point아이폰 OS는 : 위의 그림을 참조에서는 나는이 고민하고 터치에 의해

남자를 조정 될 수있는 점에 대해 라인이 ...

회전, 나는 라인을 가지고 특정 지점에 고정되어 있습니다. 라인의 다른 쪽 끝에서 고정되어 있지 않은 다른 점이 화면의 아무 위치로든 드래그 될 수 있습니다. 나는 그 점을 따라갈 수있는 선이 필요하고 길이가 변하지 않고 그것의 위치와 관련하여 회전 될 수 있어야한다.

나는이 모든 것이 고정 길이의 선을 가지지 않고 아주 쉽게 달성 될 수 있음을 알고있다.

당신은 단순히 같은 drawRect:에서 UIBezierPath을 그릴 수 :

UIBezierPath *bezPath = [UIBezierPath bezierPath]; 
[bezPath moveToPoint:fixedPointStart]; 
[bezPath addLineToPoint:draggedPointEnd]; 
[bezPath stroke]; 

그런 다음 드래그 된 지점의 새로운 좌표를 통과하고 다시 그려 가지고 당신의 UIView에 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event[self setNeedsDisplay]를 호출합니다.

하지만 앞서 언급 한 것처럼 고정 길이가되도록 라인이 필요합니다.

다른 점은 (차이가 있는지 확실하지 않은 경우) 라인이 실제로 불규칙한 모양의 더 큰 UIBezierPath의 일부라는 것입니다. 그림에 표시된 "특정 고정 점"은이 선을 더 큰 불규칙한 UIBezierPath에 첨부하는 지점입니다. 선은 다음 코드에서 볼 수있는 것과 같이 UIBezierPath의 일부로 그려집니다.

// I AM CREATING THE FIXED POINT HERE THAT IS BEING RETURNED BY A CUSTOM METHOD 
WHICH FINDS THE POINT OF ATTACHEMENT TO THE LARGER IRREGULAR SHAPED UIBEZIERPATH. 
// THE DRAGGABLE POINTS ARE ACTUALLY UIVIEW'S AND I'M USING THEIR ORIGINS. 

CGPoint fixedPoint = [aPath findCurveBezierPathPointInBetweenTheStartPoint:point1.frame.origin 
                  theEndPoint:topCurvePoint.frame.origin 
             withFirstControlPoint:topCurveFirstControlPoint.frame.origin 
        andSecondControlPoint:topCurveSecondControlPoint.frame.origin atPercentage:0.3]; 




// This is the fixed point 
CGPoint startPoint = fixedPoint; 

// This is the point that is going to be able to be dragged 
CGPoint endPoint = topCurveFirstControlPoint.frame.origin; 


// I am finding the angle in between these two points to pass in an CGAffineTransform for the rotation. 
float angle = [self getRotatingAngle:startPoint secondPoint:endPoint]; 
NSLog(@"Angle in Radians: %f",angle); 



// I am creating the transform by passing in the angle and doing the necessary translations for the rotation to occur on the fixed point. 
CGAffineTransform transform = CGAffineTransformMakeTranslation(fixedPoint.x, fixedPoint.y); 
transform = CGAffineTransformRotate(transform, angle); 
transform = CGAffineTransformTranslate(transform,-fixedPoint.x,-fixedPoint.y); 


// I am setting up to draw the line of fixed length and applying the transform and 
[aPath moveToPoint:startPoint]; 
[aPath addLineToPoint:CGPointMake(fixedPoint.x, fixedPoint.y - 60)]; 
[aPath applyTransform:transform]; 



// I then continue to draw the rest of the BezierPath and stroke it at the end.  
[aPath moveToPoint:point1.frame.origin]; 

[aPath addCurveToPoint:topCurvePoint.frame.origin controlPoint1:topCurveFirstControlPoint.frame.origin controlPoint2:topCurveSecondControlPoint.frame.origin]; 

그래서 제 질문은 다음과 같습니다 : 그래서 여기

내가 지금 가지고있는 것입니다 내가 호출 될 때마다 drawRect:로 변환 할 고정 라인을 가지고있는 올바른 각도을 어떻게 찾을 때 드래그를 포인트가 새로운 위치를 찾았습니까?

내가 고정 점과 끌기 점 사이의 각도를 찾는 데 사용하는 방법은 내가 테스트 한 것처럼 올바른 각도를 제공합니다. 그러나 나는 그 두 점 사이의 각도를 드래그 할 수있는 지점과 관련하여 올바르게 회전시키는 방법을 알아낼 수 없습니다.

편집 : 정확하게 수행하려는 작업에 대한 더 나은 설명을 위해 Link이 추가되었습니다.

+0

피타고라스는 여러분의 친구입니다. – Till

+0

정교하게 주시겠습니까? 나는 두 점 사이의 각도를 안다. 나는 그것을 회전에 적용하는 데 어려움을 겪고있다. – DanielRak

답변

0

왜 변형하고 있습니까? 그것의 간단한 기하학. 중심점과 현재 점 사이의 각도를 찾을 수 있습니다. 길이가 같기 때문에 경로는 기본적으로 원입니다. 중심점과 각도를 사용하여 원 위에 점을 찾으십시오. 터치 포인트를 드래그 한 후 currentPoint라고 가정합니다.

CGFloat angle = atan2f(currentPoint.y - centre.y, currentPoint.x - centre.x); 

지금 위의 각도에 해당하는 원의 포인트를 찾을 : 각도 사용을 찾으려면 길이가 고정 길이입니다

finalPoint.x = centre.x + length * cosf(angle); 
finalPoint.y = centre.y + length * sinf(angle); 

. 이제 quartz-2d를 사용하여 center와 finalPoint 사이에 선을 그릴 수 있습니다.

참고 : 각도가 음수가 될 수 있습니다. 그래서 당신의 구현에 당신이 그것을 + ve 각도로 변환하고 싶을 수도 있습니다.

if (angle < 0) 
    angle += 2 * M_PI;