Форум программистов, компьютерный форум CyberForum.ru

Построение графиков элементарных функций - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 161, средняя оценка - 4.93
fcrCullen93
1 / 1 / 0
Регистрация: 25.01.2011
Сообщений: 12
06.10.2011, 12:50     Построение графиков элементарных функций #1
У меня есть код, который выводит график функции тангенс х, помогите изменить его так, чтобы выводило график lnx

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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#define _WIN32_WINNT 0x0501
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <windows.h>
 
using namespace std;
 
const double Pi = 3.14159265;
 
BOOL Line(HDC hdc, int x1, int y1, int x2, int y2){
    MoveToEx(hdc, x1, y1, NULL); 
    return LineTo(hdc, x2, y2);
} 
 
string makeLine(int n){
    string str = "";
    for (int i = 0; i < n; i++){
        str+="-";
    }
    return str;
}
 
 
int main(){
    system ("color f0");
    cout << makeLine(19);
    printf("\n| x\t|y=tanh(x)|\n");
    cout << makeLine(19);   
    for (float x = -Pi+0.3f; x <= Pi; x+=1.0f) {        
        printf("\n|");
        if (x > 0)
            printf(" ");
        printf("%.2f\t|", x);
        if (tanh(x) > 0) 
            printf(" ");
        printf("%.2f\t  |", tanh(x));
            
    }
 
    //printf("\n| %.2f\t|%.2f\t  |", Pi, tanh(Pi)); 
    cout << "\n" << makeLine(19);
 
    int x = 400;
    int y = 200;
    double a = 1;
    int b = 2;
    
cout << '\t';
cout << '\t';
cout << '\t';
cout << '\t';
cout << '1';
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << '\t';
cout << '\t';
cout << '\t';
cout << '\t';
cout << "          - 1";
cout << '\t';
cout << '0';
cout << "       1";
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
 
 
cout << '\t';
cout << '\t';
cout << '\t';
cout << '\t';
cout << '\t';
cout << '\t';
cout << "-1";
    //srand ( time(NULL) );
    HWND hWnd = GetConsoleWindow();
    HDC hDc = GetDC(hWnd);
    
    COLORREF color = RGB(0,0,0);
    HPEN pen = CreatePen(PS_SOLID,1,color);
    SelectObject(hDc,pen);
    Line(hDc,x,0,x,2*y);
    Line(hDc,100,y,2*x,y);
 
    
    COLORREF c2 = color;
    SetPixel(hDc,x+1,2,color);
    SetPixel(hDc,x+2,3,color);
    SetPixel(hDc,x+3,4,color);
 
    SetPixel(hDc,x-1,2,color);
    SetPixel(hDc,x-2,3,color);
    SetPixel(hDc,x-3,4,color);
 
    SetPixel(hDc,2*x - 2,y - 1,color);
    SetPixel(hDc,2*x - 3,y - 2,color);
    SetPixel(hDc,2*x - 4,y - 3,color);
 
    SetPixel(hDc,2*x - 2,y + 1,color);
    SetPixel(hDc,2*x - 3,y + 2,color);
    SetPixel(hDc,2*x - 4,y + 3,color);
    for(int i = 100; i < 600; i+=50){
        Line(hDc,i,y-2,i,y+2);
    }
    for(int i = 0; i < y*2; i+=45){
        Line(hDc,x-2,i+19,x+2,i+19);
    }
    for (int i = 100; i < 800; i+= 4) {
        Line(hDc,i,110,i+2,110);
    }
    for (int i = 100; i < 800; i+= 4) {
        Line(hDc,i,290,i+2,290);
    }
    for(double x1 = -250; x1 < 250; x1++){
        double y1 = tanh(x1/100.0) * 90;
        SetPixel(hDc, x1 + x, y - y1, color);
    }
 
    int xD;
    cin >> xD;
    
    ReleaseDC(hWnd, hDc);
    return 0;   
}
 Комментарий модератора 
