(주의 : 여기서는 두 가지 근사법을 사용하고 있습니다. 첫 번째는 d를 호 길이로, 두 번째는 직교 길이로 사용합니다.이 두 근사값은 비교적 작은 d 값에 적합하지만 만족하지는 않습니다. 의견에 명시된 정확한 질문.)
다행히도 이것에 대한 수학은 비교적 간단합니다. 우선, 중심 위치에서 현재 위치까지의 상대 벡터를 찾을 수 있습니다.
deltaX = oX-cX;
deltaY = oY-cY;
이 상대 벡터를 얻은 후에는 길이를 찾아서 작업하는 원의 반경을 알 수 있습니다.
radius = sqrt(deltaX*deltaX+deltaY*deltaY);
또한 상대 벡터에서 cX에서 oX까지의 선이 정확한 각도를 찾을 수 있습니다.
curTheta = atan2(deltaX, deltaY);
이제 상황이 조금 까다로워집니다. 우선, 원의 원주, 즉 각도가 2π 인 호의 '원호 길이'가 2πr임을 이해하십시오. 일반적으로 반지름 r의 원을 따라 각도 측정이 θ 인 호의 호 길이는 θr입니다. 다이어그램에서 d를 호 길이로 사용하고 반지름을 알기 때문에 세타에서 변화를 찾아서 새로운 위치로 이동시킬 수 있습니다.
deltaTheta = d/radius; // treats d as a distance along the arc
d가 선형 거리 여야하는 경우 상황이 조금 더 복잡하지만 다행이 아닙니다. 여기에서 d는 다른 두 변이 각각 원의 반지름 (각각 cX / cY에서 oX / oY 및 aX / aY) 인 이등변 삼각형의 한 변이며,이 이등변 삼각형을 이등분하면 두 개의 직각 삼각형이 생깁니다. 빗변과 같이 한쪽과 반지름으로 d / 2를 가지며; 이것은 우리 각도의 사인 값이 (d / 2) / 반지름이므로 전체 각도는이 값의 두 배에 불과하다는 것을 의미합니다.
deltaTheta = 2*asin(d/(2*radius)); // treats d as a linear distance
이 공식에서 asin을 꺼내고 2를 취소하면 마지막 공식과 동일합니다. 이것은 sin (x)가 x의 작은 값에 대해 대략 x라는 것입니다. 이는 유용한 근사치입니다.
이제 우리는 단지 더하거나 빼서 새로운 각도를 찾을 수 있습니다.
newTheta = curTheta+deltaTheta; // This will take you to aX, aY. For bX/bY, use curTheta-deltaTheta
새로운 각도를 가지면 기본적인 삼각법을 사용하여 업데이트 된 상대 벡터를 찾을 수 있습니다.
newDeltaX = radius*cos(newTheta);
newDeltaY = radius*sin(newTheta);
중심 위치와 상대 벡터에서 목표 지점을 (최종적으로) 찾을 수 있습니다.
aX = cX+newDeltaX;
aY = cY+newDeltaY;
이제이 모든 것들에 대해 알아야 할 몇 가지 큰 경고가 있습니다. 우선,이 수학은 대부분 부동 소수점이며 실제로는 거의 부동 소수점임을 알아야합니다. 이 방법을 사용하여 루프를 업데이트하고 모든 단계에서 정수 값으로 반올림하면 원이 닫히지 않도록하는 것 (루프를 돌 때마다 안쪽으로 또는 바깥쪽으로 나선형으로 돌리는 것)에서 처음 시작하지 않는 것까지 모든 작업을 수행 할 수 있습니다 장소! (d가 너무 작 으면 aX / aY 또는 bX / bY의 둥근 버전이 정확히 시작 위치 oX / oY 인 위치를 발견 할 수 있습니다.) 다른 경우, 특히 시도하려는 작업의 경우 매우 비쌉니다. 하다; 당신이 당신의 캐릭터가 원호 이동 될 것입니다 알고있는 경우 일반적으로, 당신은 전체 아크 사전에 밖으로 계획해야 하지여기에서 가장 비싼 계산을 전면로드하여 비용을 절감 할 수 있으므로 프레임 단위로이를 선택하십시오. 이와 같이 점진적으로 업데이트하려면 비용을 줄이는 또 다른 좋은 방법은 우선 trig를 사용하지 않는 것입니다. d가 작고 정확 해야 할 필요는 없지만 매우 가까우면 길이 d의 벡터를 oX / oY에 추가하고 중심을 향한 벡터에 직교하는 '트릭'을 수행 할 수 있습니다. (dX, dY)에 직교하는 벡터는 (-dY, dX))로 주어진 다음 올바른 길이로 줄입니다. 이 코드를 단계별로 설명하지는 않지만 지금까지 본 내용을 고려하면 이해가 되길 바랍니다. 마지막 단계에서 새 델타 벡터를 암시 적으로 '축소'합니다.
deltaX = oX-cX; deltaY = oY-cY;
radius = sqrt(deltaX*deltaX+deltaY*deltaY);
orthoX = -deltaY*d/radius;
orthoY = deltaX*d/radius;
newDeltaX = deltaX+orthoX; newDeltaY = deltaY+orthoY;
newLength = sqrt(newDeltaX*newDeltaX+newDeltaY*newDeltaY);
aX = cX+newDeltaX*radius/newLength; aY = cY+newDeltaY*radius/newLength;
d
직선 거리 입니까 , 아니면 호입니까?