2012-01-19 4 views
0

나는 사용자가을 그려 라인의 지점이 포함 된 배열에서 마지막 두 CGPoints 있습니다. 동일한 각도로 고정 거리까지 연장해야합니다. 그래서 내가 먼저 내가이 다음 수학주어진 두 점은 주어진 각도에서 세 번째 점을 계산합니까?

-(void)extendLine 
{ 
lineAngle = [self angleBetweenFirstPoint:pointD ToSecondPoint:endPt]; 

extendEndPt.x = endPt.x - cos(lineAngle) * 200; 
     extendEndPt.y = endPt.y - sin(lineAngle) * 200; 

// draw line unto extended point 
} 

의 도움으로 지점을 확장 찾아 각도를 계산 한 후 코드

-(CGFloat)angleBetweenFirstPoint:(CGPoint)firstPoint ToSecondPoint:(CGPoint)secondPoint 
{ 

CGPoint diff = ccpSub(secondPoint, firstPoint); 

NSLog(@"difference point %f , %f",diff.x,diff.y); 

CGFloat res = atan2(diff.y, diff.x); 

/*if (res < 0) 
{ 
    res = (0.5 * M_PI) + res; 
} 

if (dx<0 && dy>0) {  // 2nd quadrant 
    res += 0.5 * M_PI; 
} else if (dx<0 && dy<0) {  // 3rd quadrant 
    res += M_PI; 
} else if (dx>0 && dy<0) {  // 4th quadrant 
    res += M_PI + (0.5 * M_PI); 
}*/ 

//res=res*180/M_PI; 

res = CC_RADIANS_TO_DEGREES(res); 

return res; 
} 

다음의 도움 그러나 POINT I와 마지막 두 점 사이의 각도를 계산 직선과 동일한 각도로 연장 선을 그리는 것이 옳지 않습니다. 나는 그 마지막 지점들 사이에 올바른 각도를 얻지 못하고 있기 때문에 그것이라고 생각한다. 나는 무엇을 잘못하고 있을까? 각도와 방법을 고려하면서 전체 사분면 시스템을 고려해야합니까? 그리고 가로 모드로 작업하고 있습니다. 어떤 차이가 있습니까?

답변

7

예, 당신은 신이 치밀하게 지나치게 복잡해 지도록이 작업을하고 있습니다.

각도가있는 모든 고생물을 건너 뜁니다. 너는 필요 없어. 기간. 벡터와 매우 간단한 작업으로 모두 수행하십시오. 먼저, P1과 P2라는 두 가지 포인트가 있다고 가정합니다. 두 점을 연결하는 선을 따라 P2에서 알려진 거리 (d) 인 새로운 점 P3을 찾고자합니다.

당신이해야 할 일은 먼저 문제의 라인을 가리키는 벡터를 계산하는 것입니다. 내가 MATLAB에서 쓰고 있지만, 모든 이것이 의미하는 것처럼 내가 쓴

V = P2 - P1; 

는 두 점의 x 및 y 좌표를 빼기하는 것입니다.

다음으로 벡터 V를 단위 길이로 스케일합니다.

V = V/sqrt(V(1)^2 + V(2)^2); 

벡터 V의 구성 요소를 벡터의 길이 (또는 원하는 경우 2- 표준)로 나누면 단위 표준이있는 벡터가 만들어집니다. 이 규범은 V의 원소의 제곱합의 제곱근에 불과하므로 분명히 벡터의 길이입니다.

이제 P3을 계산하는 것이 간단합니다.

P3 = P2 + d*V; 

P3 멀리 점 P1로부터 라인 방향, P2에서 D 단위의 거리에 존재할 것이다. 정교한 것은 필요하지 않습니다. 계산 된 각도가 없습니다. 사분면에 대해 걱정할 필요가 없습니다.

벡터 사용 방법을 배우십시오. 그들은 당신의 친구입니다, 아니면 적어도 당신이 그들을 보내 주면 될 수 있습니다.

+0

나는 당신의 스타일이 마음에 들지만, 이것을하기위한 객관적인 -c (또는 적어도 C) 코드를 제공 할 수없는 한 질문자에게 도움이되지는 않습니다. AFAIK에는 코코아에서 벡터를 저장하거나 조작 할 라이브러리가 없습니다. – jrturton

+0

그래, 그럴거야. 그러나 벡터 연산을 수행 할 수없는 경우에도 이러한 연산을 중심으로 몇 가지 간단한 루프를 래핑하는 것이 쉽습니다. 요점은 벡터의 대수를 사용하는 것입니다. –

+0

어쩌면 이것이 올바른 방법 일 수 있습니다. 하지만 난 단위 길이를 가지고 벡터를 스케일링하는 데 어려움을 겪고있다. x와 y 코드가있는 CGPoint (즉, 차이점에서 얻은 V)를 사용합니다. CGPoint로 단위 길이를 어떻게 만들 수 있습니까 ?? – hemant

관련 문제