Используйте теги форматирования кода!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2011, 12:50     Построение графиков элементарных функций
Посмотрите здесь:

C++ Построение графика функций
Печать значений элементарных функций по формуле Тейлора! C++
построение графиков в С++ C++
Как инвертировать ось у в построение графиков C++
C++ Построение графиков в окошке
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
06.10.2011, 16:49     Построение графиков элементарных функций #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Я привожу код строящий cos(x), используя всю плоскость окна консоли(для этого снабдил проект функциями масштабирования). Думаю подогнать под проект труда не составит
Код программы
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
107
108
109
#include <windows.h>
#include <stdio.h>
#include <math.h>
 
#define RED RGB(255,0,0)
#define GRN RGB(0,255,0)
#define BLU RGB(0,0,255)
 
#define BLK RGB(0,0,0)
#define WHT RGB(255,255,255)
 
HPEN  getPen(int iPEN_STYLE, int iPEN_SIZE, int iCOLORREF);
BOOL  SetPoint(HDC hDC, HPEN hPen, COORD PNT);
BOOL  PlotLine(HDC hDC, HPEN hPen, COORD BGN, COORD END);
//Функция график которой строим
double f(double x){return cos(x);}
double * mf(double a, double b, double n)
{
    double x = a;
    double h = (b - a)/n;
    double vec[2];
    vec[0] = f(a);
    vec[1] = f(a);
    while(x < b)
    {
        if(vec[1] < f(x))
            vec[1] = f(x);
        if(f(x) < vec[0])
            vec[0] = f(x);
        x += h;
    }
    return &vec[0];
}
 
int main()
{
    long n;
    double a = 0, b = 0,x, dx, *vec;
    double CX, CY;
    
    HWND    hWnd = GetForegroundWindow();
    HPEN    RPEN = getPen(PS_SOLID, 2, RED);
    HPEN    GPEN = getPen(PS_SOLID, 2, GRN);
    HPEN    BPEN = getPen(PS_SOLID, 2, BLU);
    HPEN    WPEN = getPen(PS_SOLID, 3, WHT);
    RECT    pRECT= {0};
    COORD   BGN  = {0};
    COORD   END  = {0};
    GetClientRect(hWnd,&pRECT);
    
    HDC hDC = GetWindowDC(hWnd);
 
    printf("\tPloting f(x) = ln(x)\r\n");
    printf("Enter diapasone [a;b]\r\n");
    printf("a = ");scanf("%lf",&a);
    printf("b = ");scanf("%lf",&b);
    printf("Enter number of points\r\n");
    printf("n = ");scanf("%u",&n);
    vec = mf(a, b, n);//Нужно знать макс и мин для масштабирования
    if(hDC)
    {
        CX = (b - a)/(pRECT.right - pRECT.left);
        CY = (vec[1] - vec[0])/(pRECT.bottom - pRECT.top);
        
        x = a;dx = (b - a)/n;
        BGN.X = x   /CX;
        BGN.Y = f(x)/CY + (pRECT.bottom - pRECT.top)/2;
        SetBkMode(hDC,TRANSPARENT);
        SetPoint (hDC, WPEN, BGN);
        while(x < b)
        {
            END.X = x   /CX;
            END.Y = f(x)/CY + (pRECT.bottom - pRECT.top)/2;
            PlotLine(hDC, RPEN, BGN, END);
            SetPoint (hDC,WPEN, END);
            BGN = END;
            x += dx;
        }
    }
    system("pause");
    return 0;
}
 
HPEN getPen(int iPEN_STYLE, int iPEN_SIZE, int iCOLORREF)
{
        return CreatePen(iPEN_STYLE, iPEN_SIZE, iCOLORREF);
}
 
