2015-01-06 1 views
2

좋은 하루.2 차 베 지어 곡선 : 주어진 x 계산

시작점 P1 = (1, 2) 앵커 포인트 P2 = (1, 8) 종점 P3 = (10, 8)

I : I는 다음과 같은 구성으로 이차 베 지어 곡선을 사용하고 에서 주어진 것을 알고 난 X 및 Y는 다음 식에 대한 해결 알고을 P1.x는 X가 등등 P1의 좌표이고

t = 0.5; // given example value 
x = (1 - t) * (1 - t) * P1.x + 2 * (1 - t) * t * P2.x + t * t * P3.x; 
y = (1 - t) * (1 - t) * P1.y + 2 * (1 - t) * t * P2.y + t * t * P3.y; 

한다.

제가 지금 시도한 것은 x 값이 주어지면 wolframalpha를 사용하여 t를 계산 한 다음 그 y를 y 방정식에 연결하고 x 및 y 포인트를 얻습니다.

그러나 t 발견 후 y를 자동화하고 싶습니다. x와 y를 얻는 수식이 있습니다. 그러나, 나는 x를 기반으로하는 공식을 가지고 있지 않습니다. 나는 대수학에 녹슬어있어 t를 고립시키는 첫 번째 등식을 확장하는 것이 너무 쉬운 것처럼 보이지 않습니다.

x를 기반으로하는 공식을 가진 사람이 있습니까? 내 Google 검색 기술은 현재 나를 실망시키고 있습니다.

내 베 지어 곡선이 올바르게 보이는지 주목할 가치가 있다고 생각합니다.

도움이 될 것입니다. 감사.

+0

, 당신은 좌표 x''하나 하나'y'에 대한 몇 가지'x' 여러'y'을 가질 수 있습니다. – karatedog

+0

2 차 베 지어 곡선은 (매개 변수) 함수이며 직선이 아니라면 최대 2 개 지점에서 다른 선과 교차합니다. 수직선 (x = 상수)이있는 교차점에 대해 아래의 간단한 해결책을 제시했습니다. 그게 효과가 없었나요? – dwn

답변

0

Bernstein 다항식 B [i]를보십시오. 당신은 당신이 다시 정렬 할 수 있도록 ... (나는이 권리를했다 가정) ...

x = SUM_i (B[i](t) * P[i].x) 

... 어디 ...

B[0](t) = t^2 - 2*t + 1 
B[1](t) = -2*t^2 + 2*t 
B[2](t) = t^2 

...이

0 = (P[0].x - 2*P[1].x + P[2].x) * t^2 + (-2*P[0].x + 2*P[1].x) * t + P[0].x - x 

이제는 2 차 방정식을 사용하여 t에 대한 솔루션이 존재하는지 (즉, 실제로 복잡하고 복잡하지 않은지) 무엇인지 파악해야합니다.

0

문제는 당신이 해결하고자하는 하나의 (x,y)

  • 어떤 t의 일반적인

    • 에서 함수되지 않는 것입니다 그러나 어떤 x에 대한 t
    0,1,2,+inf 솔루션이 될 수 있습니다

    반복적으로이 작업을 수행합니다.

    • 당신이 이미
    • 그렇게 거리를 d=|p(t).x-x|

      |p(t).x-x|

      1. for(t=0.0,dt=0.1;t<=1.0;t+=dt)
      2. 찾을 모든 지역 분을 최소화하기 위해 t의 반복을 사용하는 점 P (t) = 베 지어 (t)를 얻을 수 있습니다

        • d이 다시 시작될 때
        • |dt|<1e-6 또는 다른 treshold
        • 정지 t 경우가 DT 원래 t 복원 일부 목록
        • 의 해결책을 기억하고 로컬 분 검색 변수를 리셋 구간 <0,1>
        • 벗어나면 dt*=-0.1
        • 정지 설정
      3. 과정의 모든 로컬 분

        • 더 큰 다음 거리 일부 treshold/정확성을 모두 제거
        • 그것은 대수 접근 한 후 훨씬 느립니다

    y

  • 는 점과 무엇을해야 컴퓨팅 ...하지만 당신은 이차원이 아닌 어떤 곡률에도 이것을 사용할 수 있습니다.

    • 일반적으로 3 차 곡선이 사용되고이 대수적 베 지어 곡선은 함수가 아니기 때문에 그들과 함께 y는 악몽
  • 0
    import numpy as np 
    import matplotlib.pyplot as plt 
    
    #Control points 
    p0=(1000,2500); p1=(2000,-1500); p2=(5000,3000) 
    #x-coordinates to fit 
    xcoord = [1750., 2750., 3950.,4760., 4900.] 
    
    # t variable with as few points as needed, considering accuracy. I found 30 is good enough 
    t = np.linspace(0,1,30) 
    
    # calculate coordinates of quadratic Bezier curve 
    x = (1 - t) * (1 - t) * p0[0] + 2 * (1 - t) * t * p1[0] + t * t * p2[0]; 
    y = (1 - t) * (1 - t) * p0[1] + 2 * (1 - t) * t * p1[1] + t * t * p2[1]; 
    
    # find the closest points to each x-coordinate. Interpolate y-coordinate 
    ycoord=[] 
    for ind in xcoord: 
        for jnd in range(len(x[:-1])): 
         if ind >= x[jnd] and ind <= x[jnd+1]: 
          ytemp = (ind-x[jnd])*(y[jnd+1]-y[jnd])/(x[jnd+1]-x[jnd]) + y[jnd] 
          ycoord.append(ytemp) 
    
    
    plt.figure() 
    plt.xlim(0, 6000) 
    plt.ylim(-2000, 4000) 
    plt.plot(p0[0],p0[1],'kx', p1[0],p1[1],'kx', p2[0],p2[1],'kx') 
    plt.plot((p0[0],p1[0]),(p0[1],p1[1]),'k:', (p1[0],p2[0]),(p1[1],p2[1]),'k:') 
    plt.plot(x,y,'r', x, y, 'k:') 
    plt.plot(xcoord, ycoord, 'rs') 
    plt.show() 
    
    +0

    어떤 종류의 설명은 큰 도움이 될 것입니다. – Huey