Bir eğrinin parametrik olarak tanımlanması için  Pierre Bézier tarafından ~1960 yıllarda bulunmuştur. P0, P1, P2, … PN olmak üzere n adet kontrol noktası bulunur. n eğrinin derecesini temsil eder ( 1->linear; 2->quadratic; 3->cubic; …).

Eğer iki kontrol noktamız varsa P0 ve P1; (Linear)
P0 noktasından P1 noktasına giden bir noktanın ardında bıraktığı iz olarak düşünebilirsiniz. Yani aslında lineer interpolasyon yapıyoruz 🙂

Eğer üç noktamız varsa P0, P1 ve P2; (Quadratic)
P0 noktasından P1 noktasına giden noktaya A;
P1 noktasından P2 noktasına giden noktaya B diyelim;
Artık elimizde A ve B olmak üzere iki nokta var;
A noktasından B noktasına giden noktanın ardında bıraktığı iz bize eğrimizi verecektir.

Yani uzun lafın kısası yaptığımız şey lineer interpolasyondan başka bir şey değil.

Quadratic Curve

glm::vec3 bezierQuadratic(
    const glm::vec3& a,
    const glm::vec3& b,
    const glm::vec3& c,
    float t)
{
    glm::vec3 ab = glm::mix(a, b, t);
    glm::vec3 bc = glm::mix(b, c, t);

    return glm::mix(ab, bc, t);
}
  • a, b ve c birer nokta t de [0, 1] aralığında değişkenimiz.
  • glm::mix ise lineer interpolasyon fonksiyonumuz.
  • a’dan b’ye giden noktamız ab
  • b’den c’ye giden noktamız bc
  • ab noktasından bc noktasına giden noktamızın koordinatı:
    glm::mix(ab, bc, t);

Cubic Curve


glm::vec3 bezierCubic(
    const glm::vec3& a,
    const glm::vec3& b,
    const glm::vec3& c,
    const glm::vec3& d,
    float t)
{
    glm::vec3 ab = glm::mix(a, b, t);
    glm::vec3 bc = glm::mix(b, c, t);
    glm::vec3 cd = glm::mix(c, d, t);

    glm::vec3 ab_bc = glm::mix(ab, bc, t);
    glm::vec3 bc_cd = glm::mix(bc, cd, t);

    return glm::mix(ab_bc, bc_cd, t);
}

mix performs a linear interpolation between x and y using a to weight between them. The return value is computed as x×(1−a)+y×a.



Comments

Leave a Reply

Your email address will not be published. Required fields are marked *