Касательные значения в кривых Эрмита - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь нарисовать кривые, используя метод Эрмита в C ++. Я знаю, что две точки являются начальной и конечной точками, а две другие дают касательные на двух концах. Конечные точки можно угадать напрямую, но как определить значение касательных. Когда я даю простые значения, я оказываюсь либо на прямой линии, либо на кривой.

Мой код:

//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 голосов
/ 25 апреля 2018

Если у вас есть только две точки, трудно определить касательные любым осмысленным способом.Естественный выбор - установить их на 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)

который должен придать некоторую кривизну линии.

Если вам нужны более сложные касательные, вы можете попробовать Сплайн Кочанека-Бартельса (Википедия), который имеет три параметра (напряжение, смещение и непрерывность) для управления интерполяцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...