Hermite曲线中的切线值

时间:2018-04-25 15:59:32

标签: c++ graphics

我试图在C ++中使用Hermite方法绘制曲线。我知道两点是起点和终点,而其他两点是两端的切线。终点可以直接猜测,但如何确定切线的值。当我给出简单的值时,我要么是直线,要么是曲线中的循环。

我的代码如下:

//Using tangents

#include<iostream>
#include "graphics.h"
//#include"DDALine.h"
using namespace std;

void calcP(float P0x, float P0y, float R0x, float R0y, float P1x, float P1y, float R1x, float R1y, float Px, float Py, float t){
    Px = (2 * t * t* t -3*t*t +1)*P0x + ( t*t*t - 2 *t*t +t)*R0x + (-2 * t*t*t + 3*t*t )*P1x +(t*t*t -t*t )*R1x;
    Py = (2 * t * t* t -3*t*t +1)*P0y + ( t*t*t - 2 *t*t +t)*R0y + (-2 * t*t*t + 3*t*t )*P1y +(t*t*t -t*t )*R1y;
            putpixel(Px, Py, WHITE);
}

int main(){
    int gd = DETECT, gm;
    initgraph(&gd, &gm, "C:\\TC\\BGI");

    float t = 0;
    float P0x = 71, P0y = 165, R0x = -12, R0y = 2, P1x = 210, P1y = 153, R1x = 108, R1y = 0, Px= 0, Py = 0, Pz = 0;
    while(t<1){
        calcP(P0x, P0y, R0x, R0y, P1x, P1y, R1x, R1y, Px, Py, t);
        t+=0.001;
    }

    getch();
    closegraph();
    return 0;
}

感谢您的帮助!迫切需要。 :)

1 个答案:

答案 0 :(得分:1)

如果您只有两个点,则很难以任何有意义的方式定义切线。自然的选择是将它们设置为0.这只会在点之间画一条线,这当然不是很明显。

如果你有更多的点,定义切线的简单方法就是所谓的基数样条。对于点k,给出切线

R k =(1-c)(P k + 1 - P k-1

c是介于0和1之间的参数.c = 1为您提供直线和c = 0更多弯曲答案。

如果您想使用当前代码轻松测试它。你可以想象点-1和2,例如P -1 =(10,10)和P 2 =(150,120)。这给出了切线(c = 0)

R 0 =(200,143)且R 1 =(79,-45)

应该为线条提供一些曲率。

如果你想要更复杂的切线,你可以尝试Kochanek-Bartels spline(维基百科),它有三个参数(张力,偏差和连续性)来控制插值。