25 / 23 / 2
Регистрация: 13.12.2009
Сообщений: 88
1

Кривая Безье по 4 точкам

02.03.2016, 18:34. Показов 3528. Ответов 1
Метки нет (Все метки)

Доброго времени суток. В общем зада стоит написать програмку где будет рисоваться кривая Безье, но меня уже берет поплава по этому поводу. Задача в общем состоит в том, что бы нарисовать машину (косо криво, главное что бы работал сам метод Безье). Но как бы я не старался, если открыть цикл, то программа зависает напрочь. Большинство из того что закомментировано является моими методами проб и ошибок, и попытка сделать так, что бы програ не зависала.
То что осталось не закомментировано, это последний тест, и точка у меня по нему первая появляется фиг знает где. Я уже и пробовал как-то подстроится с готовых программ которые нашел в инете, но никак не получается сделать этого. Получается так, что не понимаю сам смысл, каким образом оно должно отрисовать. Я видел что там переносили просчитанные точки в отдельный массив, но так же не понял зачем это. Помогите кто может, укажите на мои ошибки. Можно было бы конечно взять готовую программу на том же вижуал студио (ибо ограничение где писать у меня нету). Но мне не интересно по большей части взять тупо готовую программу, рассказать в ней какая строка что делает, и получить за это оценку.

Вот что у меня есть на кнопке отрисовки:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
void __fastcall TForm1::Button4Click(TObject *Sender)
{
 
 
    int x1=toch[0].x;
    int x2=toch[1].x;
    int x3=toch[2].x;
    int x4=toch[3].x;
 
    int y1=toch[0].y;
    int y2=toch[1].y;
    int y3=toch[2].y;
    int y4=toch[3].y;
    int num=0;
 
    /*
    for (double i=0; i<=1; i+0.5)
    {
        //x_temp=(toch[0].x+toch[1].x+toch[2].x+toch[3].x)*i;
        //y_temp=(toch[0].y+toch[1].y+toch[2].y+toch[3].y)*i;
 
        //x_temp=toch[0].x*(1-i)^3+toch[1].x*i*(1-i)^2+toch[2].x*i^2*(1-i)+toch[3].x*i^3;
        //y_temp=toch[0].y*(1-i)^3+toch[1].y*i*(1-i)^2+toch[2].y*i^2*(1-i)+toch[3].y*i^3;
 
        //x_temp=((1-i)^3)*toch[0].x+(3*i*(1-i)^2)*toch[1].x+(3*(i^2)*(1-i))*toch[2].x+((i^3)*toch[3].x);
        //y_temp=((1-i)^3)*toch[0].y+(3*i*(1-i)^2)*toch[1].y+(3*(i^2)*(1-i))*toch[2].y+((i^3)*toch[3].y);
        double t=i;
        double t2=1-i;
 
        //x_temp=((pow(t2,3))*x1)+(3*(pow(t2,2))*x2)+(3*t2*(pow(t,2))*x3)+((pow(t,3))*x4);
        //y_temp=((pow(t2,3))*y1)+(3*(pow(t2,2))*y2)+(3*t2*(pow(t,2))*y3)+((pow(t,3))*y4);
 
        x_temp=(pow(t2,3)*x1)+(3*pow(t2,2)*x2)+(3*t2*pow(t,2)*x3)+(pow(t,3)*x4);
        y_temp=(pow(t2,3)*y1)+(3*pow(t2,2)*y2)+(3*t2*pow(t,2)*y3)+(pow(t,3)*y4);
 
 
        if(points2[num].x!=x_temp)
        {
            points2[num].x=int(x_temp);
            points2[num].y=int(y_temp);
            num++;
        }
 
 
    }
    */
 
 
    //float i=0.05;
    //x_temp=(1-i)^3*x1+3*(1-i)^2*x2+3*(1-i)*i^2*x3+i^3*y4;
    //y_temp=(1-i)^3*y1+3*(1-i)^2*y2+3*(1-i)*i^2*y3+i^3*y4;
    //Memo2->Lines->Add(IntToStr(x_temp) + "|" + IntToStr(y_temp));
 
 
    /*
    double t=0.05;
    double t2=1-0.5;
    x_temp=(pow(t2,3)*x1)+(3*pow(t2,2)*x2)+(3*t2*pow(t,2)*x3)+(pow(t,3)*x4);
    x_temp=int(x_temp);
    y_temp=(pow(t2,3)*y1)+(3*pow(t2,2)*y2)+(3*t2*pow(t,2)*y3)+(pow(t,3)*y4);
    y_temp=int(y_temp);
    */
 
 
    double t=0.05;
    double t2=1-0.05;
    //x_temp=(pow(t2,3)*x1)+(3*pow(t2,2)*x2)+(3*t2*pow(t,2)*x3)+(pow(t,3)*x4);
    double temp1=pow(t2,3);
    double temp2=3*pow(t2,2);
    double temp3=3*t2*pow(t,2);
    double temp4=pow(t,3);
    x_temp=temp1*x1+temp2*x2+temp3*x3+temp4*x4;
    x_temp=int(x_temp);
    //y_temp=(pow(t2,3)*y1)+(3*pow(t2,2)*y2)+(3*t2*pow(t,2)*y3)+(pow(t,3)*y4);
    temp1=pow(t2,3);
    temp2=3*pow(t2,2);
    temp3=3*t2*pow(t,2);
    temp4=pow(t,3);
    y_temp=temp1*y1+temp2*y2+temp3*y3+temp4*y4;
    y_temp=int(y_temp);
    Image1->Canvas->MoveTo(toch[0].x,toch[0].y);
    Image1->Canvas->LineTo(x_temp,y_temp);
    //Image1->Canvas->PolyBezier(toch,4);
 
    /*
    double t=0.05;
    double t2=1-0.5;
    //x_temp=(pow(t2,3)*x1)+(3*pow(t2,2)*x2)+(3*t2*pow(t,2)*x3)+(pow(t,3)*x4);
    double temp1=(x1*pow(t2,3));
    double temp2=(x2*t*pow(t2,2));
    double temp3=(x3*pow(t,2)*t2);
    double temp4=(x4*pow(t,3));
    x_temp=temp1+temp2+temp3+temp4;
    x_temp=int(x_temp);
    //y_temp=(pow(t2,3)*y1)+(3*pow(t2,2)*y2)+(3*t2*pow(t,2)*y3)+(pow(t,3)*y4);
    temp1=(y1*pow(t2,3));
    temp2=(y2*t*pow(t2,2));
    temp3=(y3*pow(t,2)*t2);
    temp4=(y4*pow(t,3));
    y_temp=temp1+temp2+temp3+temp4;
    y_temp=int(y_temp);
    Image1->Canvas->MoveTo(toch[0].x,toch[0].y);
    Image1->Canvas->LineTo(x_temp,y_temp);
    */
 
}
Точки я беру от сюда:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
    Memo1->Lines->Add("(X: " +  IntToStr(X) + " Y: " +  IntToStr(Y) + ")");
 
    if (number_t<=3) {
        toch[number_t].x=X;
        toch[number_t].y=Y;
        Image1->Canvas->Ellipse(toch[number_t].x-3, toch[number_t].y-3, toch[number_t].x+3, toch[number_t].y+3);
        number_t++;
    }
    //toch[0].x=X; toch[0].y=Y;
}
У меня на всякий случай имеется кнопка для очистки этого добра, что бы нарисовать вторую часть картинки.

