2016-08-27 11 views
0

점 사이의 메쉬에서 보간을 시도하고 있습니다. 나는 약간의 연구를했고 거의 해결책을 찾지 못했지만, 그것들 모두는 저에게 이상한 결과를 만들어냅니다. 나는 Cosinus와 Cubic 보간법을 시도했지만, 전체 메시는 매끄럽지 않고 작은 파도를 얻습니다. 두 점 사이의 매끄러운 보간

는 여기에서이

mu2 = mu*mu; 
    a0 = y3 - y2 - y0 + y1; 
    a1 = y0 - y1 - a0; 
    a2 = y2 - y0; 
    a3 = y1; 

    return(a0*mu*mu2+a1*mu2+a2*mu+a3); 

을 시도 : 나는 모든 점을 얻었다 http://paulbourke.net/miscellaneous/interpolation/

내가 필요로하는 모든 작동해야하지만, 밤은. 나는 그것을 디버깅하는 데 많은 시간을 보냈지 만, 문제가되는 것으로 발견 된 것은 mu에서 보았을 때 0.0에서 1.0까지의 일반 t는 P1에서 0.0으로 시작하지만 1.0에서는 P3에서 시작한다는 것입니다. P2 (P1, P2 사이의 보간이 발생하는 지점 P0, P1, P2, P3)에 있어야합니다.

두 가지 점 사이의 보간법이 더 좋은 방법이 있다면 알려주십시오. 나 bezier 커브 또는 컨트롤 포인트와 같은 것을하고 싶지 않아. 난 그냥 두 점을 가지고 위의 예제와 같은 각 측면에 하나 더 포인트를 사용할 수 있습니다. 어떤 도움

덕분에 누가 복음

+1

[Catmull-Rom spline] (http://www.mvps.org/directx/articles/catmull/)을 사용하는 것이 좋습니다. –

+0

부끄러움을 참아 주셔서 감사합니다. 나는 이것을 할 수 있다면 나는 정답으로 표시 할 것이다. – CosmicSeizure

답변

1

캐트 멀 - 롬 스플라인은 데이터에 적합 할 것으로 보인다. VB.NET에서 구현의 예로서

:

Module Module1 

    ''' <summary> 
    ''' A class for a 2-D point and operations on it. 
    ''' </summary> 
    Class PointD 
     Property X As Double 
     Property Y As Double 

     Public Shared Operator +(p1 As PointD, p2 As PointD) As PointD 
      Return New PointD(p1.X + p2.X, p1.Y + p2.Y) 
     End Operator 

     Public Shared Operator -(p As PointD) As PointD 
      Return New PointD(-p.X, -p.Y) 
     End Operator 

     Public Shared Operator -(p1 As PointD, p2 As PointD) As PointD 
      Return New PointD(p1.X - p2.X, p1.Y - p2.Y) 
     End Operator 

     Public Shared Operator *(a As Double, p As PointD) As PointD 
      Return New PointD(a * p.X, a * p.Y) 
     End Operator 

     Public Shared Operator *(p As PointD, a As Double) As PointD 
      Return New PointD(a * p.X, a * p.Y) 
     End Operator 

     'TODO: (Optional) Add methods for magnitude, cross product and dot product. 

     Public Sub New() 
      ' empty contructor 
     End Sub 

     Public Sub New(x As Double, y As Double) 
      Me.X = x 
      Me.Y = y 
     End Sub 

     Public Overrides Function ToString() As String 
      ' use the N3 format string for tidiness in this example 
      Return $"({X:N3}, {Y:N3})" 
     End Function 

    End Class 

    ''' <summary> 
    ''' Ordinary Catmull-Rom interpolation. 
    ''' </summary> 
    ''' <param name="t">Vary from 0.0 to 1.0 to get an interpolated point between data points p1 and p2.</param> 
    ''' <param name="p0">The first control point.</param> 
    ''' <param name="p1">The first data point.</param> 
    ''' <param name="p2">The second data point.</param> 
    ''' <param name="p3">The second control point.</param> 
    ''' <returns>The interpolated point.</returns> 
    Function CatmullRomInterpolate(t As Double, p0 As PointD, p1 As PointD, p2 As PointD, p3 As PointD) As PointD 
     ' this is the regular Catmull-Rom spline 
     ' other ways of treating it can be found at: 
     ' https://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-And-no-self-intersections 
     Return 0.5 * ((2 * p1) + 
      t * (p2 - p0) + 
      Math.Pow(t, 2) * (2 * p0 - 5 * p1 + 4 * p2 - p3) + 
      Math.Pow(t, 3) * (3 * (p1 - p2) + p3 - p0)) 

    End Function 


    Sub Main() 
     ' some sample data which will produce a symmetrical wave shape... 
     Dim p0 As New PointD(-1, 1) 
     Dim p1 As New PointD(0, 0) 
     Dim p2 As New PointD(1, 0) 
     Dim p3 As New PointD(2, -1) 

     For t = 0.0 To 1.0 Step 0.1 
      Console.WriteLine(CatmullRomInterpolate(t, p0, p1, p2, p3)) 
     Next 

     Console.ReadLine() 

    End Sub 

End Module 

당신이 필요에 따라 Catmull-rom curve with no cusps and no self-intersections 유용 할 수 있습니다.