내가하려는 것 :
1. 점 주위의 점 배열을 균일하게 조정합니다. 2. 포인트는 포인트 배열의 평균 포인트 여야합니다.
아래 코드는 작동하는 것 같지만 적절한 방법인지 모르겠습니다.
균일 스케일링은 단순히 포인트에 어떤 값을 곱한다는 것을 알고 있지만 이것은 0,0,0 포인트에서 스케일링하는 것입니다. 평균 포인트 주변에서 어떻게 수행합니까?
코드는 다음 단계로 세분화 할 수 있습니다.
이 마지막 비트 5 번째 포인트는 값의 전체 길이를 확인한 결과입니다.
내가 전에 생각 해낸 모든 예제는 수학에서 행렬을 사용하는 것이었고 행렬 연산을 읽을 수 없었습니다.
올바른 균일 스케일링 방법입니까, 그렇지 않으면 내가 뭘 잘못하고 있는지 지적 할 수 있습니까?
//Get center of a curve
//That is average of all points
MatMxN curveCenter = MatMxN::Zero(2, 1); //This is just 1 vector/point with x and y coordinates
for (int i = 0; i < n; i++)
curveCenter += points.col(i);
curveCenter /= n;
//Scaling value
float ratio = 1.3;
//Get vector pointing to center and move by ratio
for (int i = 0; i < n; i++) {
MatMxN vector = curveCenter - points.col(i);
MatMxN unit = vector.normalized();
points.col(i) += unit*(1 - ratio)*0.5; //points.col(i) this is point in array
}
특정 중심점 ( 0 이외 )을 사용하여 점을 축척 하려면 다음 단계를 따르십시오.
MatMxN vector = points.col(i) - curveCenter;
vector *= ratio
points.col(i) = vector + curveCenter
이 접근 방식은 공식과 원격으로 유사한 것으로 해결할 수 있습니다. 센터 C
, P0
스케일링 할 포인트 P1
, 스케일링 된 포인트 및 스케일링 계수를 호출 해 보겠습니다 s
. 위의 3 단계는 다음과 같이 작성할 수 있습니다.
v0 = P0 - C
v1 = s * v0
P1 = v1 + C
=>
P1 = s * P0 + C * (1 - s)
이제 우리 P1 = P0 + x
는 일부를 정의 합니다 x
.
P0 + x = s * P0 + C * (1 - s)
=>
x = s * P0 + C * (1 - s) - P0
= C * (1 - s) - P0 * (1 - s)
= (C - P0) * (1 - s)
따라서 언급 된 3 단계를 사용하는 대신 다음과 같이 업데이트를 작성할 수 있습니다.
MatMxN vector = curveCenter - points.col(i);
points.col(i) += vector * (1 - ratio);
그러나 원래 단계에 더 가깝고 직관적으로 이해하기 쉽기 때문에 뺄셈을 반대로 쓰는 것을 선호합니다.
MatMxN vector = points.col(i) - curveCenter;
points.col(i) += vector * (ratio - 1);
정규화와 *0.5
아이디어를 어디에서 찾았는지 모르겠습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다