BOOL SetPoint(HDC hDC, HPEN hPen, COORD PNT)
{
        EXTLOGPEN pINFO;
        GetObject(hPen,sizeof(EXTLOGPEN),&pINFO);
        SelectObject(hDC,hPen);
        return Ellipse
        (
                hDC,
                PNT.X - pINFO.elpWidth,
                PNT.Y + pINFO.elpWidth, 
                PNT.X + pINFO.elpWidth,
                PNT.Y - pINFO.elpWidth
        );
}
 
BOOL PlotLine(HDC hDC, HPEN hPen, COORD BGN, COORD END)
{
        SelectObject(hDC,hPen);
        MoveToEx(hDC,BGN.X,BGN.Y,NULL);
        return LineTo(  hDC,END.X,END.Y);
}
Миниатюры
Построение графиков элементарных функций  
-=ЮрА=-
Заблокирован
Автор FAQ
06.10.2011, 17:01     Построение графиков элементарных функций #3
PS: Для построения f(x) = ln(x) в моём коде достаточно провести такую замену
C++
1
double f(double x){return log(x);}
Только диапазон построения нужно с умом выбирать!

Не по теме:

помним что в точке х=0 ln(0) - НЕОПРЕДЕЛЁН и об ОДЗ ln(x) нужно помнить т.е. x > 0

Миниатюры
Построение графиков элементарных функций  
Артёмий
0 / 0 / 0
Регистрация: 11.06.2012
Сообщений: 3
12.06.2012, 00:58     Построение графиков элементарных функций #4
-=ЮрА=-, не поминаю как построить можешь пожалуйста сделать весь код программы синусоиды
-=ЮрА=-
Заблокирован
Автор FAQ
12.06.2012, 07:11     Построение графиков элементарных функций #5
Цитата Сообщение от Артёмий Посмотреть сообщение
-=ЮрА=-, не поминаю как построить можешь пожалуйста сделать весь код программы синусоиды
Артемий, ты пробовал нажать мышкой на эту надпись?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Код программы
Миниатюры
Построение графиков элементарных функций  
t668
0 / 0 / 0
Регистрация: 14.05.2013
Сообщений: 7
04.06.2013, 09:28     Построение графиков элементарных функций #6
надо написать программу построения графика функции cos x^2 на вижуал 10-12 С++
-=ЮрА=-
Заблокирован
Автор FAQ
04.06.2013, 09:37     Построение графиков элементарных функций #7
t668, ты вообще чтоли безрукий?
вот эту строку
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
double f(double x){return cos(x);}
- запиши вот так
double f(double x){return pow(cos(x), 2.0);}
- и всё больше ничего трогать не надо.

Не по теме:

Чертовски злит и убивает, когда человек даже в таком примитиве не способен разобраться

t668
0 / 0 / 0
Регистрация: 14.05.2013
Сообщений: 7
16.06.2013, 18:43     Построение графиков элементарных функций #8
А диапазон построения какой?
-=ЮрА=-
Заблокирован
Автор FAQ
16.06.2013, 19:00     Построение графиков элементарных функций #9
Цитата Сообщение от t668 Посмотреть сообщение
А диапазон построения какой?
- любой который введёшь, даже ввод сделан
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
printf("\tPloting f(x) = ln(x)\r\n");
* * printf("Enter diapasone [a;b]\r\n");
* * printf("a = ");scanf("%lf",&a);
* * printf("b = ");scanf("%lf",&b);
* * printf("Enter number of points\r\n");
* * printf("n = ");scanf("%u",&n);
- что ещё можно пояснять?
t668
0 / 0 / 0
Регистрация: 14.05.2013
Сообщений: 7
16.06.2013, 19:31     Построение графиков элементарных функций #10
просто при вводе станд
0.0001
6
20, выводит не cos x во2

и ещё