Ну и шапка естественно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct cord
    {
    int x;
    int y;
    };
struct tochki3
    {
    int x;
    int y;
    };
cord toch[3];
tochki3 points2[900];
int number_t=0;
double x_temp=0,y_temp=0;
Структура точки это была вторая стуктура в которую я хотел занести просчитанные по формуле точки, но я не понял зачем это делать.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.03.2016, 18:34
Ответы с готовыми решениями:

Кривая Безье
Добрый день, подскажите пожалуйста, как реализовать отрисовку Кривых Безье. Нашел кучу теории, но...

Кривая Безье
Вооружился статейкой на википедии...

Кривая Безье на основе N точек
Доброго времени суток! Вопрос такой, существует n(допустим 500) точек, по ней нужно построить...

Кривая Безье в сплайн Безье
Здравствуйте. Я по специальности программист и мне нужно генерировать замкнутую кривую не...

1
случайный прохожий
2056 / 1325 / 456
Регистрация: 20.07.2013
Сообщений: 3,694
02.03.2016, 21:47 2
http://algolist.manual.ru/grap... besier.php
C++
1
  DrawBezier(Image, 10, 10, 550, 50, 800, 600, 1000);
Правда, рисуется по трем точкам (две совмещены), но, думаю, вполне реально изменить код, добавив использование 4-ой точки.
Миниатюры
Кривая Безье по 4 точкам  
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.03.2016, 21:47
Помогаю со студенческими работами здесь

кривая безье
формула вторая праизводна для кривой безье хач у

Кривая Безье
Создать функцию, которая на входе принимает опорные узлы в формате (x,y) и их количество n. Число n...

Кривая Безье.
Помогите понять как нарисовать кривую Безье(по 3м точкам) на JavaScript. Или дайте код я сам...

Кривая Безье
Нужно написать программу, в которой осуществляется ввод с консоли трёх пар целочисленных значений...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru