2014-01-20 5 views
0

나는 주변을 둘러 보았고, 내가하려고하는 것이 아무것도없는 것처럼 보인다. 이미 그려진 포인트 그래프가 주어진다면 마우스를 사용하여 2 차 베 지어 곡선에 필요한 세 번째 제어 포인트를 만든 다음 모든 포인트의 새 위치를 계산하십시오.베 지어 곡선을 사용하여 그래프 조작하기

나는 위키 백과에서 주로이 공식을 바탕으로 작업하고 있습니다. Quadratic Bezier Equation

내가하고있는 일은 다음과 같습니다.

foreach (PointPair p in RelevantPoints) 
{ 
    double t = (p.X - startPoint.X)/(endPoint.X - startPoint.X); 
    p.Y = p.Y - 
     Functions.CalculateBezierPoint(startPoint.Y, endPoint.Y, 
      referencePoint.Y, t); 
} 

public static double CalculateBezierPoint(double startY, double endY, 
    double referenceY, double t) 
{ 
    return Math.Pow(1 - t, 2)*startY + 2*(1 - t)*t*referenceY + 
     Math.Pow(t, 2)*endY; 
} 

여기에서 referencePoint은 현재 마우스 위치입니다. 저는 수학자는별로 아니지만 현재로서는 분명합니다. 그래프는 베 지어 커브에서 예상하는 것처럼 마우스 위치쪽으로 편향되는 대신 간단한 포물선으로 구부러집니다.

이 경우 X 값을 이동할 수 없기 때문에 Y 값만 계산했습니다.
t도 X 값이 시간의 99 %이고 일정한 거리가 아니기 때문에 매번 계산됩니다. t 값이 의미하는 바를 오해하지 않는 한, 그 일에 영향을 미치지 않아야합니다.

내가 잘못하고있는 것에 대한 제안 사항이 있으십니까?

답변

1

당신은 오해하고 있습니다. t의 값은 0에서 1까지입니다. t가 0에서 1까지 다양하기 때문에 B (t)는 시작 지점에서 끝 지점까지의 곡선을 나타냅니다. t = 0 일 때 B (t) = P0이 시작점이됩니다. t = 1, B (t) = P2 일 때 종점이다. 1> t> 0이면 B (t)는 베 지어 곡선의 각 점을 나타냅니다. 따라서 곡선을 그리려면 0에서 1까지 t를 반복하고 각 B (t)를 계산하고 캔버스에서 각 점을 그려야합니다.

의사 코드 :

for (t from 0 to 1, different increment is 0.01) { 
    point_x = B(t, P0_x, P1_x, P2_x); 
    point_y = B(t, P0_y, P1_y, P2_y); 
    point_z = B(t, P0_z, P1_z, P2_z); 
    draw_point(point_x, point_y, point_z); 
} 

function B(t, P0, P1, P2) { 
    return (1-t)*(1-t)*P0 + 2*t*(1-t)*P1 + t*t*P2; 
} 
+0

그것을 이해 방법't' 산출되는 점 사이 단지 단계이다. 내가 't'를 계산하는 방식은 나에게 0과 1 사이의 값을 줄 것이고, 수동으로 증가시키는 것과 같은 목적을 제공해야한다. 왜 이것이 작동하지 않는지 더 잘 설명 할 수 없다면? – Trent

+0

새로운 베 지어 곡선을 그리려면 새로운 P0, P1, P2를 사용하면 새로운 베 지어 곡선을 얻을 수 있습니다. 오래된 커브는 부적합합니다. – afkfurion

+0

제 질문을 제대로 읽지 않았다고 생각합니다. 예전의 커브는 매우 적절합니다. X 값은 움직일 수 없습니다. 아마 베 지어 커브는 내가 한 것에 대한 해결책이 아니지만, 당신이 말하는 것은 아닙니다. – Trent