написанный на С?
-=ЮрА=-
Заблокирован
Автор FAQ
16.06.2013, 21:07     Построение графиков элементарных функций #11
Цитата Сообщение от t668 Посмотреть сообщение
просто при вводе станд
0.0001
6
20, выводит не cos x во2
- а 6 и 20 ты вводишь как градусы?Ввод сделан под радианы, 6 градусов это PI*6/180 = PI/30 радиан
t668
0 / 0 / 0
Регистрация: 14.05.2013
Сообщений: 7
16.06.2013, 21:28     Построение графиков элементарных функций #12
посоветуйте лучший вариант
a =
b =

n =
-=ЮрА=-
Заблокирован
Автор FAQ
16.06.2013, 21:39     Построение графиков элементарных функций #13
0
6,28
50
monk22092011
0 / 0 / 0
Регистрация: 20.11.2013
Сообщений: 37
21.11.2013, 23:33     Построение графиков элементарных функций #14
[QUOTE=-=ЮрА=-;4729905] прости пожалуйста, а можно как то твой код в класс вкинуть?
что нужно добавить?..

Добавлено через 7 минут
прости пожалуйста, а можно как то твой код в класс вкинуть?
что нужно добавить?..
-=ЮрА=-
Заблокирован
Автор FAQ
22.11.2013, 21:02     Построение графиков элементарных функций #15
Сделай функции из кода методами класса, перменные из кода сделай его полями.
monk22092011
0 / 0 / 0
Регистрация: 20.11.2013
Сообщений: 37
24.11.2013, 22:53     Построение графиков элементарных функций #16
а ты не мог бы помочь мне с этим?
если не трудно, пожалуйста
я не очень понимаю этот язык
f1ff
13 / 13 / 8
Регистрация: 11.04.2015
Сообщений: 64
22.04.2015, 22:21     Построение графиков элементарных функций #17
-=ЮрА=-, помоги, пожалуйста, исправить эту процедуру.
Надо чтобы график y=x^2 был плавным.

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
LRESULT CALLBACK WndProc(HWND hWnd,  UINT iMsg,  WPARAM wParam,  LPARAM lParam)
{
    HDC             hDC;
    PAINTSTRUCT     ps;
 
    static Point    center;
    static int      cxClient,  cyClient;
    const double    scale = 2;  
 
    
    switch (iMsg)
    {
        case WM_SIZE:
            cxClient = LOWORD(lParam);
            cyClient = HIWORD(lParam);
 
            center.x = cxClient/2;
            center.y = cyClient/2;
 
            return 0;
 
 
        case WM_PAINT:
            hDC = BeginPaint(hWnd, &ps);
 
            // Ось X
            MoveTo(hDC, 0, cyClient/2);
            LineTo(hDC, cxClient, cyClient/2);
 
            // Ось Y
            MoveTo(hDC, cxClient/2, 0);
            LineTo(hDC, cxClient/2, cyClient);
            
            // Рисуем y = x^2
            // Правая ветвь
            MoveTo(hDC, center.x, center.y);
            for (int x=center.x;  x<cxClient;  ++x)
            {
                LineTo(hDC, x, center.y - (x-center.x)*(x-center.x) );
            }
 
            // Левая ветвь
            MoveTo(hDC, center.x, center.y);
            for (int x=center.x;  x>=0;  --x)
            {
                LineTo(hDC, x, center.y - (center.x-x)*(center.x-x) );
            }
 
 
            EndPaint(hWnd, &ps);
            return 0;
 
 
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
 
 
    return DefWindowProc(hWnd, iMsg, wParam, lParam);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2015, 18:59     Построение графиков элементарных функций
Еще ссылки по теме:

C++ Подбор графиков функций по эскизу
Построение графиков по массивам данных C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
23.04.2015, 18:59     Построение графиков элементарных функций #18
Цитата Сообщение от f1ff Посмотреть сообщение
for (int x=center.x; *x<cxClient; *++x)
- шаг единица потому и неплавно, сделай шаг хотя бы 0,1
Yandex
Объявления
23.04.2015, 18:59     Построение графиков элементарных функций
Ответ Создать тему
Опции темы

Текущее время: 02:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru