2012-07-18 2 views
3

이 문제를 해결하는 데 가까워지고 있지만 문제가되는 부분이 있습니다. 사용자가 캔버스에서 회전, 크기 조절 및 배치 할 수있는 눈금자 객체를 모방하려고 시도하고 가장자리를 따라 추적하여 캔버스에 마크를 만듭니다. 내가 겪고있는 문제는 사용자의 손가락이 어디에 있느냐에 관계없이 줄의 다음 지점을 얻는 것입니다. 포인트에서부터 내가 가지고있는 가장자리를 따라 작은 투명한 뷰로 포인트를 되돌릴 수는 있지만 앨리어싱 (aliasing) (또는 무언가)으로 인해 라인은 순수한 직선 (0, 90, 180)이 아닌 다른 각도로 그려지는 것처럼 꼬여 있습니다. , 270). 또한 CGRectContainsPoint와 같은 함수를 작성하려고 시도했습니다. 단, 임의의 회전 사각형을 사용하지만 성공하지 못했습니다. 여기 눈금자 물체의 가장자리를 따라 그리기

는 사용자의 터치에 따라 포인트 계산 코드입니다 때문에 어떤 이유로,

- (CGPoint)perpendicularPointFromPoint:(CGPoint)point 
{ 
    CGPoint testPoint1 = point; 
    CGPoint testPoint2 = testPoint1; 
    CGPoint pointToUse = CGPointZero; 

    //Get the right angle to the current rotation, and make 
    //a unit vector in that direction 
    CGFloat rightAngle = mCurRotation + M_PI_2; 
    CGFloat xInc = cosf(rightAngle); 
    CGFloat yInc = sinf(rightAngle); 

    //Check both "forward" and "backward" 
    int counter = 0; 
    while(pointToUse.x == 0) 
    { 
     testPoint1.x += xInc; 
     testPoint1.y += yInc; 
     testPoint2.x -= xInc; 
     testPoint2.y -= yInc; 

     //mLineOutline is a small view on top of the ruler (transparent) 
     if([self.superview hitTest:testPoint1 withEvent:nil] == mLineOutline) 
     { 
      pointToUse = testPoint1; 
     } 
     else if([self.superview hitTest:testPoint2 withEvent:nil] == mLineOutline) 
     { 
      pointToUse = testPoint2; 
     } 
     else if(counter++ > 1000) //Neither ray intersects the ruler 
      pointToUse.x = -1.f; 
    } 

    return CGPointMake(roundf(pointToUse.x), roundf(pointToUse.y)); 
} 

그러나을 줄 불안감 나는 위아래로하지만, 매우 눈에 띄는 그것은 (단지 몇 픽셀을 그릴 때). 이 문제를 해결하기 위해 무엇을 할 수 있습니까? 또한 덜 어색한 방법이 있습니까?

+0

뚱뚱한 손가락을 사용하는 사용자의 그림이 눈금자의 가장자리에 "물리기"때문에 손가락의 움직임이 그려진 선의 길이를 나타냅니다. 그리고 당신이 얻고있는 "경련"은 그 길이만큼 오래 있을까요? 또는 통치자로부터 수직으로/떨어져 있습니까? –

+0

@JoshCaswell 손가락을 단단히 고정시키지 않아도 그리는 동안 눈금자에서 작은 점 (1cm, 2cm)을 볼 수 있고 직선을 볼 수 있습니다. 귀하의 요약도 꽤 정확합니다. 원하는만큼 멀리 손가락을 움직여 그리는 선을 볼 수 있습니다. 직선은 눈금자에 수직으로 꼬여 있고 길이는 매우 매끄 럽습니다. 나는 그것이 반 화소와 히트 테스트와 관련이 있다는 것을 알고있다. – borrrden

+0

그리고'mLineOutline'이 그것의 가장자리가 눈금자와 같도록 회전됩니까? 이 방법을 확인하는 방법을 잘 모르겠지만 superview가 히트 테스트에 사용하는 사각형이 회전 된 뷰의 rect와 동일한 지 확신합니까? 가장 작은 _non-rotated_ enclosing 사각형 (즉, 프레임/경계 구분이 갑자기 중요 해짐)을 고려하여 수퍼 뷰에 대한 뷰 가이드의 내용을 기억합니다. 내가 그것을 찾을 수 있는지 보자 ... –

답변

3

Josh Caswell의 의견은 나에게 아이디어를 제공했습니다. this 기사에서는 어린이의 좌표가 로컬 공간에 저장됨을 나타냅니다. 전에는이 사실을 알고 있었지만 어떻게 든 회전 시키더라도 항상 그 방향을 바라 볼 수 있다는 생각이 들었습니다. 월드 공간 (또는 부모 공간)의 좌표 만 회전됩니다.

그래서 superview에서 터치 포인트를 얻은 다음 계산하는 대신 하위 뷰에서 터치 포인트를 얻습니다. y 값을 -2 또는 내가 원하는대로 (로컬 공간에서 항상 위로 향하기 때문에 자 위에) 변경하고 [self convertPoint:point toView:self.superview];을 사용하여 뷰 계층 구조로 어려운 부분을 처리하도록합니다.

관련 문제